01. Spring Security FilterChain의 기본 개념
Spring Security는 서블릿 필터(Servlet Filter) 체인을 기반으로 동작하며 보안 관련 로직을 처리합니다.✓ 확인할 점
- DelegatingFilterProxy: 서블릿 컨테이너(Tomcat 등)와 Spring ApplicationContext 사이를 연결하는 다리 역할을 합니다.
- FilterChainProxy: Spring Security가 관리하는 실제 보안 필터 목록(SecurityFilterChain)을 소지하고 관리하는 주체입니다.
02. SecurityFilterChain 핵심 필터 실행 순서
Spring Security 내부에서는 필터마다 정해진 Order(순서) 값이 존재하며, 이 기준에 따라 체인 내 필터들이 순서대로 호출됩니다.다음은 요청이 들어왔을 때 주요 필터들이 실행되는 대표적인 흐름입니다.
- ChannelProcessingFilter: 웹 요청이 HTTPS 등 지정된 채널로 들어왔는지 검증합니다.
- SecurityContextPersistenceFilter (또는 HeaderWriterFilter / CsrfFilter): 보안 맥락을 준비하고 CSRF 토큰을 검증합니다.
- LogoutFilter: 로그아웃 요청 URL을 감지하고 로그아웃 로직을 수행합니다.
- UsernamePasswordAuthenticationFilter: Form 기반 로그인 요청 시 사용자 인증을 처리합니다.
- BearerTokenAuthenticationFilter / 커스텀 JWT 필터: 토큰 기반 인증 시 해당 토큰의 유효성을 검증합니다.
- ExceptionTranslationFilter: 체인 실행 중 발생한 인증/인가 예외를 감지하여 로그인 페이지 이동이나 403 Forbidden 응답을 처리합니다.
- AuthorizationFilter (구
FilterSecurityInterceptor): 최종적으로 요청 사용자의 권한을 확인하여 접근 허용 여부를 결정합니다.
03. 주요 필터 역할 및 실행 순서 비교
보안 체인을 구성하는 핵심 필터들의 주요 역할과 동작 시점을 비교해 놓으면 전체적인 흐름을 이해하는 데 큰 도움이 됩니다.| 필터 명칭 (Filter Name) | 주요 역할 | 실행 시점 및 특징 |
| CsrfFilter | CSRF 공격 방지 토큰 검증 | 인증 요청 전, 요청의 위변조 여부를 확인합니다. |
| UsernamePasswordAuthenticationFilter | 아이디/비밀번호 기반 인증 | 로그인 요청 경로에서 작동하며 인증 객체를 생성합니다. |
| ExceptionTranslationFilter | SecurityException 감지 및 처리 | 체인 하위에서 발생한 예외를 잡아 적절한 응답을 생성합니다. |
| AuthorizationFilter | URL 및 자원 접근 권한 인가 | SecurityFilterChain의 가장 마지막 단계에서 동작합니다. |
04. 커스텀 필터 추가 및 순서 제어 방법
실무에서는 JWT 인증이나 특정 로깅을 위해 직접 작성한 커스텀 필터를 SecurityFilterChain에 등록하여 사용합니다.✓ 확인할 점
addFilterBefore(Filter filter, Class<? extends Filter> atFilter): 지정한 기존 필터보다 먼저 실행되도록 설정합니다.addFilterAfter(Filter filter, Class<? extends Filter> atFilter): 지정한 기존 필터 실행 직후에 작동하도록 설정합니다.addFilterAt(Filter filter, Class<? extends Filter> atFilter): 지정한 필터 위치에 배치하지만, 동일한 순서값을 가질 경우 기존 필터를 대체하지는 않으므로 주의가 필요합니다.
addFilterBefore 메서드를 사용해 등록하는 것이 표준적인 접근 방식입니다.자주 묻는 질문 (FAQ)
Q1. SecurityFilterChain에서 필터 실행 순서를 임의로 바꿀 수 있나요?네, SecurityFilterChain 설정 클래스에서
HttpSecurity 객체가 제공하는 addFilterBefore, addFilterAfter 등의 메서드를 활용하면 커스텀 필터의 실행 위치를 원하는 지점에 정확히 지정할 수 있습니다.Q2. OncePerRequestFilter는 일반 Filter와 어떻게 다른가요?
OncePerRequestFilter는 동일한 요청에 대해 단 한 번만 실행되도록 보장하는 Spring Security 제공 클래스입니다. 서블릿 내부 포워딩이나 서브 요청 발생 시 필터가 중복 호출되는 현상을 방지해 줍니다.Q3. FilterChain 내부에서 예외가 발생하면 어떻게 처리되나요?
필터 실행 도중 인증 예외(
AuthenticationException)나 인가 예외(AccessDeniedException)가 발생하면 요청은 ExceptionTranslationFilter로 전달되어 인증 유도(로그인 페이지 이동) 또는 오류 응답 처리가 이루어집니다.