JWT 필터 삽입 위치 및 UsernamePasswordAuthenticationFilter의 존속 여부 설명

2025. 12. 17. 09:15Spring 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 요청을 가로채서 토큰을 검증하는 역할.

두 필터는 서로 다른 유형의 요청(AB)과 다른 형태의 인증 정보(ID/PW vs. JWT)를 처리하기 때문에, 일반적으로 두 필터 모두 체인에 존재하도록 설계됩니다.

3. JWT 필터를 UsernamePasswordAuthenticationFilter 앞에 두는 이유

JwtAuthenticationFilterUsernamePasswordAuthenticationFilter보다 앞에 두는 것은 효율성 및 우선순위 때문입니다.

필터 순서 요청 흐름
1. JwtAuthenticationFilter 대부분의 API 요청은 이미 토큰을 가지고 있습니다. JwtAuthenticationFilter가 먼저 요청을 확인하여 토큰이 유효하면 바로 SecurityContext를 설정하고 필터 체인을 조기 종료합니다. (성공적으로 인증되면 다음 필터 실행을 건너뜁니다.)
2. UsernamePasswordAuthenticationFilter 토큰이 없거나 무효한 경우에만 필터 체인이 다음으로 진행됩니다. 이때, 이 필터는 요청이 정말 /login POST 요청인지 확인합니다. 일반 API 요청이라면 이 필터도 무시하고 다음 필터로 넘깁니다.

 

이 설계는 대부분의 API 요청(토큰 검증)을 최우선으로 처리하고, 최초 로그인 요청(ID/PW)은 특정 경로에서만 처리되도록 흐름을 제어하는 가장 깔끔한 방법입니다.

요약

 

JWT 인증을 사용하더라도, UsernamePasswordAuthenticationFilter토큰을 발급받기 위한 최초의 ID/PW 로그인 요청을 처리하기 위해 필요하며, JwtAuthenticationFilter는 이미 발급된 토큰을 이용한 API 요청을 처리하기 위해 존재합니다. 두 필터는 각자의 목적을 가지고 공존합니다.