[스프링 시큐리티] UsernameNotFoundException not working (BadCredentialsException 발생)

jyleever·2022년 6월 14일
1

Helpring 에러 로그

목록 보기
10/12
post-thumbnail

UsernameNotFoundException not working

가입하지 않은 계정으로 로그인 시도(가입하지 않은 아이디)했을 때 UsernameNotFoundException 에러가 아니라 BadCredentialsException 에러가 떴다.

즉, AuthenticationManager를 빈으로 등록 후, 다른 서비스에서 authenticateManager.authenticate()를 사용하여 인증할 때 username이 틀려도 password가 틀려도 모두 BadCredentialsException만 발생

원인

https://developjuns.tistory.com/11 참고

먼저 로그인 과정을 살펴보자.
SecurityConfig에서 AuthenticationManager에 UserDetailsService를 등록해주면 기본적으로 DaoAuthenticationProvider가 등록해준 (커스텀한) UserDetailsService를 가지고 있게 된다.

그 후 AbstractUserDetailsauthenticationProviderauthenticate 메소드가 실행되면서 DaoAuthenticationProvider에게 요청 온 로그인 정보를 가지고 인증 절차를 하라고 지시한다.

그러면 UserDetailsService의 loadUserByUsername가 실행되는데

이때 UsernameNotFoundException 에러가 발생되면 AbstractUserDetailsauthenticationProvider로 Throw하게 된다.

AbstractUserDetailsauthenticationProviderhideUserNotFoundException(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

0개의 댓글