토이 프로젝트를 진행하며 Spring Security를 이용하여 JWT 인증 방식의 로그인을 구현하였다. 구현을 하며 로그인은 다른 요청들과 다르게 Spring Security내부에서 처리하는 로직이 다르다는 점을 알게되어 이번 글에서 간단하게 작성해보고자 한다.
이전 글에서 얘기했듯이 일반적으로 Spring Security 사용 시, FilterChain을 지나 DispatcherSerlvet으로 간다. (이전 글에서 동작 방식에 대한 부분은 다뤘으므로 동작방식에 대해 알고 싶다면 아래 링크를 참고하자.)
Spring Security 구조와 동작 방식 링크
이후 Dispatcher Servlet이 요청에 맞게 Controller로 보내주고 이후 서비스 처리하고 응답한다. 그러나 Spring Security의 기본적인 설정을 그대로 이용할 경우 “/login”시 내부적으로 처리하여 해당되는 controller까지 가지 않고 값을 반환한다.
실행순서는 그림에서 보듯이
아래는 필자가 만들며 궁금증이 생겼던 부분인데 같은 의문이 있는 사람들을 위해 작성해 본다.
response에 내가 원하는 값은 언제 싣어주는가?
필자의 경우, 인증 성공 시 JWT 토큰을 반환해야했는데 이러한 작업은 UsernamePasswordAuthenticationFilter에서 후처리를 할 때 해주면 된다하여 후처리 작업에서 JWT토큰을 생성하고 반환했다.
매칭되는 controller가 없어도 되지 않을까?
실제로 필자는 controller에 매칭되는 메소드를 없애본 결과 정상적으로 인증 후 JWT를 반환했다.
github 프로젝트 링크
한줄 한줄 다 주석을 달아놨으니 실제 코드를 보고 싶다면 해당 링크를 통해 들어가 config와 login패키지를 참고하면 좋을 것 같다.