Spring boot/Spring Security

BCryptPasswordEncoder란?

metamong-data 2024. 7. 15. 18:01
728x90
반응형

1. BCryptPasswordEncoder란?

스프링 시큐리티(Spring Seurity) 프레임워크에서 제공하는 클래스 중 하나로 비밀번호를 암호화하는 데 사용할 수 있는 메서드를 가진 클래스입니다.

  • BCryptPasswordEncoder는 BCrypt 해싱 함수(BCrypt hashing function)를 사용해서 비밀번호를 인코딩해주는 메서드와 사용자의 의해 제출된 비밀번호와 저장소에 저장되어 있는 비밀번호의 일치 여부를 확인해주는 메서드를 제공합니다.
  • PasswordEncoder 인터페이스를 구현한 클래스입니다.
  • 생성자의 인자 값(verstion, strength, SecureRandom instance)을 통해서 해시의 강도를 조절할 수 있습니다.

BCryptPasswordEncoder는 위에서 언급했듯이 비밀번호를 암호화하는 데 사용할 수 있는 메서드를 제공합니다. 기본적으로 웹 개발함에 있어서 사용자의 비밀번호를 데이터베이스에 저장하게 됩니다. 허가되지 않은 사용자가 접근하지 못하도록 기본적인 보안이 되어 있을 것입니다. 하지만 기본적 보안이 되어 있더라도, 만약 그 보안이 뚫리게 된다면 비밀번호 데이터는 무방비하게 노출됩니다. 이런 경우를 대비해 BCryptPasswordEncoder에서 제공하는 메서드를 활용하여 비밀번호를 암호화 함으로써 비밀번호 데이터가 노출되더라도 확인하기 어렵도록 만들어 줄 수 있습니다.

2. Method 구성

2.1 생성자

a. 기본 생성자:

BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
  • 기본 강도(10)로 인스턴스를 생성합니다.

b. 강도 지정 생성자:

BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(12);
  • 지정된 강도(여기서는 12)로 인스턴스를 생성합니다.

c. SecureRandom 지정 생성자:

SecureRandom random = new SecureRandom();
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(10, random);
  • 강도와 SecureRandom 인스턴스를 지정하여 생성합니다.

2.2 encode() 메서드

String encodedPassword = encoder.encode("rawPassword");
  • 주어진 raw 비밀번호를 BCrypt로 해싱합니다.
  • 매번 다른 솔트를 사용하여 같은 비밀번호도 다른 해시값을 생성합니다

2.3 matches() 메서드

boolean isMatch = encoder.matches("rawPassword", encodedPassword);
  • 입력된 raw 비밀번호와 저장된 인코딩된 비밀번호를 비교합니다.
  • 내부적으로 저장된 해시에서 솔트를 추출하고, 입력된 비밀번호를 같은 솔트로 해싱하여 비교합니다.

2.4 upgradeEncoding() 메서드:

boolean needsUpgrade = encoder.upgradeEncoding(encodedPassword);
  • 주어진 인코딩된 비밀번호가 현재 설정된 강도보다 낮은 강도로 인코딩되었는지 확인합니다.
  • true를 반환하면 해당 비밀번호를 새로운 강도로 다시 인코딩해야 함을 의미합니다.

3. 사용 예제

3.1. 실제 사용 예제:

  1. 사용자 등록 시:
  2. java Copy public void registerUser(String username, String rawPassword) { String encodedPassword = encoder.encode(rawPassword); userRepository.save(new User(username, encodedPassword)); }
  3. 로그인 검증 시:
  4. java Copy public boolean authenticateUser(String username, String rawPassword) { User user = userRepository.findByUsername(username); if (user == null) { return false; } return encoder.matches(rawPassword, user.getEncodedPassword()); }
  5. 비밀번호 업그레이드 확인:
  6. java Copy public void checkAndUpgradePassword(User user, String rawPassword) { if (encoder.matches(rawPassword, user.getEncodedPassword())) { if (encoder.upgradeEncoding(user.getEncodedPassword())) { String newEncodedPassword = encoder.encode(rawPassword); user.setEncodedPassword(newEncodedPassword); userRepository.save(user); } } }

3.2 Spring Security 설정에서의 사용:

java
Copy
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService)
            .passwordEncoder(passwordEncoder());
    }
}

이러한 메서드들을 적절히 사용하면 안전하게 비밀번호를 관리하고 검증할 수 있습니다.

728x90

'Spring boot > Spring Security' 카테고리의 다른 글

Authorize HttpServletRequests  (1) 2024.07.17
Password Storage  (0) 2024.07.17
Spring boot 3.x 이후 설정 코드  (0) 2024.07.16
Spring Security - JPA 연동하기  (0) 2024.07.15