DelegatingPasswordEncoder에 대한 실습 내용을 진행하던 중에 발견한 사실(?)에 대해서 적어보고자 한다.
DelegatingPasswordEncoder
는 Spring Security에서 지원하는 PasswordEncoder
구현 객체를 생성해주는 컴포넌트이다.
DelegatingPasswordEncoder 객체를 생성할 때 우리가 Map<String, PasswordEncoder>
로 PasswordEncoder 구현 객체들을 Map에 저장하고 특정 PasswordEncoder를 찾기 위한 키를 지정하여 애플리케이션에서 사용할 PasswordEncoder를 결정할 수 있다.
이 코드에서 마지막으로 passwordEncoder로 할당(?)한 것이 "sha256" 해싱 알고리즘을 사용한(?) passwordEncoder라고 생각했고,
passwordEncoder.matches("hello", passwordX);
부분으로 쭉 원본 비밀번호와 암호화된 비밀번호가 일치하는지 확인하는 문장에서 마지막 문장만 true일 것으로 예상했는데 전부 다 true가 나왔다.
그래서 코드를 뜯어봤는데
DelegatingPasswordEncoder
를 생성할 때 Map<String, PasswordEncdoer>
를 파라미터로 넘겨줘서 생성한게 DelegatingPasswordEncoder
의 idToPasswordEncoder
라는 필드에 할당이 되는 것을 확인했다.
DelegatingPasswordEncdoer
의 matches
메소드를 호출하게 되면 암호화된 password에 있는 prefix
를 문자열로 추출해서 idToPasswordEncoder
의 키로 조회한다.
그 후에 암호화된 password에 있는 suffix
부분부터 끝까지 잘라서 문자열로 반환하고 조회한 passwordEncoder
의 matches
메소드로 rawPassword
와 encodedPassword
를 파라미터로 넘겨줘서 검증한다.
그래서 결국 다 true가 나오는 것이 당연하다!