우리가 웹사이트에 로그인 혹은 회원가입을 할 때 반드시 기입하는 정보 중 하나가 바로 "비밀번호" 이다. 문제는 이 비밀번호 데이터가 서버로 전송 될 때 아무런 암호화, 인코딩도 되지 않은 채로 평문으로 전송 될 경우 보안 측면에서 굉장히 취약점이 될 수 있다.
해킹 기법 중에 네트워크 상의 데이터 패킷을 몰래 훔쳐보는 공격 기법이 있는데 이를 sniffing 이라 부른다. 호시탐탐 사용자들의 개인정보를 노리는 해커들이 웹사이트로 흘러가는 데이터 패킷들을 sniffing 하여 데이터 정보를 까보는데 만일 비밀번호가 떡하니 그대로 적혀있으면 바로 개인 정보가 유출이 되는 셈이다.
그래서 이를 막기 위해 스프링 시큐리티에서는 비밀번호를 암호화 하는 기능을 제공하며 PasswordEncoder 라는 인터페이스가 이를 수행해준다.
encode() : 비밀번호를 지정된 암호화 방식으로 인코딩 한다.
matches() : 원본 비번 vs 인코딩된 비번을 비교하여 일치하는지 검사한다. 이때 원본을 인코딩하여 검사를 진행한다.
upgradeEncodeing() : 인코딩된 비번이 보안상의 이유로 다시 인코딩되어야 할 경우 true, 그렇지 않을 경우 false 반환한다.
{인코딩id} 형식의 접두사를 사용하여 비밀번호가 어떤 방식으로 인코딩되었는지 식별하는 클래스이다. (접두사 생략하면 기본으로 bcrypt 방식 적용)
ex)
1111->{bcrypt}#$@3223rf32g2223wwewddfr223@#$5ggsd@3gf
bcrypt 방식으로 인코딩 됨
여러 방식의 인코더들을 보관하고 있으며 접두사의 id 값을 추출한 다음, 해당 id 로 적절한 인코더를 찾아서 위임해준다.

본 포스트는
[스프링 시큐리티 완전 정복 6.x 개정판 를 보고 정리했습니다.