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 사용 가능*
<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
UsernamePasswordAuthenticationToken 객체를 생성하는 시점에는 토큰의 인증 과정이 끝났다.