암호 처리

4.1. PasswordEncoder 계약의 이해

4.1.1. PasswordEncoder 계약의 정의

  • 인증 프로세스에서 암호가 유효한지 확인하는 역할

  • 아무도 읽을 수 없게 해시를 저장하는 것이 좋다.

    • encode()

    • matches()

  • upgradeEncoding()은 보안 향상을 위해 다시 인코딩 하는데 모호하기 때문에 비추천

4.1.2. PasswordEncoder 계약의 구현

  • 커스텀한 로직을 위해서라면 PasswordEncoder 인터페이스를 구현한다.

4.1.3. PasswordEncoder의 제공된 구현 선택

  • 직접 작성할 필요없이 구현된 걸 사용해도 된다.

  • NoOpPasswordEncoder

    • 일반 텍스트로 유지하기 때문에 실제에서는 쓰지 않는다.

  • StandardPasswordEncoder

    • SHA-256. 구식이기 때문에 사용하지 않는다.

  • BCryptPasswordEncoder

    • bcrypt 강력 해시 함수로 암호를 인코딩한다.

4.1.4. DelegationPasswordEncoder를 이용한 여러 인코딩 전략

  • PasswordEncoder의 한 구현

  • 자체 알고리즘 구현 대신 다른 구현 인스턴스에 작업을 위임한다.

    • ex. 접두사 {bcrypt}가 있으면 BCryptPasswordEncoder에 위임한다.

  • 현재 사용하는 알고리즘에서 취약성이 발견되어 기존값을 바꿔야 할 경우 사용할 수 있다.

인코딩, 암호화, 해싱

  • 인코딩

    • 주어진 입력에 대한 모든 변환

  • 암호화

    • (x, k) -> y

    • 출력을 얻기 위해 입력 값과 키를 모두 지정하는 특정한 유형의 인코딩

    • 암호화에 쓰는 키와 복호화에 쓰는 키가 같으면 대칭 키

    • 암호화와 복호화에 쓰는 키가 다르면 비대칭 키

      • (x, k1) -> y, (y, k2) -> x

      • k1이 공개 키, k2개 개인키

      • 따라서 개인키를 가지고 있으면 데이터를 복호화할 수 있다.

  • 해싱

    • 함수가 한 방향으로만 작동하는 특정한 유형의 인코딩

    • 따라서 y에서 x를 얻을 수 없다.

    • 솔트

      • 임의의 값을 추가해 함수를 더 강하게 만든다.

인터페이스 정리

  • UserDetails

    • 스프링 시큐리티가 관리하는 사용자

  • GrantedAuthority

    • 사용자에게 허용되는 작업

      • 읽기, 쓰기 등

  • UserDetailsService

    • 사용자 이름을 사용자 세부 정보를 검색한다.

  • UserDetailsManager

    • UserDetailsService의 더 구체적인 계약. 사용자 이름으로 검색 외에도 사용자 컬렉션이나 특정 사용자를 변경할 수도 있다.

  • PasswordEncoder

    • 암호를 암호화 또는 해시하는 방법과 비교하는 방법을 지정한다.

4.2. 스프링 시큐리티 암호화 모듈에 관한 추가 정보

  • 암호화 및 복호화 키 생성 기능은 자바에서 지원하지 않아 시큐리티에서 솔루션을 제공한다.

4.2.1. 키 생성기 이용

  • 해싱 및 암호화 알고리즘을 위한 키를 생성하는 객체

  • BytesKeyGenerator

  • String KeyGenerator

4.2.2. 암호화와 복호화 작업에 암호기 이용

  • 데이터를 암호화 및 복호화하는 객체

  • BytesEncryptor

  • TextEncryptor

Last updated

Was this helpful?