이번 포스팅에서는 spring security를 활용하여 jwt를 구현하였는데, 이 과정에 대해 공부한 내용을 정리해보려고 합니다.
1. SecurityFilterChain의 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 에 전달하는 과정이 필요합니다. 아래의 코드를 보면서 이해해봅시다.
Jwt 토큰이 없어 Filter로 권한 인증에 성공하지 못했으므로 login 메서드가 실행됩니다. login 메서드에는 UsernamePassword를 사용하여 Jwt 토큰을 만드는 비지니스 로직이 작성되어 있습니다. 즉 login 메서드는 jwt 토큰Filter와 관련되었다기 보다는 첫 login을 할 때 usernamePasswordFilter에서 작동하는 부분과 더 밀접하게 관련이 있음을 알 수 있습니다.
2. 처음으로 Jwt 토큰을 발급하는 과정
1. 사용자가 입력한 form을 바탕으로 UsernamePasswordAuthentication을 통해 Token을 발급합니다. - 이 토큰은 jwt의 토큰이 아닙니다.
2. AuthenticationManager를 통해 token의 유효성을 검사합니다. 이 유효성의 검사는 UserDetailsService를 통해 DB와의 정합성을 체크하는 과정입니다. authenticationManager는 customUserDetailsService를 호출하여 loadUserByUserName()을 통해 DB와의 정합성을 체크합니다. 이후 정합하다면 UserDetails 객체를 만들어 SecurityContextHolder에 저장합니다. 보통 메모리에 저장됩니다.
'백엔드' 카테고리의 다른 글
google otp fast api 서버 적용 (0) | 2024.04.05 |
---|---|
외장 톰켓에서 서버 실행해보기 (0) | 2024.01.10 |
[백엔드] jwt vs session (0) | 2023.04.13 |
회원가입 로그인을 구현하면서 겪은 이슈 정리 (0) | 2022.10.03 |