Spring Security 로그인 실행 과정(JWT 인증 방식)

홍헌·2024년 4월 28일
0

spring

목록 보기
7/7

토이 프로젝트를 진행하며 Spring Security를 이용하여 JWT 인증 방식의 로그인을 구현하였다. 구현을 하며 로그인은 다른 요청들과 다르게 Spring Security내부에서 처리하는 로직이 다르다는 점을 알게되어 이번 글에서 간단하게 작성해보고자 한다.

요청 처리 방식


이전 글에서 얘기했듯이 일반적으로 Spring Security 사용 시, FilterChain을 지나 DispatcherSerlvet으로 간다. (이전 글에서 동작 방식에 대한 부분은 다뤘으므로 동작방식에 대해 알고 싶다면 아래 링크를 참고하자.)
Spring Security 구조와 동작 방식 링크

이후 Dispatcher Servlet이 요청에 맞게 Controller로 보내주고 이후 서비스 처리하고 응답한다. 그러나 Spring Security의 기본적인 설정을 그대로 이용할 경우 “/login”시 내부적으로 처리하여 해당되는 controller까지 가지 않고 값을 반환한다.

로그인 요청 처리 방식

실행순서는 그림에서 보듯이

1. 사용자가 로그인 요청을 보냄
2. AuthenticationFilter가 이 요청을 받아    UsernamePasswordAuthenticationFilter에 위임
3. UsernamePasswordAuthenticationFilter에서    UsernamePasswordAuthenticationToken 생성
4. 토큰을 AuthenticationManager 에게 전달하며 인증 요청
5. AuthenticationManger가 AuthenticationProvider를 통해 인증 수행
6. 인증 성공 할 경우, Authentication 객체를 반환
7. Spring Security 내부적으로 로직을 수행한 뒤, 성공 실패에 따라    UsernamePasswordAuthenticationFilter에서 후처리 후 반환

이러한 과정을 거친 뒤, “/login”에 매칭되는 controller를 찾지 않고 바로 response를 반환한다.

Self QnA

아래는 필자가 만들며 궁금증이 생겼던 부분인데 같은 의문이 있는 사람들을 위해 작성해 본다.

  1. response에 내가 원하는 값은 언제 싣어주는가?
    필자의 경우, 인증 성공 시 JWT 토큰을 반환해야했는데 이러한 작업은 UsernamePasswordAuthenticationFilter에서 후처리를 할 때 해주면 된다하여 후처리 작업에서 JWT토큰을 생성하고 반환했다.

  2. 매칭되는 controller가 없어도 되지 않을까?
    실제로 필자는 controller에 매칭되는 메소드를 없애본 결과 정상적으로 인증 후 JWT를 반환했다.

구현 코드

github 프로젝트 링크
한줄 한줄 다 주석을 달아놨으니 실제 코드를 보고 싶다면 해당 링크를 통해 들어가 config와 login패키지를 참고하면 좋을 것 같다.

0개의 댓글