SecurityFilterChain 구조
@EnableWebSecurity에debug모드를true로 설정하면, 요청이 통과하는SecurityFilterChain의filter목록이 출력 된다.Spring Security디버깅을 활성화하는 옵션으로, 개발 환경에서만 사용해야 한다.debug모드의 기본값은false이다.
Java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity(debug = true)
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain1(HttpSecurity http) throws Exception {
http.securityMatcher("/user");
return http.build();
}
@Bean
public SecurityFilterChain securityFilterChain2(HttpSecurity http) throws Exception {
http.securityMatcher("/admin");
return http.build();
}
}
application 구동 후 요청한 결과
Bash
2025-03-08T00:46:21.148+09:00 INFO 44398 --- [] [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 1 endpoint beneath base path '/actuator'
2025-03-08T00:46:21.184+09:00 WARN 44398 --- [] [ main] o.s.s.c.a.web.builders.WebSecurity :
********************************************************************
********** Security debugging is enabled. *************
********** This may include sensitive information. *************
********** Do not use in a production system! *************
********************************************************************
2025-03-08T00:46:21.391+09:00 INFO 44398 --- [] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/'
2025-03-08T00:46:21.398+09:00 INFO 44398 --- [] [ main] com.nimkoes.security : Started Application in 1.704 seconds (process running for 2.058)
2025-03-08T00:46:21.557+09:00 INFO 44398 --- [] [on(2)-127.0.0.1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2025-03-08T00:46:21.557+09:00 INFO 44398 --- [] [on(2)-127.0.0.1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2025-03-08T00:46:21.558+09:00 INFO 44398 --- [] [on(2)-127.0.0.1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
2025-03-08T00:48:50.772+09:00 INFO 44398 --- [] [nio-8080-exec-1] Spring Security Debugger :
************************************************************
Request received for GET '/user':
org.apache.catalina.connector.RequestFacade@9fc0b4c
servletPath:/user
pathInfo:null
headers:
user-agent: IntelliJ HTTP Client/IntelliJ IDEA 2024.3.1
accept-encoding: br, deflate, gzip, x-gzip
accept: */*
host: localhost:8080
Security filter chain: [
DisableEncodeUrlFilter
WebAsyncManagerIntegrationFilter
SecurityContextHolderFilter
HeaderWriterFilter
CsrfFilter
LogoutFilter
RequestCacheAwareFilter
SecurityContextHolderAwareRequestFilter
AnonymousAuthenticationFilter
ExceptionTranslationFilter
]
************************************************************
SecurityFilterChain 을 등록하지 않았을 때 사용하는 기본 filter
Bash
Security filter chain: [
DisableEncodeUrlFilter
WebAsyncManagerIntegrationFilter
SecurityContextHolderFilter
HeaderWriterFilter
CorsFilter
CsrfFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
DefaultResourcesFilter
DefaultLoginPageGeneratingFilter
DefaultLogoutPageGeneratingFilter
BasicAuthenticationFilter
RequestCacheAwareFilter
SecurityContextHolderAwareRequestFilter
AnonymousAuthenticationFilter
ExceptionTranslationFilter
AuthorizationFilter
]
DisableEncodeUrlFilterURL 인코딩 방지를 위한 필터 (주로 사용되지 않는다.)WebAsyncManagerIntegrationFilter비동기 요청을 처리할 때SecurityContext를 유지하는 필터SecurityContextHolderFilterSecurityContextHolder를 초기화 및 정리하는 필터HeaderWriterFilter보안 관련 HTTP header (X-Frame-Options,X-Content-Type-Options등) 를 추가하는 필터CorsFilterCross-Origin요청을 허용하거나 차단하는CORS정책을 적용하는 필터CsrfFilterCSRF(Cross-Site Request Forgery) 공격을 방지하는 필터LogoutFilter/logout요청을 감지하고, 세션을 무효화하는 로그아웃 처리 필터UsernamePasswordAuthenticationFilter폼 기반 로그인 요청을 처리하는 필터 (/login)DefaultResourcesFilter정적 리소스 요청을 보안 정책에 맞게 필터링하는 필터DefaultLoginPageGeneratingFilter기본 로그인 페이지를 자동으로 생성하는 필터DefaultLogoutPageGeneratingFilter기본 로그아웃 페이지를 자동으로 생성하는 필터BasicAuthenticationFilterHTTP basic인증을 처리하는 필터RequestCacheAwareFilter보안 컨텍스트에서 이전 요청을 캐싱하여, 인증 후 원래 요청으로 리다이렉트하는 필터SecurityContextHolderAwareRequestFilterHttpServletRequest를 보안 컨텍스트 인식 요청 객체로 변환하는 필터AnonymousAuthenticationFilter인증되지 않은 사용자를 자동으로 "익명 사용자" 로 등록하는 필터ExceptionTranslationFilter인증 및 인가 예외를 처리하고, 적절한 응답을 반환하는 필터AuthorizationFilter요청에 대한 권한을 확인하고 접근을 허용 또는 차단 하는 필터
SecurityFilterChain 에 사용자 정의 필터 등록
Java
package com.nimkoes.security.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity(debug = true)
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// 특정 필터 이전에 사용자 정의 필터 추가
http.addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class);
// 특정 필터 위치에 사용자 정의 필터 추가
http.addFilterAt(new CustomFilter(), BasicAuthenticationFilter.class);
// 특정 필터 이후에 사용자 정의 필터 추가
http.addFilterAfter(new CustomFilter(), ExceptionTranslationFilter.class);
return http.build();
}
}