[TIL] PasswordEncoder matches 함수

AlBan·2021년 5월 5일
0

TIL

목록 보기
3/6

Spring security를 사용 할 때, 패스워드를 인코딩하기 위해 PasswordEncdoer 클래스를 사용하게 된다.

더해서 개인화된 인증 로직을 구현하기 위해 AuthenticationManagerAbstractAuthenticationProcessingFilter를 상속받아 컴포넌트를 구현하게 된다.

이때 패스워드를 인증하는 로직이 필요한데 DB에 저장된 패스워드는 PasswordEncoder를 통해 인코딩된 문자열이고, Http의 파라미터로 전달되는 데이터는 원본 문자열인데 이를 PasswordEncdoer로 인코딩해 DB에 저장된 값과 비교할때 일치하지 않는 문제가 발생한다.

  • 원본 문자열 : 1234
  • DB에 저장된 해시처리된 원본 문자열 : $2a$10$j799cCVx1SUMl1WeAK72PufMWGgW2RyxAkYOq/wB75tx7c50GgCMa
  • encode(password);를 통해 인코딩한 문자열 : $2a$10$aHNgzU.kISAnHEGpznVA..9iPi6PogpQl8k0UfymVg3f/2qfgw4c.

이렇듯 매번 encode 메서드를 통해 문자열을 인코딩할 때마다 결과물은 항상 달라진다. 그래서 단순히 문자열을 비교하는 메서드인 equls()를 사용하면 로직이 원하는 대로 작동하지 않는다.

이 때, 사용할 수 있는 방법이 PasswordEncoder클래스에서 제공하는 matches()를 사용하면 된다

public boolean isMatches(String inDBPwd, String inputPwd){
	boolean b = inDBPwd.equals(passwordEncoder.encode(inputPwd);
 	System.out.println(b);    	// true
	boolean b = passwordEncoder.matches(inDBpwd, inputPwd); 
	System.out.println(b);    	// false
}

위 코드를 보면 한가지 더 알 수 있는 사실이 있는데, DB에 저장되어있는 해시 처리된 문자열과 비교하는 문자열은 해시처리를 한 후 비교하는 것이 아니라 해시처리 하기 전의 원본 문자열을 인자로 넣어주어야 한다는 것이다.

profile
[Spring, React를 공부하는 끈질긴 개발자 지망생] 잊어버리지 않도록! 정리 또 정리!

0개의 댓글