[Spring Security6] Password Encoder
사용자가 아이디와 비밀번호를 입력하면 스프링 시큐리티는 AuthenticationProvider 를 실행해 저장소에서 UserDetails 객체를 가져온다 (loadUserByUsername 메서드를 사용한다)
데이터베이스에 저장된 비밀번호와 사용자가 입력한 비밀번호를 비교하는데... 여기서 PasswordEncoder를 사용하지 않으면 비밀번호를 Plain Text로 다루고 equals 메서드로 두 비밀번호가 일치하는지 확인한다.
비밀번호를 평문 그대로 다루는건 위험하다.
인코딩
인코딩은 특정 데이터를 다른 형태의 정보로 변환하는 작업을 의미하고, 디코딩은 변환한 데이터를 원본 데이터로 변환하는 작업을 의미한다.
대표적인 예시로 아스키코드, Base64 등이 있다.
이미지나 동영상 데이터를 Base64로 인코딩해서 데이터가 전송 중 손상됨을 방지하고 데이터의 호환성을 높인다.
암호화
암호화는 평문을 특정 알고리즘을 사용해 다른 문자로 변환하는 기술이다.
암호화 된 문자를 복호화하려면 암호화 할 때 사용한 알고리즘을 알고 있어야 한다.
해싱
해싱은 데이터를 해시 값으로 변환하는 기술이다.
BCrypt는 해싱 알고리즘 중 하나로 비밀번호를 복호화 할 수 없어 비밀번호를 저장할 때 자주 사용한다.
BCrypt 알고리즘은 Salt 개념을 사용해 보안을 강화한다.
Salt는 해시 함수에 추가적으로 전달되는 임의의 데이터로, 같은 비밀번호를 해시화 할 때 솔트 값이 다르면 생성되는 해시 값이 다르다.
해시 함수가 단방향인 이유는 내부적으로 복잡하고 다양한 연산을 통해 정보를 변환하기 때문이다.
그 과정에서 원본 정보는 왜곡되고, 이 작업은 비가역적으로 진행돼 복호화 작업이 거의 불가능하다.
BCrypt로 해시화된 비밀번호를 사용자가 입력한 비밀번호를 비교할 때는 해시화된 비밀번호에 사용된 salt값을 사용자가 입력한 비밀번호를 해시화 할 때 사용한다.
같은 salt 값을 사용해 비밀번호를 제대로 입력했다면 해시 값이 같음을 보장할 수 있다.
인코딩과 암호화 작업은 복호화가 가능하지만, 해싱은 복호화가 불가능해 비밀번호를 저장할 때의 표준으로 사용한다.
public interface PasswordEncoder {
String encode(CharSequence rawPassword);
boolean matches(CharSequence rawPassword, String encodedPassword);
default boolean upgradeEncoding(String encodedPassword) {
return false;
}
}
시큐리티가 제공하는 PasswordEncoder 인터페이스이다.
encode : 암호화된 비밀번호를 반환한다.
match : 두 비밀번호가 일치하는지 확인한다.
upgradeEncoding : 해싱 방식을 변경할 때 사용한다. true로 설정 시 해싱 알고리즘을 변경한다.
아래는 구현체들이다.
NoOpPasswordEncoder : 해싱, 인코딩, 암호화를 수행하지 않는다. 테스트 용도로 사용하자.
BCryptPasswordEncoder : BCrypt 해싱 기술을 사용해 비밀번호를 암호화한다. salt를 사용해 레인보우 테이블 공격을 방어할 수 있다.
SCryptPasswordEncoder : 마찬가지로 salt를 사용한다. CPU와 메모리 비용이 높아 대량의 공격에 대해 방어할 수 있지만 서버에 부하를 줄 수 있다.
Argon2PasswordEncoder : 비교적 최신 알고리즘은 Argon2 해싱 알고리즘을 사용한다. 강력하지만 구현이 복잡하다.
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
시큐리티 설정 파일에서 BCryptPasswordEncoder를 반환하는 메서드를 빈으로 등록해 비밀번호를 해시화 해야 하는 곳에서 사용하자.
'Spring > Spring Security' 카테고리의 다른 글
[Spring Security6] Authorization과 Filter (0) | 2023.08.09 |
---|---|
[Spring Security6] CORS, CSRF (0) | 2023.08.08 |
[Spring Security6] 사용자 인증 (0) | 2023.08.06 |
[Spring Security6] 주요 구성요소 (0) | 2023.08.04 |
[Spring Security6] 내부 흐름 (0) | 2023.07.30 |
댓글
이 글 공유하기
다른 글
-
[Spring Security6] CORS, CSRF
[Spring Security6] CORS, CSRF
2023.08.08 -
[Spring Security6] 사용자 인증
[Spring Security6] 사용자 인증
2023.08.06 -
[Spring Security6] 주요 구성요소
[Spring Security6] 주요 구성요소
2023.08.04 -
[Spring Security6] 내부 흐름
[Spring Security6] 내부 흐름
2023.07.30