
가입하지 않은 계정으로 로그인 시도(가입하지 않은 아이디)했을 때 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