Spring security를 사용 할 때, 패스워드를 인코딩하기 위해 PasswordEncdoer
클래스를 사용하게 된다.
더해서 개인화된 인증 로직을 구현하기 위해 AuthenticationManager
와 AbstractAuthenticationProcessingFilter
를 상속받아 컴포넌트를 구현하게 된다.
이때 패스워드를 인증하는 로직이 필요한데 DB에 저장된 패스워드는 PasswordEncoder
를 통해 인코딩된 문자열이고, Http의 파라미터로 전달되는 데이터는 원본 문자열인데 이를 PasswordEncdoer로 인코딩해 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에 저장되어있는 해시 처리된 문자열과 비교하는 문자열은 해시처리를 한 후 비교하는 것이 아니라 해시처리 하기 전의 원본 문자열을 인자로 넣어주어야 한다는 것이다.