본문 바로가기
공부/Spring Security

PasswordEncoder 와 암호처리

by xladmt 2024. 12. 31.

 

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