티스토리 뷰

☠️ Java

createDelegatingPasswordEncoder

James Wetzel 2024. 11. 2. 12:11
728x90
반응형

 

PasswordEncoderFactories.createDelegatingPasswordEncoder()

`PasswordEncoderFactories.createDelegatingPasswordEncoder()`는 Spring Security에서 제공하는 **동적 비밀번호 인코더**입니다. 
다양한 암호화 방식을 한 번에 지원할 수 있는 `DelegatingPasswordEncoder` 객체를 생성합니다.
이 객체는 여러 종류의 `PasswordEncoder`를 관리하고, 암호화 방식에 따라 적절한 `PasswordEncoder`를 선택하여 사용할 수 있도록 해줍니다.

### 동작 방식
`DelegatingPasswordEncoder`는 비밀번호에 특정 접두사를 붙여 암호화 방식을 나타냅니다. 기본적으로 `bcrypt` 알고리즘이 사용되며, 
다른 알고리즘을 사용할 경우에는 접두사를 붙여 지정할 수 있습니다. 
`createDelegatingPasswordEncoder()`는 기본적으로 다음과 같은 `PasswordEncoder`를 지원합니다:

- `{bcrypt}`: `BCryptPasswordEncoder`
- `{noop}`: 인코딩을 하지 않음 (`NoOpPasswordEncoder`)
- `{pbkdf2}`: `Pbkdf2PasswordEncoder`
- `{scrypt}`: `SCryptPasswordEncoder`
- `{sha256}`: `StandardPasswordEncoder`

비밀번호 앞에 `{암호화 알고리즘}`을 붙이면 `DelegatingPasswordEncoder`가 해당 인코더를 사용해 비밀번호를 처리합니다.

### 예시

1. **생성 및 사용**

```java
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.PasswordEncoder;

public class PasswordEncodingExample {

    public static void main(String[] args) {
        PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();

        // 비밀번호 인코딩
        String encodedPassword = passwordEncoder.encode("myPassword");
        System.out.println("Encoded Password: " + encodedPassword);

        // 비밀번호 매칭
        boolean matches = passwordEncoder.matches("myPassword", encodedPassword);
        System.out.println("Matches: " + matches);
    }
}
```

2. **인코딩 결과 예시**

```plaintext
Encoded Password: {bcrypt}$2a$10$E3T9z3Hr5bq3N5b2JNJ2pum8kDFadSg3Y...
```

`createDelegatingPasswordEncoder()`로 생성된 `PasswordEncoder`는 기본적으로 `bcrypt`를 사용하여 암호화하며, 
결과에는 `{bcrypt}` 접두사가 붙습니다.

3. **다양한 암호화 방식 사용**

```java
String bcryptPassword = "{bcrypt}$2a$10$...";
String noopPassword = "{noop}myPassword";

boolean matchesBcrypt = passwordEncoder.matches("myPassword", bcryptPassword);
boolean matchesNoop = passwordEncoder.matches("myPassword", noopPassword);
```

이처럼 `createDelegatingPasswordEncoder()`를 사용하면 **여러 암호화 방식의 비밀번호**를 쉽게 관리할 수 있으며, 
Spring Security가 기본 제공하는 인코딩 알고리즘들을 손쉽게 사용할 수 있습니다.
728x90
반응형