che01 님의 블로그
JWT 필터와 Spring Security 인증 예외 처리 트러블슈팅 본문
문제 상황
JWT 기반 인증 시스템에서 인증 제외 URL에 대한 처리 로직이 JWT 필터와 Spring Security 설정에 중복으로 구현되어 있었고, 이로 인해 토큰이 필요 없는 요청에서 예상치 못한 예외가 발생하는 문제가 있었습니다.
주요 증상
- 인증이 필요 없는 API에 요청 시 "토큰이 필요하다"는 예외 발생
- AuthenticationEntryPoint로 도달하지 못하고 JWT 필터에서 예외 처리됨
- JWT에도 인증제외 URL 로직을 구현 했었음
원인 분석
문제의 핵심은 책임 분리의 실패였습니다.
- 잘못된 예외 처리 시점: JWT 필터에서 토큰 검증 실패 시 바로 예외를 발생시켜 Spring Security의 정상적인 인증 플로우를 방해
- Spring Security 아키텍처 이해 부족: 인증 실패는 AuthenticationEntryPoint에서 처리되어야 하는데, 그 전 단계에서 예외가 발생
Spring Security의 인증 플로우
- 요청 접수: 클라이언트 요청이 필터 체인에 진입
- URL 검사: SecurityFilterChain에서 인증 필요 여부 판단
- 인증 처리: 인증이 필요한 경우 JWT 필터에서 토큰 검증
- 실패 처리: 인증 실패 시 AuthenticationEntryPoint에서 응답 생성
올바른 책임 분리
- JWT 필터: 토큰 검증 및 SecurityContext 설정
- SecurityFilterChain: URL별 접근 권한 설정
- AuthenticationEntryPoint: 인증 실패 시 응답 처리
결론
인증 제외 URL 검사는 Spring Security 설정에서 한 번만 관리하고, JWT 필터는 순수하게 토큰 검증에만 집중하도록 구조를 개선했습니다. 이를 통해 Spring Security의 표준 인증 플로우를 따르면서 일관된 예외 처리가 가능해졌습니다.
교훈
- 프레임워크의 설계 의도를 이해하고 따르는 것이 중요
- 중복된 책임은 예상치 못한 부작용을 야기할 수 있음
- 인증/인가는 Spring Security에 위임하고, 커스텀 로직은 최소화하는 것이 바람직