JwtAuthenticationFilter은 매 API 요청마다 토큰을 검사하고, 유효하면 “인증된 사용자”로 등록

전체 흐름

*[Client 요청]
   ↓
Authorization: Bearer <Access Token>
   ↓
Security Filter Chain 진입
   ↓
	JWT Authentication Filter (인증) ← 수동 배치    
   └ Access Token 검증 (서명 + 만료)
   └ Claim 파싱 (sub, role, exp)
   └ Authentication 객체 생성 (UsernamePasswordAuthenticationToken)
   └ SecurityContextHolder에 저장
   ↓
	AuthorizationFilter(인가) ← Spring 자동 배치              
   └ SecurityContext에서 Authentication 조회
   └ 요청 URL / Method 기준 권한 판단
   └ 권한 없으면 → 403 Forbidden                                                                                         
   ↓
[Controller 진입]
   └ @AuthenticationPrincipal로 userId 사용 가능*                                                                         

Filter란

<aside>

*[Client Request] → Filter1 → Filter2 → … → Controller*

필터가 여러 개면, 순서대로 실행되는 파이프 구조를 가진다.

forward/include가 발생하면, 같은 요청이 필터를 다시 통과할 수도 있다.

OncePerRequestFilter란?

이 필터는 요청당 한 번만 실행되도록 한다.

같은 요청이 내부에서 forward/include 되어도 → 이 필터는 그 요청에 대해 중복 실행되지 않도록 막는다.

</aside>

인증 객체 생성

  *UsernamePasswordAuthenticationToken authentication =                                                                     
          new UsernamePasswordAuthenticationToken(                                                                         
                  userId,   // principal: 누구인지                                                                         
                  null,     // credentials: 비밀번호 (JWT에선 불필요)                                                      
                  List.of(new SimpleGrantedAuthority("ROLE_USER"))  // 권한                                                
          );*

*SecurityContextHolder                                                                                                    
    └── SecurityContext                                                                                                  
            └── Authentication (인증 객체)                                                                               
                ├ principal  → 사용자 식별 정보 (sub)
                ├ credentials → null (JWT에서는 사용 안 함)
                └ authorities → 권한 정보 (role)*

UsernamePasswordAuthenticationToken: Authentication 인터페이스 구현체 중 하나

credentials

credentials

UsernamePasswordAuthenticationToken 객체를 생성하는 시점에는 토큰의 인증 과정이 끝났다.