2025. 12. 17. 09:15ㆍSpring Security
💬 JWT 필터 삽입 위치 및 UsernamePasswordAuthenticationFilter의 존속 여부 설명
JWT 인증을 메인으로 사용하더라도 UsernamePasswordAuthenticationFilter는 필터 체인에 계속 존재할 수 있으며, 실제로는 존재해야 합니다. 다만, 그 역할이 JWT 토큰 검증이 아닌 최초 토큰 발급을 위한 로그인 요청 처리로 한정될 뿐입니다.
이 상황을 이해하려면 두 가지 다른 유형의 요청 흐름을 구분해야 합니다.
1. 필터 체인의 두 가지 요청 유형
JWT 기반 인증 시스템에서 들어오는 HTTP 요청은 크게 두 가지로 나뉩니다.
A. 유형 1: 최초 로그인 요청 (Authentication, State creation)
- 경로: 보통
/api/login또는/login(POST 요청) - 목적: 사용자의 자격 증명(ID/PW)을 확인하고, JWT 토큰을 생성하여 응답으로 돌려주는 과정입니다.
- 관련 필터: 이 요청은
UsernamePasswordAuthenticationFilter가 처리하는 것이 전통적입니다. 이 필터는 ID/PW를 추출하여AuthenticationManager에게 전달합니다.
B. 유형 2: 토큰 기반 API 요청 (Authorization, Access control)
- 경로:
/api/resource/**등 보호된 리소스 (GET, PUT, DELETE 등) - 목적: 요청 헤더에 포함된 JWT 토큰의 유효성을 검사하고, 유효하면 해당 사용자의 정보를
SecurityContextHolder에 설정하여 리소스 접근 권한을 부여하는 과정입니다. - 관련 필터: 개발자가 추가하는
JwtAuthenticationFilter가 처리합니다.
2. UsernamePasswordAuthenticationFilter가 존속해야 하는 이유
JWT 인증을 사용하더라도 UsernamePasswordAuthenticationFilter를 아예 제거하지 않는 이유는 다음과 같습니다.
① 최초 토큰 발급 과정 처리 (The "How to get a token")
UsernamePasswordAuthenticationFilter는 사용자가 ID와 비밀번호를 제출하는 로그인 요청을 처리하는 데 특화되어 있습니다. JWT를 사용하더라도, 사용자가 토큰을 얻기 위해서는 ID/PW를 사용하여 최초 인증(로그인)을 해야 합니다.
이 필터가 그 로그인 요청을 가로채서 AuthenticationManager에게 위임하는 역할을 수행합니다.
② 필터 체인의 역할 분담
Spring Security의 필터 체인은 여러 필터들이 역할을 분담합니다.
UsernamePasswordAuthenticationFilter: 폼 로그인 (ID/PW 제출) 요청을 가로채서 인증을 시도하는 역할.JwtAuthenticationFilter: 토큰이 포함된 모든 API 요청을 가로채서 토큰을 검증하는 역할.
두 필터는 서로 다른 유형의 요청(A와 B)과 다른 형태의 인증 정보(ID/PW vs. JWT)를 처리하기 때문에, 일반적으로 두 필터 모두 체인에 존재하도록 설계됩니다.
3. JWT 필터를 UsernamePasswordAuthenticationFilter 앞에 두는 이유
JwtAuthenticationFilter를 UsernamePasswordAuthenticationFilter보다 앞에 두는 것은 효율성 및 우선순위 때문입니다.
| 필터 순서 | 요청 흐름 |
|---|---|
1. JwtAuthenticationFilter |
대부분의 API 요청은 이미 토큰을 가지고 있습니다. JwtAuthenticationFilter가 먼저 요청을 확인하여 토큰이 유효하면 바로 SecurityContext를 설정하고 필터 체인을 조기 종료합니다. (성공적으로 인증되면 다음 필터 실행을 건너뜁니다.) |
2. UsernamePasswordAuthenticationFilter |
토큰이 없거나 무효한 경우에만 필터 체인이 다음으로 진행됩니다. 이때, 이 필터는 요청이 정말 /login POST 요청인지 확인합니다. 일반 API 요청이라면 이 필터도 무시하고 다음 필터로 넘깁니다. |
이 설계는 대부분의 API 요청(토큰 검증)을 최우선으로 처리하고, 최초 로그인 요청(ID/PW)은 특정 경로에서만 처리되도록 흐름을 제어하는 가장 깔끔한 방법입니다.
요약
JWT 인증을 사용하더라도, UsernamePasswordAuthenticationFilter는 토큰을 발급받기 위한 최초의 ID/PW 로그인 요청을 처리하기 위해 필요하며, JwtAuthenticationFilter는 이미 발급된 토큰을 이용한 API 요청을 처리하기 위해 존재합니다. 두 필터는 각자의 목적을 가지고 공존합니다.
'Spring Security' 카테고리의 다른 글
| JWT 기반 인증 시스템에서 UsernamePasswordAuthenticationFilter와 커스텀 JwtAuthenticationFilter (0) | 2025.12.17 |
|---|---|
| HttpSecurity (0) | 2025.12.16 |
| SecurityFilterChain (0) | 2025.12.16 |
| @EnableWebSecurity 어노테이션 (0) | 2025.12.16 |
| ch15 Implementing an OAuth 2 resource server (0) | 2024.12.17 |