사용자의 비밀번호를 그대로 DB에 저장하면 보안상의 문제가 생길 수 있다.
때문에 그대로 저장하는게 아니라, 암호화를 한 후에 저장해야한다.
➡️ 비밀번호 암호화를 할 수 있는 PasswordEncoder 클래스를 만들어 암호화해보자!
먼저 gradle에 의존성을 추가해주어야한다
implementation 'at.favre.lib:bcrypt:0.10.2'
@Component
public class PasswordEncoder {
public String encode(String rawPassword) {
return BCrypt.withDefaults().hashToString(BCrypt.MIN_COST, rawPassword.toCharArray());
}
public boolean matches(String rawPassword, String encodedPassword) {
BCrypt.Result result = BCrypt.verifyer().verify(rawPassword.toCharArray(), encodedPassword);
return result.verified;
}
}
Member 회원가입할 때 입력받은 비밀번호를 암호화해야하므로, signUp 메서드에서 암호화를 해 레포지토리에 전달해주어야한다
private final PasswordEncoder passwordEncoder; 아까 만들어둔 암호화 클래스를 가져와주고
public SignUpResponseDto signUp(String name, String password, String email) {
String encodePassword = passwordEncoder.encode(password);//비밀번호 해쉬키로 암호화하기
Member member = new Member(name, encodePassword, email);
Member savedMember = memberRepository.save(member);
return new SignUpResponseDto(savedMember.getId(), savedMember.getName(), savedMember.getEmail());
};
컨트롤러에서 dto로 입력받았던 String password를 encodePassword로 변환해주자!!
→ .encode()
그리고 Member 객체를 생성할 때, 반드시 방금 만든 encodePassword를 저장!

포스트맨에서 201로 잘 실행되는 모습을 확인할 수 있고, DB에도 암호화된 값이 들어간다 👍
//회원가입된 회원이 맞는지 검증
public Member login(String email, String password) {
Optional<Member> member = Optional.ofNullable(memberRepository.findMemberdByEmail(email).orElseThrow(()
-> new CustomException(Errors.INVALID_LOGIN)));
if (passwordEncoder.matches(password, member.get().getPassword())) { //인코딩한 비번과 매칭해서 맞는지 확인하기
return member.get();
} else {
throw new CustomException(Errors.INVALID_LOGIN);
}
}
passwordEncoder.matches(password, member.get().getPassword())
matches() 메서드로 저장된 비번과 입력한 비번을 비교하면 T/F값이 나오게 된다!