개발하는 자몽

[Spring Security] BCryptPasswordEncoder 본문

Java/Spring

[Spring Security] BCryptPasswordEncoder

jaamong 2023. 1. 2. 13:02

BCryptPasswordEncoder는 BCrypt 해싱함수(BCrypt Hashing Function)를 사용해서 비밀번호를 암호화(encode)한다. 

 

아래 코드는 값을 받아서 사용자를 생성한다. 이때 비밀번호는 BCryptPasswordEncoder를 사용하여 암호화하고 DB에 저장한다.

@RequiredArgsConstructor
@Service
public class UserService {

    private final UserRepository userRepository;

    public SiteUser create(String username, String email, String password) {

        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();

        SiteUser user = SiteUser.builder()
                                .username(username)
                                .email(email)
                                .password(encoder.encode(password)) //암호화
                                .build();

        userRepository.save(user);
        return user;
    }
}

BCryptPasswordEncoder 객체를 생성하여 암호화하고자 하는 비밀번호에 사용하면 된다. 하지만 위와 같이 객체를 직접 new로 생성하는 방식보다는 빈(bean)으로 등록해서 사용하는 것이 좋다. 암호화 방식이 변경되면 BCryptPasswordEncoder를 사용한 모든 코드를 찾아서 수정해야 하기 때문이다. 즉 유지보수 측면에서 좋지 않고, 설계 측면에서도 OOP를 고려하지 않았다고 볼 수 있다. 

 

빈(bean)을 생성하는 방법은 @Configuration이 적용된 SecurityConfig에 @Bean 메서드를 생성하는 것이다. 아래와 같이 Security Config를 작성하자.

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    ...

    @Bean
    PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

PasswordEncoder는 BCryptPasswordEncoder의 인터페이스이다. 인터페이스로 빈을 등록해두면 암호화 방식이 바뀌더라도 return new 구현체(); 만 바꾸면 된다.

 

위와 같이 빈으로 등록하면 맨 처음에 작성한 코드를 아래와 같이 수정할 수 있다.

@RequiredArgsConstructor
@Service
public class UserService {

    private final UserRepository userRepository;
    private final PasswordEncoder encoder; //BCryptPasswordEncoder DI

    public SiteUser create(String username, String email, String password) {

        SiteUser user = SiteUser.builder()
                                .username(username)
                                .email(email)
                                .password(encoder.encode(password)) //암호화 적용
                                .build();

        userRepository.save(user);
        return user;
    }
}

 

 

 

 

 

 

참고

 

3-06 회원가입

* `[완성 소스]` : [https://github.com/pahkey/sbb3/tree/3-06](https://github.com/pahkey/sbb3/tree/3-06) …

wikidocs.net

 

Comments