개발/부트캠프

본캠프 : JWT Stateless Spring Security

EJ EJ 2025. 3. 17. 20:52

<기존 JWT>

JwtUtil(토큰 발급) 이후에 

JwtFilter & FilterConfig(JWT 유저데이터추출/ request.setAttribute) ->

ArgumentResolver & WebConfig & Auth(어노테이션)

& AuthUser(dto) 클래스

(AuthUser 객체 생성/ request.getAttribute) ->

Controller로의 전달 과정이 필요하다.

 

<JWT Stateless Spring Security>

📌 의존성 추가(build.gradle - dependencies)

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-security'
    testImplementation 'org.springframework.security:spring-security-test'

 

JwtUtil(토큰 발급)은 이후에

JwtFilter 대신 JwtAuthenticationFilter & SecurityConfig 

(단, 다른 점은 시큐리티의 보안을 통과하기 위해 SecurityContextHolder.getContext().setAuthentication(authenticationToken); 가 추가)

authenticationToken이 필요하니 JwtAuthenticationToken 추가

AuthUser(dto) 클래스 그대로 사용 @AuthenticationPrincipal 사용(@Auth 안씀)

Controller로의 전달 과정이 필요하다.

 

▶ 코드의 동작 순서

1.사용자가 로그인 후 JWT를 발급받음
2.사용자는 JWT를 포함하여 요청을 보냄 (Authorization: Bearer <TOKEN>)
3.Spring Security의 JwtAuthenticationFilter가 요청을 가로챔
4.JWT를 검증하고, 사용자 정보를 SecurityContextHolder에 저장
5.요청이 컨트롤러로 전달되고, @AuthenticationPrincipal 등을 사용하여 인증된 사용자 정보를 활용

▶ 최종 동작 순서 정리

1.사용자가 로그인하면 JwtUtil.createToken()을 사용하여 JWT를 생성
2.클라이언트가 API 요청 시 Authorization: Bearer <TOKEN> 헤더를 포함하여 전송
3.Spring Security의 JwtAuthenticationFilter가 요청을 가로채고 JWT를 검증
4.JWT가 유효하면 SecurityContextHolder에 AuthUser 인증 정보 저장
5.컨트롤러에서 @AuthenticationPrincipal AuthUser authUser를 통해 인증 정보 활용