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. 실제 사용 예제:
- 사용자 등록 시:
- java Copy public void registerUser(String username, String rawPassword) { String encodedPassword = encoder.encode(rawPassword); userRepository.save(new User(username, encodedPassword)); }
- 로그인 검증 시:
- 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()); }
- 비밀번호 업그레이드 확인:
- 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 |