가입하지 않은 계정으로 로그인 시도(가입하지 않은 아이디)했을 때 UsernameNotFoundException 에러가 아니라 BadCredentialsException 에러가 떴다.
즉, AuthenticationManager를 빈으로 등록 후, 다른 서비스에서 authenticateManager.authenticate()를 사용하여 인증할 때 username이 틀려도 password가 틀려도 모두 BadCredentialsException만 발생
https://developjuns.tistory.com/11 참고
먼저 로그인 과정을 살펴보자.
SecurityConfig
에서 AuthenticationManager
에 UserDetailsService를 등록해주면 기본적으로 DaoAuthenticationProvider
가 등록해준 (커스텀한) UserDetailsService를 가지고 있게 된다.
그 후 AbstractUserDetailsauthenticationProvider
의 authenticate
메소드가 실행되면서 DaoAuthenticationProvider에게 요청 온 로그인 정보를 가지고 인증 절차를 하라고 지시한다.
그러면 UserDetailsService의 loadUserByUsername
가 실행되는데
이때 UsernameNotFoundException
에러가 발생되면 AbstractUserDetailsauthenticationProvider
로 Throw하게 된다.
AbstractUserDetailsauthenticationProvider
의 hideUserNotFoundException(Boolean)
를 확인하여 BadCredentialsException
을 내보내게 되어있다.
아이디 체크와 비밀번호 체크를 따로 exception을 날리는 거보다 BadCredential Exception하나만 날리는것이 보다 더 보안이 강하기 때문…이라고 한다.
AuthenticationProvider
생성 시에 setHideUserNotFoundException(false);
로 설정한다.
그러나 더 강한 보안을 위해서라면 모두 BadCredential을 호출하는 것이 맞다.
참고해서 공부한 블로그에 따르면 두 가지 방법이 있지만 우선 해당 방법을 사용했다.
SecurityConfig
/** UsernameNotFoundException이 작동하지 않는 문제 **/
public DaoAuthenticationProvider daoAuthenticationProvider() {
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(customUserDetailsService);
authenticationProvider.setPasswordEncoder(Encoder());
authenticationProvider.setHideUserNotFoundExceptions(false);
return authenticationProvider;
}
참고
https://blog.devbong.com/95
https://wildeveloperetrain.tistory.com/56
https://developjuns.tistory.com/11