Spring Security에서 지원하는 암호 인코딩을 위한 서비스 인터페이스
구현 클래스 종류
=> BCryptPasswordEncoder : 기본 구현
=> NoOpPasswordEncoder : 아무것도 하지 않는 비밀번호 인코더
=> AbstractPasswordEncoder : 암호 인코더의 추상 기본 클래스
=> Pbkdf2PasswordEncoder : salt가 8bytes 랜덤 값
=> SCryptPasswordEncoder : SCrypt 해싱 기능을 사용하여 구현
=> StandardPasswordEncoder : SHA-256 해싱을 사용하는 표준 PasswordEncoder 구현
예시
private final PasswordEncoder passwordEncoder;
public void example(RequestDto requestDto){
String password = passwordEncoder.encode(requestDto.getPassword());
}
개인과제 작업 중 비밀번호에서 PasswordEncoder를 사용했는데 계속 오류가 났다.
실행을 해보니 passwordEncoder의 Bean이 없다고 하여 내용을 찾아봤다.
결과적으로는 정말 Bean이 없는게 맞았다. 샘플의 WebSecurityConfig 파일에 있던 Bean 설정을 확인하지 못했던 거였다.
(기본적으로 선언한다고 Bean이 자동 생성되는 것은 아님)
해결방법은 당연하게도 Bean을 만들어주면 된다.
* Application 파일
@Bean
public PasswordEncoder passwordEncoder(){
return NoOpPasswordEncoder.getInstance();
}
만들 때는 passwordEncoder Bean 만드는 법으로 해서 위 코드를 추가했었는데 TIL 작성하면서 찾아보니 구현 클래스 종류가 많았다. NoOpPasswordEncoder 보다는 기본 구현인 BCryptPasswordEncoder 을 쓰는게 좋을거 같다.
샘플에서는 PasswordEncoder Bean을 WebSecurityConfig에서 추가했고 구글링한 내용에서는 Application 파일에 추가했다.(둘다 실행됨)
우선 Bean 생성은 @Bean 에너테이션을 사용하면 어디서든 가능하다, 그러니 각 파일의 역할과 규칙에 대해 알아보자
** Bean을 생성하는 @Bean, @Component 에너테이션의 차이점
=> Bean : 매서드 위에 붙이며 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용(싱글톤 방식)
=> Component : class에서만 사용 가능
작업하면서 의아했던 부분중 private PasswordEncoder passwordEncoder; 으로 하니 빨간줄이 뜨지 않은 것인데 private final 으로 쓰지 않으면 시큐리티가 동작하지 않아 사용이 되지 않는 것이었다.
private final 로 선언을 해줘야 시큐리티에서 인지하고 사용가능!
final을 쓰지 않으면 아래와 같이 회색(미사용)으로 뜬다.(+Bean 없음)