230726 PasswordEncoder.matches()

보트·2023년 7월 26일
0

Spring

목록 보기
22/27

PasswordEncoder.matches()

문제

String password = passwordEncoder.encode(requestDto.getPassword());
String confirmPassword = passwordEncoder.encode(requestDto.getConfirmPassword());

if(!passwordEncoder.matches(password, confirmPassword)) {
      throw new IllegalArgumentException("비밀번호를 다시 확인해주세요.");
}

시도

  1. 둘 다 암호화 되어있어서 받아온 password 값과 confirmPassword 값은 항상 다를 수 밖에 없다는 것을 깨달았다.
String confirmPassword = requestDto.getConfirmPassword();

confirmPassword는 저장할 데이터가 아니기 때문에 이 값을 암호화하지 않은 채로 가져왔다.

하지만 여전히 matches 함수는 false값이 나왔다.

  1. PasswordEncoder.matches()는 Spring Security Java에서 제공하는 메서드이다.
    이 함수는 암호화 된 비밀번호와 평문의 비밀번호가 일치하는지 확인할 때 사용된다.
boolean matches(CharSequence rawPassword, String encodedPassword);
  • rawPassword : 평문
  • encodedPassword : 암호화된 비밀번호

matches() 메서드의 첫 번째 인자는 평문이어야 한다.

해결

String password = passwordEncoder.encode(requestDto.getPassword());
String confirmPassword = requestDto.getConfirmPassword();

if(!passwordEncoder.matches(confirmPassword, password)) {
      throw new IllegalArgumentException("비밀번호를 다시 확인해주세요.");
}

confirmPassword는 requestDto에서 평문 상태 그대로 가져오고 matches 메서드의 첫 번째 인자로 넣었다.

알게된 점

PasswordEncoder 인터페이스에는

String encode(CharSequence rawPassword);
boolean matches(CharSequence rawPassword, String encodedPassword);
default boolean upgradeEncoding(String encodedPassword) {
		return false;
	}

세 가지 메서드가 있다.

matches 메서드에는 평문 비밀번호, 암호화된 비밀번호 순서대로 들어가야 한다.

profile
일주일에 한 번

0개의 댓글