암호가 유효한지를 확인한다.
PasswordEncoder 예시코드
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
public class PasswordEncoderExample {
public static void main(String[] args) {
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
// 비밀번호 암호화
String rawPassword = "mySecurePassword";
// 주어진 암호를 해시합니다
String encodedPassword = passwordEncoder.encode(rawPassword);
System.out.println("Encoded Password: " + encodedPassword);
// 비밀번호 검증
boolean matches = passwordEncoder.matches(rawPassword, encodedPassword);
System.out.println("Password matches: " + matches);
}
}
일반적으로 해시는 암호화와 다르다. 해시 함수는 일방향 수학적 연산을 통해 원래의 데이터를 고정 길이의 문자열로 변환한다. 이 과정은 역변환이 불가능하며, 원래의 데이터를 복구할 수 없다.
encode() 에서 반환된 문자열은 항상 같은 PasswordEncoder의 match() 메서드로 검증할 수 있어야 한다.
DelegatingPasswordEncoder는 여러 PasswordEncoder 구현체 중 하나를 선택하여 사용할 수 있도록 해주는 인코더이다. 이 인코더는 비밀번호의 접두사를 사용하여 해당 비밀번호가 어떤 알고리즘을 사용해 인코딩되었는지를 식별한다. 예를 들어, {bcrypt} 접두사는 Bcrypt 알고리즘을 사용했음을 나타낸다.
{bcrypt} : Bcrypt 알고리즘을 사용합니다. (default)
{noop} : 비밀번호를 인코딩하지 않고 저장합니다 (주로 테스트 목적).
{pbkdf2} : PBKDF2 알고리즘을 사용합니다.
{scrypt} : Scrypt 알고리즘을 사용합니다.
{sha256} : SHA-256 알고리즘을 사용하는 표준 해시 함수입니다.
인증 흐름을 위해 자주 사용하는 인터페이스
- UserDetails: 이 인터페이스는 Spring Security에서 사용자의 정보를 캡슐화한다. 사용자의 계정 정보, 권한, 계정의 잠김 상태 등을 포함할 수 있다. 주로 사용자의 인증 정보를 담고 있는 객체로 사용된다.
- GrantedAuthority: 이 인터페이스는 애플리케이션 내에서 부여된 권한을 나타낸다. 일반적으로 사용자에게 허용되는 작업(역할)을 문자열로 나타내며, UserDetails 객체에 연결되어 사용된다.
- UserDetailsService: 사용자의 이름(아이디)을 기반으로 UserDetails 객체를 조회하는 역할을 한다. 이 서비스는 인증 과정에서 주로 사용되며, 데이터베이스나 다른 저장소에서 사용자 정보를 불러오는 데 사용된다.
- UserDetailsManager: UserDetailsService 인터페이스를 확장한 인터페이스로, UserDetails 객체의 생성, 수정, 삭제 등 사용자 세부 정보의 관리 기능을 추가적으로 제공한다. 사용자 계정을 관리하는 데 필요한 여러 추가적인 메서드를 포함한다.
- PasswordEncoder: 비밀번호를 안전하게 처리하기 위한 인터페이스로, 비밀번호를 해시하거나 암호화하는 메서드와, 제공된 인코딩된 비밀번호 문자열을 원본 비밀번호와 비교하는 메서드를 제공한다. 이를 통해 저장된 비밀번호와 사용자가 입력한 비밀번호를 비교하여 인증 과정에서의 보안을 강화한다.