Spring Security 5.0 이전 버전의 기본 PasswordEncoder는 일반 텍스트 암호만 필요한 NoOpPasswordEncoder이다. 반면 Spring Security 5.0 이후 버전의 기본 PasswordEncoder는 DelegatingPasswordEncoder이다. 이는 아래와 같은 형식을 요구한다.
{id}encodedPassword
기존의 암호화된 비밀번호를 DelegatingPasswordEncoder에서 사용할 수 있게 하는 방법은 암호화된 비밀번호 앞에 {id}를 붙여주는 것이다.
PasswordEncoder 종류에 따른 id
1. NoOpPasswordEncoder {noop}
2. BCryptPasswordEncoder {bcrypt}
3. SCryptPasswordEncoder {scrypt}
4. Pbkdf2PasswordEncoder {pbkdf2}
5. StandardPasswordEncoder {sha256}
필자는 BCryptPasswordEncoder를 사용하므로 암호화된 비밀번호 앞에 {bcrypt}를 더해준다.
회원가입 메소드
@Override
public Member saveMember(Member member) {
log.info("Saving new member {} to the database", member.getName());
member.setPassword("{bcrypt}"+passwordEncoder.encode(member.getPassword()));
Member saved = memberRepo.save(member);
return saved;
}
비밀번호 변경 메소드
@Override
public Member changePassword(Long id, String checkPassword, String newPassword, String newPassword2) {
Member member = memberRepo.findById(id).orElseGet(() -> {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "회원 정보가 존재하지 않습니다.");
});
//기존 비밀번호가 같은지 확인
if (passwordEncoder.matches(checkPassword, member.getPassword().substring(8))) {
//비밀번호 재설정
//새로운 비밀번호 두 개가 같은지 확인
if(newPassword.equals(newPassword2)) {
member.setPassword("{bcrypt}"+passwordEncoder.encode(newPassword));
memberRepo.save(member);
return member;
} else{
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "비밀번호 두 개가 다릅니다.");
}
} else{
throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "비밀번호가 틀립니다.");
}
}