본문 바로가기

카테고리 없음

[Spring Boot] Security6 사용하는 내장 필터 로그 및 콘솔 확인

 

 

 

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 요청 헤더는 클라이언트가 서버로 보내는 요청에 대한 메타데이터를 포함합니다. 요청 헤더에는 다양한 종류의 정보가 포함될 수 있으며, 이는 필터 체인에서 보안, 인증, 인가 등의 작업을 수행하는 데 사용될 수 있습니다. 다음은 이미지에서 볼 수 있는 요청 헤더 정보입니다:

  1. servletPath: 요청된 서블릿 경로 (예: /login)
  2. pathInfo: 추가 경로 정보 (null인 경우도 있음)
  3. host: 요청된 호스트와 포트 (예: localhost:8080)
  4. connection: 연결 설정 (예: keep-alive)
  5. cache-control: 캐시 제어 설정 (예: max-age=0)
  6. sec-ch-ua: 클라이언트의 사용자 에이전트 정보
  7. upgrade-insecure-requests: 보안 요청 업그레이드 설정 (예: 1)
  8. user-agent: 클라이언트 소프트웨어 정보 (예: 브라우저 정보)
  9. accept: 클라이언트가 허용하는 콘텐츠 타입
  10. sec-fetch-site, sec-fetch-mode, sec-fetch-user, sec-fetch-dest: 리소스 페치와 관련된 정보
  11. accept-encoding: 클라이언트가 허용하는 인코딩 방식 (예: gzip, deflate, br)
  12. accept-language: 클라이언트가 허용하는 언어 (예: ko-KR,ko; q=0.8, en; q=0.7)
  13. 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 필터 체인

  1. DisableEncodeUrlFilter: URL 인코딩을 비활성화합니다.
  2. ForceEagerSessionCreationFilter: 세션을 즉시 생성합니다.
  3. ForceEagerSessionCreationFilter: 세션을 즉시 생성합니다.
  4. WebAsyncManagerIntegrationFilter: 비동기 요청을 지원합니다.
  5. SecurityContextPersistenceFilter: SecurityContext를 세션에서 가져오거나 저장합니다.
  6. HeaderWriterFilter: 응답 헤더를 설정합니다.
  7. CorsFilter: CORS 설정을 처리합니다.
  8. CsrfFilter: CSRF 보호를 처리합니다.
  9. LogoutFilter: 로그아웃 요청을 처리합니다.
  10. UsernamePasswordAuthenticationFilter: 사용자 이름과 비밀번호로 인증을 처리합니다.
  11. DefaultLoginPageGeneratingFilter: 기본 로그인 페이지를 생성합니다.
  12. DefaultLogoutPageGeneratingFilter: 기본 로그아웃 페이지를 생성합니다.
  13. BasicAuthenticationFilter: HTTP 기본 인증을 처리합니다.
  14. CsrfCookieFilter: CSRF 토큰을 쿠키에 저장합니다.
  15. RequestCacheAwareFilter: 요청 캐시를 사용합니다.
  16. SecurityContextHolderAwareRequestFilter: 보안 컨텍스트를 요청에 반영합니다.
  17. AnonymousAuthenticationFilter: 익명 사용자를 위한 인증을 처리합니다.
  18. SessionManagementFilter: 세션 관리를 처리합니다.
  19. ExceptionTranslationFilter: 보안 예외를 처리합니다.
  20. AuthorizationFilter: URL 접근 권한을 제어합니다.

요약

이 필터 체인은 Spring Security가 HTTP 요청을 처리하는 동안 수행하는 다양한 보안 작업을 나타냅니다. 각 필터는 특정 보안 작업을 수행하며, 체인 내의 필터들은 순차적으로 실행됩니다. 디버그 모드를 활성화하면 이러한 필터들의 실행 순서와 동작을 로그에서 확인할 수 있습니다. 이러한 설정은 보안 요구 사항을 충족하고, 애플리케이션의 보안성을 높이는 데 중요한 역할을 합니다.