📘BCryptPasswordEncoder 사용하여 비밀번호 암호화 기능 구현
BCryptPasswordEncoder 는 Spring Security 에서 제공하는 비밀번호 암호화 기능이다.//기능 전체를 사용하고 싶다면 이 구문을 추가한다.(보안 및 인증/인가 기능이 활성화된다.)
implementation 'org.springframework.boot:spring-boot-starter-security'
//개발단계에서 암호화만 사용하고 싶다면 이 구문만 추가해준다.
implementation 'org.springframework.security:spring-security-crypto'
BCryptPasswordEncoder를 Bean으로 등록하는 설정을 위해 클래스를 만들어준다.Configuration 으로 Spring 설정 클래스로 만들어주고 메서드는 Bean으로 등록해준다.@Configuration
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
PasswordEncoder 인터페이스를 활용하여 비밀번호를 암호화 및 확인해주는 클래스를 생성한다.encode() 는 비밀번호를 BCrypt 형식으로 암호화를 시켜준다.matches() 는 입력받은 문자열을 암호화된 문자열과의 일치여부를 확인해준다.matches() 를 사용할때 첫번째 파라미터는 암호화되지 않은 문자열(ex:password123)을 넣어주고, 두번째 파라미터에는 암호화된 문자열을 넣어줘야 한다.@Component
@RequiredArgsConstructor
public class PasswordManager {
private final PasswordEncoder passwordEncoder;
//암호화
public String encodePassword(String rawPassword){
return passwordEncoder.encode(rawPassword);
}
//암호화된 비밀번호와 입력한 비밀번호 확인
public boolean isPasswordMatch(String inputPassword, String encodedPassword){
return passwordEncoder.matches(inputPassword, encodedPassword);
}
}
signUp 메서드에 암호화 기능을 추가했다.@Transactional
public void signUp(SignUpRequestDto requestDto) {
//암호화 기능 추가
String encodedPassword = passwordManager.encodePassword(requestDto.getPassword());
User user = new User(requestDto.getUsername(), requestDto.getEmail(), encodedPassword);
try {
userRepository.save(user);
}catch (DataIntegrityViolationException e) {
throw new CustomException(HttpStatus.CONFLICT, "이미 존재하는 사용자입니다.");
}
}

Login 메서드에 isPasswordMatch 함수를 사용하여 암호화된 비밀번호가 매칭되는지 확인해준다.requestDto.getPassword() : 암호화 되지 않은 상태의 입력받은 비밀번호user.getPassword() : 암호화된 비밀번호public LoginResponseDto login(LoginRequestDto requestDto) {
User user = userRepository.findByEmail(requestDto.getEmail())
.orElseThrow((
)->new CustomException(HttpStatus.NOT_FOUND, "유저 정보가 없습니다."));
//암호화된 비밀번호 확인
if(!passwordManager.isPasswordMatch(requestDto.getPassword(), user.getPassword())){
throw new CustomException(HttpStatus.UNAUTHORIZED, "비밀번호가 일치하지 않습니다.");
}
return new LoginResponseDto(user.getId());
}
200 OK 와 함께 로그인 성공 메세지를 확인할 수 있다.