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() 에서는 hashWitchSHA512() 메소드를 호출
- hashWithSHA512() 에서는 SHA-512 해싱 알고리즘을 기반으로 문자열을 변환
- 만약 MessageDigest에 잘못된 알고리즘이 입력되면 예외가 던져짐
[테스트]
기존에 존재하는 구현체들
- NoOpPasswordEncoder : 운영에서 절대 쓰면 안됨.
- StandardPasswordEncoder
- SHA-256 해싱 알고리즘 기반
- 복호화가 가능하기 때문에 운영 환경에서는 사용X
- Pbkdf2PasswordEncoder
- PBKDF2 알고리즘 사용
- 암호에 salt를 적용함 (솔팅: 암호에 추가되는 바이트 단위의 임의의 문자열)
- iterations 만큼 인코딩을 반복 수행함 (키 스트레칭이라고 함)
- 이 과정을 통해 암호를 더 풀기 어렵게 만드는 것
- DelegatingPasswordEncoder
- 앱 버전이 올라감에 따라 다른 유형의 PasswordEncoder를 적용해야 할 때
- 비즈니스 로직에 따라 특정 PasswordEncoder를 따로 설정해야 할 때
- 사용자에 따라 다른 PasswrodEncoder를 적용해야 할 때
- 다양한 방법이 존재하지만 DelegatingPasswordEncoder가 좋은 선택이 될 수 있음
- PasswordEncoder 인터페이스에 대한 구현체 중 하나로 자체 인코딩 알고리즘을 구현하는 대신 다른 구현체에 작업을 위임하는 역할을 함
- BCryptPasswordEncoder
- SCryptPasswordEncoder
'공부 > Spring Security' 카테고리의 다른 글
HTTP Basic 인증 방식 (0) | 2025.01.01 |
---|---|
UserDetails (0) | 2024.12.31 |
Spring Security 기본 구성 (0) | 2024.12.29 |
Spring Security 시작 (0) | 2024.12.29 |