DelegatingPasswordEncoder의 장점
DelegatingPasswordEncoder는 비밀번호를 암호화 할 때 사용했던
PasswordEncoder 구현 객체를 생성해주는 컴포넌트다.
사용할 암호화 알고리즘을 지정하지 않으면 스프링 시큐리티가 권장하는
최신 암호화 알고리즘을 적용하여 패스워드를 암호화 해준다.
암호화 방식을 변경할 일이 생겨도 언제든 암호화 방식을 바꿀 수 있다.
(기존 암호화 된 패스워드에 대한 마이그레이션 필요)
커스텀 DelegatingPasswordEncoder 생성
PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
기존에는PasswordEncoderFactories의 createDelegatingPasswordEncoder 메서드를 사용하여
DelegatingPasswordEncoder 객체를 생성하여 다시 적절한 PasswordEncoder 객체를 생성했다.
String idForEncode = "bcrypt";
Map encoders = new HashMap<>();
encoders.put(idForEncode, new BCryptPasswordEncoder());
encoders.put("noop", NoOpPasswordEncoder.getInstance());
encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
encoders.put("scrypt", new SCryptPasswordEncoder());
encoders.put("sha256", new StandardPasswordEncoder());
PasswordEncoder passwordEncoder = new DelegatingPasswordEncoder(idForEncode, encoders);
하지만 위와 같이 DelegatingPasswordEncoder의 생성자로 키값과 맵 객체를 넘겨주면
해당 맵 객체에서 키에 해당하는 암호화 알고리즘을 적용할 수 있다.
스프링 시큐리티의 암호화 형식
데이터베이스에서 암호화 된 패스워드를 살펴보면
{암호화알고리즘}암호화된패스워드
{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
위와 같은 PasswordEncoder의 ID와 encodedPassword
형식으로 저장된 것을 볼 수 있다.
암호화 알고리즘
Plain Text
암호화하지 않은 텍스트 그 자체
반드시 암호화 하는 것이 좋다.
Hash
단방향 암호화
패스워드 같은 경우는 다시 복호화 할 필요가 없기 때문에
해시 알고리즘을 사용하는 것도 괜찮다.
MD5
단방향 암호화
MD2, MD4 해시 알고리즘의 결함을 보완한 알고리즘
다이제스트: 원본 메시지를 암호화한 메시지
SHA
MD5의 결함을 보완한 해시 알고리즘
해시된 문자열의 비트 값을 회전하면서 해시 처리를 함
Salt
알고리즘보다는 대응책에 가깝다.
원본 메시지에 임의의 문자열을 추가하여 해시 처리 함
PBKDF2, bcrypt, scrypt
솔트와 키 스트레칭, 메모리 오버헤드 등에
복잡한 알고리즘까지 더하여
복호화를 어렵게 하는 해시 알고리즘
'Back-End > Security' 카테고리의 다른 글
[스프링 시큐리티] 접근 제어 표현식 (0) | 2023.07.11 |
---|---|
[스프링 시큐리티] 인증 및 인가 처리 흐름 (0) | 2023.07.11 |
[스프링 시큐리티] 요청 처리 흐름 (0) | 2023.07.11 |
[스프링 시큐리티] 커스텀 로그인 인증 구현 (0) | 2023.07.11 |
[스프링 시큐리티] 커스텀 인증 처리 구현 (0) | 2023.07.11 |