DelegatingPasswordEncoder란?
: PasswordEncoder 구현 객체를 생성해주는 컴포넌트
: 앱에서 사용할 PasswordEncoder를 결정 => 결정된 PasswordEncoder로 사용자가 입력한 패스워드를 단방향 암호화
DelegatingPasswordEncoder 장점
1. 다양한 방식의 알고리즘 적용가능 ( 여러 방식 마이그레이션 용이 )
2. 디폴트 값은 SpringSecurity에서 권장하는 최신 암호화 알고리즘으로 적용
3. Password 검증은 레거시 방식의 암호화 알고리즘으로, 암호화된 패스워드의 검증 지원
4. 암호화 방식을 변경하고 싶다면, 언제든 변경가능.
단, 기존에 암호화 되어 저장된 password에 대한 마이그레이션 작업 필요
* Delegating ( 위임 )
* 마이그레이션 ( Migration )
: 서비스 중인 한 앱 또는 모듈 등을 전혀 다른 환경(OS, 미들웨어, 하드웨어 등)에서도 돌아갈 수 있도록 전환하는 것
: 즉, 기존과 다른 환경에서 서비스 가능하게 해주는 것
* 레거시 방식
: 기존 기술을 새로운 대체 가능한 기술로 대체하는 방식
* 레거시 시스템 ( Legacy Sys. / 유산 / 기존 시스템 )
: 새로운 기술로 대체 가능한 기존 기술
: 단, 이전기술이라고 모두 다 레거시는 아님
: 즉, 새로운 시스템과 특정 관계를 주고받거나 영향을 주는 기존 시스템
PasswordEncoder 생성
: PasswordEncoderFactories의 createDelegatingPasswordEncoder()메서드를 이용해 생성한다
PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
커스텀 PasswordEncoder 생성
1) id 선언
2) encoders collection 선언
3) encoders에 원하는 encoder 삽입
4) DelegatingPasswordEncoder(식별자, encoders)로 PasswordEncoder객체 생성
String idForEncode = "bcrypt";
Map encoders = new HashMap<>(); // Collection 중 해시맵 사용
encoders.put(idForEncode, new BCryptPasswordEncoder());
encoders.put("noop", NoOpPasswordEncoder.getInstance()); // NoOpPasswordEncoder를 사용하겠다는 의미로 접두사 {noop}를 붙인다
encoders.put("pbkdf2", new Pbkdf2PasswordEncoder()); // Pbkdf2PasswordEncoder를 사용하겠다는 의미로 접두사 {pbkdf2}를 붙인다
encoders.put("scrypt", new SCryptPasswordEncoder()); // SCryptPasswordEncoder를 사용하겠다는 의미로 접두사 {scrypt}를 붙인다
encoders.put("sha256", new StandardPasswordEncoder()); // StandardPasswordEncoder를 사용하겠다는 의미로 접두사 {sha256}를 붙인다
// NoOp Pbkdf2 SCrypt Standard PasswordEncoder가 들어간 DelegatingPasswordEncoder 객체 생성
PasswordEncoder passwordEncoder = new DelegatingPasswordEncoder(idForEncode, encoders);
암호화된 Password 형태
: {id}encodedPassword
ex) {bcrypt}$2a$10$dXJ3SW...
{pbkdf2}5d923b44a6d129f3ddf3e3c8d2941272....
{scrypt}$e0801$8bWJaSu2IKSn9Z9kM+TPXfOc/9bdYSrN1o.....
{sha256}97cde38028ad898ebc02e690819fa220...
Password 암호화 기술 유형
1. Plain Text
: 패스워드 그대로 저장. 이제 안씀
2. Hash 알고리즘
: 단방향 암호화를 위한 핵심 알고리즘. (한번 암호화 되면 복호화 거의 안됨)
: 암호화 된 암호를 DB에 저장해놓고 비교하는 것
3. MD5 ( Message Digest 5 )
: 단방향 알고리즘. 복호화 된 전적이 있어서 이제 거의 안씀
4. SHA (Secure Hash Algorism )
: MD5에 해시알고리즘을 접목시키기 위해 비트 회전 연산이 추가됨
5. Rainbow Attack
: 사용자가 패스워드로 사용할만한 문자열들을 미리 만들어둔 목록(Rainbow Table)을 이용해
이 목록에 있는 문자열을 동일한 알고리즘으로 암호화 한 후, 탈취한 암호화 된 문자열과 서로 비교하는 작업을 통해
패스워드의 원본 문자열을 알아내는 공격
6. Work Factor를 추가한 Hash 알고리즘
: Rainbow Attack시, 더 느리게 더 많은 비용을 들이도록 만드는 보안책
: PBKDF2, bcrypt, scrypt 탄생
: Work Factor = 더 느리게, 더 많은 비용이 발생하게 추가하는 요소
1) PBKDF2, bcrypt : work factor로 솔트와 키 스트레칭을 기본으로 사용 + 내부적으로 더 복잡한 알고리즘 구현
2) scrypt : 다이제스트 생성시, 메모리 오버헤드를 갖도록 설계. 무차별 대입 공격(Brute Force Attack)에 대응
* 다이제스트 : 임의 길이의 데이터 블록을 고정 길이로 변환하는 해시 알고리즘에서의 해시값
* 오버헤드 : 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간, 메모리 등을 말함
: 여기서 '간접적인'의 의미는 목적 달성에 본질적인 것은 아니나, 필요한 자원이라는 의미
* 메모리 오버헤드 : 메모리에 할당하는 자원을 늘려버리는 것
'Codestates [Back-end] > 데일리 로그 [TIL]' 카테고리의 다른 글
| 22.09.26 JWT - 생성 및 검증 테스트 (1) | 2022.09.26 |
|---|---|
| 22.09.26 JWT 이론 (0) | 2022.09.26 |
| 22.09.23 SpringSecurity - 인가 (0) | 2022.09.23 |
| 22.09.23 SpringSecurity - Filter / FilterChain 구현 (0) | 2022.09.23 |
| 22.09.22 SpringSecurity - 인증 (처리 흐름 / 컴포넌트) (0) | 2022.09.22 |