백엔드

jwt + spring security 동작 과정 간단 정리

happy_life 2023. 5. 14. 18:19

이번 포스팅에서는 spring security를 활용하여 jwt를 구현하였는데, 이 과정에 대해 공부한 내용을 정리해보려고 합니다.

 

 

1. SecurityFilterChain의 addFilterBefore

 

addFilterBefore

 

addFilterBefore() 메소드는 특정 필터를 등록하는 역할을 하며, 첫 번째 인자로 등록 필터를 전달하고, 두 번째 인자로 등록할 위치를 전달합니다.  UsernamePasswordAuthenticationFilter는 Spring Security에서 기본적으로 제공하는 폼 인증 처리 필터입니다. 이를 기준으로 JwtAuthenticationFilter가 등록되므로써, 사용자 인증 전 JWT 토큰을 검사하게 되는 것입니다. 

 

Q) UsernamePasswordAuthenticationFilter 와 JwtAuthenticationFilter의 차이

JwtFilter는 요청에서 JWT 토큰을 추출하고, user를 토큰을 바탕으로 authenticate하는 역할을 합니다. 반면 UsernameFilter는 username과 password로 authenticate를 하는 역할을 합니다. 즉 JwtFilter는 이미 valid한 Jwt 토큰을 가진 User를 Authenticate하고, UsernamePasswordFilter는 첫 로그인 시 유저를 체크하고 Jwt토큰을 지급하는 역할을 합니다.

 

 

1-1 JwtFilter, UsernamePasswordAuthenticationFilter의 동작과정

동작과정

 

첫 로그인(jwt 토큰이 없는 경우)에도 addFilterBefore이기 때문에 JwtAuthenticationFilter가 먼저 동작하게 됩니다. 하지만 token = null 이므로  JwtFilter가 인증을 할 수 없습니다.  따라서 UsernamePasswordAuthenticationFilter를 통해 jwtToken을 생성해 Client 에 전달하는 과정이 필요합니다. 아래의 코드를 보면서 이해해봅시다.

 

loginController/login() 메서드

 

Jwt 토큰이 없어 Filter로 권한 인증에 성공하지 못했으므로 login 메서드가 실행됩니다. login 메서드에는 UsernamePassword를 사용하여 Jwt 토큰을 만드는 비지니스 로직이 작성되어 있습니다. 즉 login 메서드는 jwt 토큰Filter와 관련되었다기 보다는 첫 login을 할 때 usernamePasswordFilter에서 작동하는 부분과 더 밀접하게 관련이 있음을 알 수 있습니다.

 

 

2. 처음으로 Jwt 토큰을 발급하는 과정

Jwt 토큰을 첫 발급 과정

 

1. 사용자가 입력한 form을 바탕으로 UsernamePasswordAuthentication을 통해 Token을 발급합니다. - 이 토큰은 jwt의 토큰이 아닙니다.

 

2. AuthenticationManager를 통해 token의 유효성을 검사합니다. 이 유효성의 검사는 UserDetailsService를 통해 DB와의 정합성을 체크하는 과정입니다. authenticationManager는 customUserDetailsService를 호출하여 loadUserByUserName()을 통해 DB와의 정합성을 체크합니다. 이후 정합하다면 UserDetails 객체를 만들어 SecurityContextHolder에 저장합니다. 보통 메모리에 저장됩니다.

 

UserDetailsService