T.I.L #37 비밀번호 인코딩

개발자지망생·2023년 11월 21일
0

Spring Security의 PasswordEncoder

어플리케이션의 보안을 강화하는 중요한 부분이다. 이 시스템은 다양한 패스워드 인코딩 매커니즘을 제공하여, 사용자의 패스워드를 안전하게 저장하고 관리할 수 있도록 돕는다.

1. PasswordEncoder 인터페이스

  • 스프링 시큐리티는 PasswordEncoder 인터페이스를 통해 패스워드 인코딩을 처리한다. 이 인터페이스는 다양한 인코딩 구현체를 제공하며, 이 중에서 어플리케이션에 가장 적합한 방식을 선택한다.

2. 다양한 인코딩 옵션

  • 스프링 시큐리티는 여러 가지 패스워드 인코딩 방식을 지원한다. 가장 널리 사용되는 인코더는 BCryptPasswordEncoder, Pbkdf2PasswordEncoder, SCryptPasswordEncoder 등이 있다. 이들 각각은 다른 알고리즘을 사용하여 비밀번호를 안전하게 인코딩한다.

3. BCryptPasswordEncoder

  • BCryptPasswordEncoder는 BCrypt해싱 알고리즘을 사용하여 비밀번호를 인코딩한다. 이 방식은 솔트(salt)를 사용하여 해시 충돌을 방지하고, 무작위성을 높여 비밀번호의 안전성을 강화한다.

4. 솔트(Salt)사용

  • 솔트는 비밀번호 인코딩 시 추가되는 무작위 문자열로, 같은 비밀번호라도 다른 해시 값을 생성하게 한다.

5. 인코딩과 매칭

  • 인코딩된 비밀번호는 데이터베이스에 저장된다. 사용자가 로그인할 때, 제출된 비밀번호는 같은 인코딩 과정을 거쳐 데이터베이스에 저장된 해시와 비교된다. 이 과정은 사용자가 올바른 비밀번호를 입력했는지를 안전하게 확인하는 데 사용된다.

PasswordEncoder 적용

1. PasswordConfig 클래스 만들기

@Configuration
public class PasswordConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
  • @Configuration을 사용하여 해당 클래스가 스프링의 구성(Configuration) 클래스 임을 나타낸다. 구성 클래스는 스프링 컨테이너가 관리하는 빈(Bean)들을 정의하고, 어플리케이션의 설정 정보는 담는다.

  • PasswordEncoder 인터페이스의 인스턴스를 반환한다.

  • BCryptPasswordEncoder 구현체를 return해준다.

2. UserService 클래스에 코드 추가하기

@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!)

0개의 댓글