본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
안녕하세요 :)
오늘은 챌린지 12일차로, 비가 주륵주륵 내리는 하루로 빨리 공부를 끝내고 이불콕 해야겠어요.
오늘 배울 내용은,
Part A. 로그인, 로그아웃, 회원가입으로 배워보는 스프링 시큐리티 기초
Ch 4. PasswordEncoder 와 암호 처리
"01. PasswordEncoder 살펴보기" 입니다.

오늘은 PasswordEncoder 의 전반적인 내용을 배웠다. 현재까지의 비밀번호는 예시의 간단함을 위해 평문으로 처리했었지만 보통은 암호화를 한다. 이를 위해서는 스프링 시큐리티의 PasswordEncoder 를 활용해야 한다.
PasswordEncoder 인터페이스를 통해 스프링 시큐리티에서 사용자 암호를 검증하는 방법을 알 수 있다. 인증 프로세스에서 암호가 유효한지 확인하는 과정을 거치고, 암호에 대한 인코딩을 수행할 수 있다. 인터페이스에는 두 개의 메소드와 하나의 default 메소드가 정의되어 있다.
encode(CharSequence rawPassword)는 주어진 암호의 해시를 제공하고, 암호화를 수행한다.
matches(CharSequence rawPassword, String encodedPassword)는 인코딩된 문자열이 원시 암호와 일치하는지 검증한다.
upgradeEncoding(CharSequence encodedPassword)는 기본적으로 false 를 반환하고, true를 반환하도록 메소드를 재정의하면 보안 향상을 위해 인코딩된 암호를 다시 인코딩 한다.
PasswordEncoder 구현체 만드는 방법에 대해서 알아보면,
matches()와 encode()는 서로가 결합이 되어 있기 때문에 두 메소드의 구현체는 기능상 서로 맞아야 하고, encode() 에서 반환된 인코딩 문자열은 matches()에서 검증이 가능해야 한다. 가장 간단한 구현체로는 예시에서 많이 봤던 NoOpPasswordEncoder 가 있다. 암호를 인코딩하지 않고 평문 그대로 사용한다.
SHA-512 해싱 알고리즘을 사용하는 PasswordEncoder 를 구현해보면,
먼저 matches() 에서는 문자열 비교로 검증하고, encode() 에서는 hashWithSHA512() 메소드를 호출한 뒤, hashWithSHA512() 에서는 SHA-512 해싱 알고리즘을 기반으로 문자열을 변환한다. 그리고 만약 MessageDigest 에 잘못된 알고리즘이 입력되면 예외가 던져진다.
참고로,
기존 스프링 시큐리티 자체적으로 제공하는 PasswordEncoder 의 구현체의 종류는 다음과 같다.
- NoOpPasswordEncoder
- StandardPasswordEncoder
- Pbkdf2PasswordEncoder
- BCryptPasswordEncoder
- SCryptPasswordEncoder