Security BCrypt

Spring Security는 사용자 인증(로그인)시 비밀번호에 대해 단방향 해시 암호화를 진행하여 저장되어 있는 비밀번호와 대조한다. 따라서 회원가입 시 비밀번호 항목에 대해서 암호화를 진행해야한다.

 

Spring Security는 암호화를 위해  BCrypt Password Encoder를 제공하고 권장한다.

따라서 해당 클래스를 return하는 메소드를 만들어 @Bean으로 등록하여 사용하면 된다.

package com.gdy.springsecurity.Config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration //confinguration 컨테이너로 등록
@EnableWebSecurity
public class SecurityConfig {


    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{

        http.authorizeHttpRequests((auth) -> auth
                .requestMatchers("/", "/login").permitAll() //루트 경로에서 작업 진행
                .requestMatchers("/admin").hasRole("ADMIN")
                .requestMatchers("/my/**").hasAnyRole("ADMIN","USER")
                .anyRequest().authenticated()//위에서 처리하지 못한 경로들 처리하는 메소드
                );

        http
                .formLogin((auth) -> auth.loginPage("/login")
                        .loginProcessingUrl("/loginProc") //form에서 post로 보내는 action값
                        .permitAll()
                );

        http
                .csrf((auth)->auth.disable());

        return http.build();
    }
}

BCryptPasswordEncoder 메서드

 

String encode(CharSequence rawPassword)

패스워드를 암호화해주는 메소드로, 8바이트 이상의 무작위로 생성된 솔트와 결합된 SHA-1 이상의 해시를 적용

java.lang.CharSequence 타입의 패스워드를 매개변수로 입력해주면 암호화 된 패스워드를 String 타입으로 반환해준다.

 

해시시킬 때 무작위로 생성한 salt가 포함되므로 같은 비밀번호를 인코딩해도 매번 다른 결과값이 반환된다.

 

boolean mateches(CharSequence rawPassword, String encodedPassword)

제출된 인코딩 되지 않은 암호화 저장소에 있는 인코딩된 암호가 일치하는지 확인한다. 비밀번호가 일치하면 true를 반환하고 일치하지 않으면 false를 반환한다. 저장된 비밀번호 자체는 절대로 디코딩되지 않는다.

 

인코딩 시킬 때 마다 같은 암호도 매번 다른 결과가 나오기 때문에 로그인 등에서 사용자가 입력한 암호가 일치하는지 확인하려면 이 메소드를 사용해야 한다.

 

boolean upgradeEncoding(String encodedPassword)

더 나은 보안을 위해 인코딩된 암호를 다시 인코딩해야 하는 경우 true를 반환하고, 그렇지 않으면 false를 반환한다.

기본 구현은 항상 false를 반환한다.

 

해당 메소드는 기본적으로 항상 false를 반환하므로 필요하다면 오버라이딩 하여 encode된 암호의 안전성을 체크하는 로직을 구현해서 사용해야 한다.