[SpringBoot] 회원가입 서비스의 패스워드 암호화

2022. 9. 9. 14:03문제해결

개요

SpringBoot 기반으로 회원가입 서비스를 구현중 회원가입을 수행하면 데이터베이스에 패스워드 값이 그대로 노출되어 저장됩니다. 이 문제를 해결하기 위해서 데이터베이스에 저장하기 전에 패스워드를 암호화를 수행합니다.

 

의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-security'

 

SecurityConfig 클래스 정의

아래 코드에서 주목할 점은 빈으로 passwordEncoder를 설정한 점입니다. 빈으로 설정하였기 때문에 주입이 필요한 경우 @Autowired를 통해서 주입할 수 있습니다.

@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests() // 권한요청 처리 설정 메서드
                .antMatchers("/**","members/**", "/h2-console/**").permitAll()
                .antMatchers(HttpMethod.POST, "/members/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin().loginPage("/login").successForwardUrl("/")
                .and()
                .httpBasic(Customizer.withDefaults());
        return http.build();
    }

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        // static 디렉터리의 하위 파일 목록은 인증 무시 ( = 항상통과 )
        return (web) -> web.ignoring().antMatchers("/css/**", "/js/**", "/img/**", "/lib/**", "/h2-console/**");
    }

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

}

 

BCryptPasswordEncoder 객체를 통한 패스워드 암호화

다음 코드는 도메인 클래스인 Member 객체를 만들기 위해서 객체를 생성하는 코드입니다. 여기서 주목할 점은 MemberForm 객체의 password 필드 멤버를 암호화하기 위해서 BCryptPassowordEncoder 객체를 생성하고 암호화 하는 것을 볼 수 있습니다.

.password(passwordEncoder.encode(form.getPassword()))
    public static Member createMember(MemberForm form){
        PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        Member member = Member.builder()
                              .name(form.getName())
                              .birthday(form.getBirthday())
                              .phone(form.getPhone())
                              .address(new Address(form.getZipcode(), form.getStreet(), form.getDetail()))
                              .email(form.getEmail())
                              .userId(form.getUserId())
                              .password(passwordEncoder.encode(form.getPassword()))
                              .gender(form.getGender())
                              .build();
        return member;
    }

 

실행결과

다음 그림은 회원가입을 수행하고 데이터베이스에 암호화가 되었는지 확인한 결과입니다.

위 실행결과를 보면 회원가입한 회원의 패스워드가 암호화된 것을 볼 수 있습니다.

 

References

source code : https://github.com/yonghwankim-dev/spring_movie