개발/Spring

[Spring] Spring security + jwt, 토큰 요청 시 "잘못된 자격증명" 뜰 시

hojak99 2019. 1. 30. 01:27

잘못된 자격증명 이 뜨는 경우가 많으나 그 중 한 가지 경우에 대해 이야기를 해보려고 한다.


사진과 같이 토큰을 요청했다.

현재 DB에는 다음과 같은 정보가 들어있다.

username : robin.kwon@opensurvey.co.kr
password : (passwordEncoder.encode("pasword") 를 한 값)

이 때 사진과 같이 정상적으로 요청을 했을 때도 잘못된 자격증명 이라는 오류를 뱉는다.

생각을 해보니 DB 에 있는 `robin.kwon@opensurvey.co.kr` 이란 데이터의 encoding 된 password 값이 일치하지 않아 발생하는 것 같다고 생각했다.

즉, 토큰 요청 시 다음과 같이 동작되야 토큰 요청이 정상적으로 수행이 될 것이다.

passwordEncorder.match(user.password, "password");

그래야 encoding 된 password 가 일치하는지 알 수 있을 것 같다.

이럴 땐 DaoAuthenticationProvider 를 return 메소드를 @Bean 으로 등록하면 된다. 아래의 코드를 보자.

    /**
     * POST '/oauth/token' 요청 시 PasswordEncoder 로 패스워드 일치하는지 확인하도록 하기 위해 Bean 등록.
     * An 'AuthenticationProvider' implementation that retrieves user details from a 'UserDetailsService'.
     *
     * @return DaoAuthenticationProvider
     */
    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
        provider.setPasswordEncoder(passwordEncoder);
        provider.setUserDetailsService(userService);
        return provider;
    }

친철하게 주석까지 달아놓았다. DaoAuthenticationProvider 클래스를 살펴보면 주석에 잘 설명을 해주었다. 위의 코드에도 똑같은 주석을 달아놓았다.

즉, DaoAuthenticationProvider 객체에 각각 PasswordEncoder, UserDetailsSerivce 를 set 해주면 된다.

그러면 이제 토큰 요청 시 PasswordEncoder 를 통해 password 가 매칭되는지 확인하고 정상적으로 토큰을 발급해줄 것이다.


코드는 다음의 링크에서 확인하도록 하자. 아직 미완성이나 정상적으로 토큰 발급은 해준다.

https://github.com/hojak99/one-hudred-million-plan/tree/e4130a5d89808d60efe846119bdaff326afbd0f0

반응형