
1. Spring Boot 메인 클래스 설정:
@EnableWebSecurity 어노테이션을 추가하고 debug = true로 설정합니다
@EnableWebSecurity(debug = true)
public class BackendApplication {
// ...
}
2. application.properties 파일 설정:
Spring Security의 FilterChainProxy 클래스의 디버그 로깅을 활성화합니다.
logging.level.org.springframework.security.web.FilterChainProxy=DEBUG
- FilterChainProxy 클래스와 VirtualFilterChain:
- FilterChainProxy 클래스는 Spring Security의 내부 필터를 연결하는 역할을 합니다.
- VirtualFilterChain 클래스는 필터 체인 내의 각 필터를 반복 실행하는 역할을 합니다.
- 디버깅 설정:
- 설정을 완료하고 애플리케이션을 디버그 모드로 실행하면, Spring Security 프레임워크가 활성화된 모든 내부 필터를 확인할 수 있습니다.
- 필터 체인의 각 필터를 하나씩 확인하고, 각 필터의 역할과 동작을 이해할 수 있습니다.
- 주의사항:
- 이러한 설정은 개발 및 테스트 환경에서만 사용해야 합니다. 프로덕션 환경에서는 민감한 정보가 로그에 기록될 수 있어 보안 위험이 있습니다.
- 실제 운영 환경에서는 이러한 디버그 설정을 사용하지 않는 것이 중요합니다.


HTTP 요청 헤더 정보
HTTP 요청 헤더는 클라이언트가 서버로 보내는 요청에 대한 메타데이터를 포함합니다. 요청 헤더에는 다양한 종류의 정보가 포함될 수 있으며, 이는 필터 체인에서 보안, 인증, 인가 등의 작업을 수행하는 데 사용될 수 있습니다. 다음은 이미지에서 볼 수 있는 요청 헤더 정보입니다:
- servletPath: 요청된 서블릿 경로 (예: /login)
- pathInfo: 추가 경로 정보 (null인 경우도 있음)
- host: 요청된 호스트와 포트 (예: localhost:8080)
- connection: 연결 설정 (예: keep-alive)
- cache-control: 캐시 제어 설정 (예: max-age=0)
- sec-ch-ua: 클라이언트의 사용자 에이전트 정보
- upgrade-insecure-requests: 보안 요청 업그레이드 설정 (예: 1)
- user-agent: 클라이언트 소프트웨어 정보 (예: 브라우저 정보)
- accept: 클라이언트가 허용하는 콘텐츠 타입
- sec-fetch-site, sec-fetch-mode, sec-fetch-user, sec-fetch-dest: 리소스 페치와 관련된 정보
- accept-encoding: 클라이언트가 허용하는 인코딩 방식 (예: gzip, deflate, br)
- accept-language: 클라이언트가 허용하는 언어 (예: ko-KR,ko; q=0.8, en; q=0.7)
- cookie: 클라이언트의 쿠키 정보 (예: JSESSIONID, XSRF-TOKEN)
HTTP 요청 헤더 로그:
- 필터 체인에서 HTTP 요청 헤더를 로그로 출력하여 요청 정보를 확인할 수 있습니다.
- 이를 위해 커스텀 필터를 추가하여 요청 헤더를 로깅할 수 있습니다.
@Component
public class RequestLoggingFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
String headerValue = request.getHeader(headerName);
System.out.println(headerName + ": " + headerValue);
}
}
filterChain.doFilter(request, response);
}
}
위의 필터는 모든 요청의 헤더를 콘솔에 출력합니다. 이를 통해 요청 헤더 정보를 쉽게 확인할 수 있습니다.

이 로그는 애플리케이션이 실행될 때 Spring Security가 활성화하는 모든 필터들을 나열한 것입니다. 각 필터는 특정 보안 작업을 수행하며, 순차적으로 실행됩니다. 아래는 각 필터의 역할과 기능에 대한 설명입니다.
Spring Security 필터 체인
- DisableEncodeUrlFilter: URL 인코딩을 비활성화합니다.
- ForceEagerSessionCreationFilter: 세션을 즉시 생성합니다.
- ForceEagerSessionCreationFilter: 세션을 즉시 생성합니다.
- WebAsyncManagerIntegrationFilter: 비동기 요청을 지원합니다.
- SecurityContextPersistenceFilter: SecurityContext를 세션에서 가져오거나 저장합니다.
- HeaderWriterFilter: 응답 헤더를 설정합니다.
- CorsFilter: CORS 설정을 처리합니다.
- CsrfFilter: CSRF 보호를 처리합니다.
- LogoutFilter: 로그아웃 요청을 처리합니다.
- UsernamePasswordAuthenticationFilter: 사용자 이름과 비밀번호로 인증을 처리합니다.
- DefaultLoginPageGeneratingFilter: 기본 로그인 페이지를 생성합니다.
- DefaultLogoutPageGeneratingFilter: 기본 로그아웃 페이지를 생성합니다.
- BasicAuthenticationFilter: HTTP 기본 인증을 처리합니다.
- CsrfCookieFilter: CSRF 토큰을 쿠키에 저장합니다.
- RequestCacheAwareFilter: 요청 캐시를 사용합니다.
- SecurityContextHolderAwareRequestFilter: 보안 컨텍스트를 요청에 반영합니다.
- AnonymousAuthenticationFilter: 익명 사용자를 위한 인증을 처리합니다.
- SessionManagementFilter: 세션 관리를 처리합니다.
- ExceptionTranslationFilter: 보안 예외를 처리합니다.
- AuthorizationFilter: URL 접근 권한을 제어합니다.
요약
이 필터 체인은 Spring Security가 HTTP 요청을 처리하는 동안 수행하는 다양한 보안 작업을 나타냅니다. 각 필터는 특정 보안 작업을 수행하며, 체인 내의 필터들은 순차적으로 실행됩니다. 디버그 모드를 활성화하면 이러한 필터들의 실행 순서와 동작을 로그에서 확인할 수 있습니다. 이러한 설정은 보안 요구 사항을 충족하고, 애플리케이션의 보안성을 높이는 데 중요한 역할을 합니다.