Spring Security의 PasswordEncoder
어플리케이션의 보안을 강화하는 중요한 부분이다. 이 시스템은 다양한 패스워드 인코딩 매커니즘을 제공하여, 사용자의 패스워드를 안전하게 저장하고 관리할 수 있도록 돕는다.
PasswordEncoder 적용
@Configuration
public class PasswordConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
@Configuration을 사용하여 해당 클래스가 스프링의 구성(Configuration) 클래스 임을 나타낸다. 구성 클래스는 스프링 컨테이너가 관리하는 빈(Bean)들을 정의하고, 어플리케이션의 설정 정보는 담는다.
PasswordEncoder 인터페이스의 인스턴스를 반환한다.
BCryptPasswordEncoder 구현체를 return해준다.
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder; // <= 요기1!
public void signupNewUserAccount(UserSignupRequestDTO userSignupRequestDTO) {
// 패스워드 인코딩
String password = passwordEncoder.encode(userSignupRequestDTO.getPassword()); // <= 요기2!
userSignupRequestDTO.setPassword(password); // <= 요기3!
User user = new User(userSignupRequestDTO);
}
}
UserService 클래스 내에서 인코딩 기능을 사용하기 위한 의존성을 선언한다. (요기1!)
생성자를 통해 의존성이 주입되고, 이후 클래스 내의 메서드들에서 패스워드 인코딩 및 검증 작업에 인스턴스를 사용하게 된다. (요기1!)
인스턴스(passwordEncoder)의 encode 메서드는 전달된 원본 패스워드를 안전하게 인코딩하는 데 사용된다. (요기2!)
UserSignupRequestDTO는 사용자의 회원가입 정보를 담고 있는 DTO 객체이다. 이 객체의 getPassword 메서드는 사용자가 입력한 원본 패스워드를 반환한다. (요기2!)
String password는 인코딩된 패스워드를 저장하는 데 사용되는 변수이다. 이 변수는 인코된 패스워드 값을 담고 있으며, 이후에 DTO에 저장된다.
인코딩된 패스워드를 userSignupRequestDTO 객체의 패스워드 필드에 설정한다. setPassword 메서드는 DTO 내의 패스워드 필드를 새로운 값으로 업데이트하는 데 사용된다. (요기3!)
이렇게 업데이트된 userSignupRequestDTO 객체는 이후에 데이터베이스에 저장되거나 다른 비즈니스 로직에서 사용될 수 있다. 여기서 데이터베이스에 저장된 패스워드는 원본이 아니라 인코딩된 형태이다. (요기3!)