최대 1 분 소요

스프링 시큐리티 적용 시 사용자가 입력한 비밀번호를 암호화하지 않은 상태로 DB에 저장하면 안된다.
때문에 스프링 시큐리티 설정 코드에 암호화 기능을 스프링 빈으로 등록해 입력받은 비밀번호를 암호화해서 저장하도록 해야한다.

There is no PasswordEncoder mapped for the id “null”

위 에러는 암호화 기능인 PasswordEncoder등록되지 않았거나 입력받은 비밀번호를 암호화하지 않는 경우 발생한다.
다음과 같이 스프링 시큐리티 설정 파일에 스프링 빈으로 등록해주면 다른 경로에서도 주입받아 편리하게 사용할 수 있다.

public class SecurityConfig {

  @Bean
  SecurityFilterChain filterChain(HttpSecurity http) throws Exception {...}

  //암호화 기능
  @Bean
  public static BCryptPasswordEncoder passwordEncoder() {
      return new BCryptPasswordEncoder();
  }

  ...
}
  • BCryptPasswordEncoderPasswordEncoder을 상속받은 클래스로 스프링 시큐리티 설정에 등록해서 사용할 수 있음
  • 스프링 빈(@Bean)으로 등록했으므로 다른 경로에서 편리하게 사용할 수 있음
    • 아래 코드 참고
@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository userRepository;
    private final BCryptPasswordEncoder passwordEncoder;
    
    @Transactional
    public void save(UserDto userDto) {
        User user = new User(userDto, passwordEncoder.encode(userDto.getPassword()));
        userRepository.save(user);
    }
    ...
}
  • passwordEncoderprivate final로 선언 후 @RequiredArgsConstructor를 통해 주입받고 사용
  • BCryptPasswordEncoder.encode(String password) 호출을 통해 암호화된 비밀번호 반환

DB에 저장한 비밀번호를 입력받은 비밀번호와 비교할 때 BCryptPasswordEncoder.encode()를 사용하면 같은 평문임에도
다른 값이돼 검증할 수 없다. 따라서 비밀번호 검증 시에는 BCryptPasswordEncoder.matches()를 사용하고, 입력받은
비밀번호(평문)과 (DB에 저장돼있던) 암호화된 비밀번호를 순서대로 넣어준 뒤 호출해 검증하면 된다.

카테고리:

업데이트:

댓글남기기