필터 체인(Filter Chain)은 말 그대로 여러 개의 필터들이 체인 형태로 연결되어 순차적으로 요청(Request)과 응답(Response)을 가로채 처리하는 구조를 말합니다. 이런 필터 체인을 통해 인증, 권한 확인, 세션 관리, CSRF 방어 등의 보안 기능들을 체계적으로 구현할 수 있습니다.
특히 Java 기반(예: Spring Framework) 웹 애플리케이션에서는 Servlet Filter를 활용해 보안 로직을 구성하는 경우가 많으며, Spring Security는 내부적으로 다양한 보안 관련 필터들을 연결한 “필터 체인”을 사용해 방대한 보안 기능을 제공하는 대표적인 예시입니다.
1. Spring Security의 핵심 필터 체인 구조
Spring Security는 DelegatingFilterProxy를 통해 여러 개의 보안 필터를 순차적으로 실행합니다. 각 필터는 고유 역할을 가지고 있고, 필요에 따라 커스터마이징하거나 확장할 수 있습니다.
아래는 Spring Security 5+ 기준으로 흔히 사용되는 필터들의 예시이자 순서입니다(실제 버전에 따라 필터 목록이나 순서는 조금씩 달라질 수 있습니다).
- ChannelProcessingFilter
- HTTP나 HTTPS 등 특정 채널(프로토콜)로 요청이 오도록 강제하거나, 잘못된 채널이면 리다이렉트 등을 수행하는 필터입니다.
- 예: http를 허용하지 않고 https만 허용하는 환경 구성.
- WebAsyncManagerIntegrationFilter
- Spring의 비동기 요청(WebAsyncManager) 처리와 보안 컨텍스트(SecurityContext)를 연동해주는 필터입니다.
- 비동기 서블릿, DefferedResult, WebFlux 등 비동기 작업 상황에서도 SecurityContext가 올바로 동작하도록 돕습니다.
- SecurityContextPersistenceFilter
- 요청이 시작될 때 SecurityContext(사용자 인증 정보를 담은 보안 컨텍스트)를 가져오고, 요청이 끝나면 저장하는 역할을 합니다.
- 주로 세션에서 SecurityContext를 가져오고 다시 저장함으로써, 로그인 상태가 유지되도록 관리합니다.
- HeaderWriterFilter
- HTTP 응답 헤더를 보안 정책에 맞게 추가 또는 변경하는 필터입니다.
- 예: X-Content-Type-Options: nosniff, X-Frame-Options: DENY, X-XSS-Protection: 1; mode=block 등 각종 보안 헤더 설정.
- CorsFilter
- Cross-Origin Resource Sharing(CORS) 정책을 제어하는 필터입니다.
- 다른 도메인(Origin)에서 오는 요청을 허용할 것인지, 특정 메서드나 헤더를 허용할 것인지 등을 결정합니다.
- CSRF Filter (CsrfFilter)
- CSRF 공격을 방어하기 위한 토큰(Token) 검증 로직을 담은 필터입니다.
- CSRF 방어를 활성화하면, POST/PUT/DELETE 같은 변경 요청 시에 CSRF 토큰이 유효한지 검사합니다.
- LogoutFilter
- 사용자가 로그아웃을 요청할 때 관련 작업(세션 무효화, 쿠키 삭제 등)을 수행하는 필터입니다.
- 주로 /logout 같은 특정 URL을 통해 로그아웃을 처리합니다.
- OAuth2 / JWT 관련 필터들 (필요 시 추가)
- OAuth2 기반 로그인을 사용하거나 JWT(Json Web Token)를 사용하는 경우, 해당 로직을 처리하는 필터가 추가됩니다.
- 예: BearerTokenAuthenticationFilter, OAuth2LoginAuthenticationFilter 등이 요청 헤더의 토큰을 검증하고 인증 객체를 생성합니다.
- UsernamePasswordAuthenticationFilter
- 일반적으로 폼 로그인(Form Login)에서 사용자 이름(username)과 비밀번호(password)를 받아 인증하는 핵심 필터입니다.
- 인증 성공 시 SecurityContext에 인증 객체를 저장합니다.
- BasicAuthenticationFilter
- HTTP Basic 인증 방식을 처리하는 필터입니다.
- Authorization 헤더에 Basic base64(username:password) 형식이 있는지 확인하고, 적절히 인증 처리를 합니다.
- RequestCacheAwareFilter
- 인증이 필요한 리소스 접근 시, 로그인 페이지로 이동했다가 다시 원래 요청했던 URL로 돌아오는 기능을 지원하는 필터입니다.
- 임시로 요청 정보를 저장(Caching)해두었다가 로그인 성공 후 다시 사용합니다.
- SecurityContextHolderAwareRequestFilter
- Spring MVC에서 @PreAuthorize, @Secured 등의 애너테이션을 통해 접근 제어가 수행될 때, SecurityContext 정보를 정상적으로 반영하도록 돕는 필터입니다.
- HttpServletRequest를 래핑해 보안 컨텍스트에 접근할 수 있게 합니다.
- AnonymousAuthenticationFilter
- 인증되지 않은 사용자에게도 “익명(Anonymous)” 인증 객체를 부여하는 필터입니다.
- 실제로는 인증된 사용자와 구분하기 위해 내부적으로 “anonymousUser” 형태로 구분하며, 권한(ROLE_ANONYMOUS)을 부여합니다.
- SessionManagementFilter
- 세션 생성, 중복 로그인, 세션 고정 보호(Session Fixation Protection) 등의 세션 관련 보안 처리를 담당합니다.
- ExceptionTranslationFilter
- 필터 체인에서 발생하는 AccessDeniedException(권한 없음) 또는 AuthenticationException(인증 실패) 등을 처리해주는 필터입니다.
- 적절한 예외 처리를 통해 로그인 페이지로 리다이렉트하거나, 에러 페이지를 보여주는 등 후속 조치를 수행합니다.
- FilterSecurityInterceptor
- 실제 권한(Authorization) 체크를 담당하는 필터로, 요청된 자원에 대해 사용자가 가진 권한이 허용되는지 최종 검사합니다.
- AccessDecisionManager, AccessDecisionVoter 등을 활용해 세밀한 권한 부여 로직을 구성할 수 있습니다.
2. 필터 체인의 주요 특징과 작동 방식
- 순차 실행(Chain of Responsibility 패턴)
- 필터 체인은 요청을 순서대로 통과시키며, 각 필터가 필요한 작업을 수행한 뒤 다음 필터로 제어를 넘깁니다.
- 특정 필터가 요청 처리를 중단시키는 경우(예: 인증 실패, 리다이렉트) 이후 필터는 동작하지 않습니다.
- 역순 처리(응답 처리)
- 일반적으로 응답(Response) 과정에서도 필터들은 역순으로 후속 처리를 할 수 있습니다.
- 다만 Spring Security 필터들은 보안 로직에 집중하므로, 응답을 직접 수정하기보다는 헤더 추가나 로깅 등에 사용됩니다.
- 유연한 확장 가능
- 필요에 따라 Custom Filter를 만들고, 특정 위치에 삽입해 로직을 확장할 수 있습니다.
- 예: 특별한 로깅용 필터, 특정 인증 서버와 연동하기 위한 커스텀 필터 등.
- 설정 방법
- Spring Boot의 SecurityFilterChain 빈(bean) 설정, WebSecurityConfigurerAdapter(Spring Security 5.7 이하) 또는 SecurityFilterChain(Spring Security 5.7 이상)에서 http 객체 구성으로 필터를 등록하고 순서를 제어할 수 있습니다.
3. 필터 체인에서 자주 고려해야 할 사항
- 순서(Order)
- 필터의 위치는 매우 중요합니다.
- 예: UsernamePasswordAuthenticationFilter가 BasicAuthenticationFilter보다 먼저 동작해야 하는 경우, 혹은 JWT 인증 로직을 추가해야 하는 경우.
- 중복 인증 처리
- 쿠키 세션 기반 인증, Basic 인증, OAuth2/JWT 등 여러 인증 방식을 동시에 운영할 때, 서로 충돌이 발생하지 않도록 유의해야 합니다.
- 보안 컨텍스트의 올바른 유지/해제
- 요청이 끝난 뒤 SecurityContext를 올바르게 정리하지 않으면 정보가 누출될 수 있습니다(특히 비동기 요청 환경).
- 예외 처리 및 리다이렉트
- ExceptionTranslationFilter가 예외를 처리하지 못하거나 순서가 잘못되어 있으면, 사용자에게 제대로 된 에러 페이지나 로그인 페이지를 노출하지 못할 수 있습니다.
- 테스트
- MockMvc, JUnit 등을 활용해 각 필터가 의도대로 동작하는지(인증/권한 체크, 리다이렉트, 예외 처리 등) 테스트 코드를 작성하는 것이 권장됩니다.
4. 요약
- **필터 체인(Filter Chain)**은 일련의 필터들이 순차적으로 요청/응답을 가로채 보안 로직을 수행하는 구조입니다.
- Spring Security는 대표적인 사례로, 인증(Username/Password, Basic, OAuth2/JWT), 권한(ACL, RBAC), 세션 관리, CSRF 방어 등 다양한 보안 기능을 필터 형태로 제공하며, 이를 한 줄로 연결해 체계적으로 동작시킵니다.
- 각 필터는 고유한 역할을 가지고 있으며, 설정이나 확장을 통해 사용자 요구사항에 맞게 재구성 가능합니다.
- 필터 순서가 중요하고, 예외 처리와 인증/권한 충돌을 주의 깊게 관리해야 안정적인 보안 환경을 유지할 수 있습니다.
정리하자면, 필터 체인에서 많이 사용되는 시큐리티는 주로 Spring Security에서 제공하는 다채로운 인증/인가 관련 필터들을 가리키며, 각 필터는 “로그인, 로그아웃, 세션 관리, 헤더 보안, CSRF 방어, 권한 검사” 등 웹 애플리케이션 보안 전반을 책임지는 핵심 요소입니다.
'Spring > Spring Securitiy' 카테고리의 다른 글
6. 인증(Authentication)의 기본 개념과 구조와 Spring Security (0) | 2025.01.23 |
---|---|
5. Spring Security 6 버전 기준 이전 방식(WebSecurityConfigurerAdapter 사용)과 최신 방식(SecurityFilterChain 사용) 비교 (0) | 2025.01.23 |
4. SecurityConfig 기본 사항 (0) | 2025.01.22 |
2. @EnableGlobalMethodSecurity 대체 (1) | 2025.01.20 |
스프링 시큐리티(Spring Security) 개요 (1) | 2025.01.20 |