HeaderWriterFilter

728x90

HeaderWriterFilter

HeaderWriterFilter 목적

  • 이 필터는 DefaultSecurityFilterChain 에 기본적으로 등록되며, 네 번째에 위치한다.
  • HTTP 응답 헤더에 보안 관련 헤더를 추가하여 클라이언트를 보호한다.
  • 기본적으로 다양한 보안 헤더가 자동으로 추가되며, 이를 통해 XSS, MIME 스니핑, Clickjacking 등의 공격을 방지할 수 있다.
  • 커스텀 SecurityFilterChain 을 생성해도 기본적으로 등록되며, 비활성화하려면 아래와 같이 설정할 수 있다.
http.headers((headers) ->headers.disable());
  • 하지만 보안상의 이유로 비활성화하지 않는 것이 권장된다. 필요에 따라 특정 헤더만 비활성화하는 것이 좋다.

HeaderWriterFilter 클래스

public class HeaderWriterFilter extends OncePerRequestFilter {

  private final List<HeaderWriter> headerWriters;
  private final boolean shouldWriteHeadersEagerly;

  // 생성자 및 로직 생략...

  @Override
  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
    throws ServletException, IOException {
    if (this.shouldWriteHeadersEagerly) {
      for (HeaderWriter writer : this.headerWriters) {
        writer.writeHeaders(request, response);
      }
    }

    filterChain.doFilter(request, response);
  }
}

동작 방식

  • HeaderWriterFilter 는 요청이 들어오면 headerWriters 목록을 순회하며 응답 헤더를 추가한다.
  • 기본적으로 서블릿이 응답을 보내는 시점에 헤더가 추가되지만, 설정에 따라 필터가 실행되는 즉시 헤더를 추가할 수도 있다.

HeaderWriterFilter 로 추가되는 기본 헤더

헤더명 설명
X-Content-Type-Options MIME 스니핑 방지 (nosniff)
X-XSS-Protection XSS 공격 감지 시 페이지 로딩 차단 (기본값: 1; mode=block)
Cache-Control 캐싱 관련 정책 (no-cache, no-store, must-revalidate)
Pragma HTTP/1.0 방식의 캐시 정책 (no-cache)
Expires 캐시 만료 시간 (기본적으로 0으로 설정)
X-Frame-Options Clickjacking 방지 (DENY 또는 SAMEORIGIN)
Strict-Transport-Security HSTS 활성화 (max-age=31536000; includeSubDomains)
Content-Security-Policy 콘텐츠 보안 정책 (XSS 및 데이터 인젝션 방어)
Referrer-Policy 리퍼러 정보 노출 정책 (no-referrer-when-downgrade)
Permissions-Policy 특정 기능 사용 제한 (geolocation=(), microphone=())

적용된 헤더 확인 방법

  • 브라우저 개발자 도구 (F12) → 네트워크 탭 → 요청 선택 → 응답 헤더 확인

커스텀 헤더 설정 방법

  • 기본 제공되는 헤더 외에 추가적인 헤더를 설정하거나 특정 헤더를 비활성화할 수 있다.

특정 보안 헤더 수정

http
  .headers(headers -> headers
    .frameOptions(frameOptions -> frameOptions.sameOrigin()) // iframe 사용 허용 (같은 출처)
    .cacheControl(cache -> cache.disable()) // 캐시 비활성화
    .contentTypeOptions(contentTypeOptions -> contentTypeOptions.disable()) // MIME 스니핑 방지 해제
  );

사용자 정의 헤더 추가

http
  .headers(headers -> headers
    .addHeaderWriter((request, response) -> {
      response.setHeader("X-Custom-Header", "MyHeaderValue");
    })
  );
728x90

'시리즈 > Spring Security' 카테고리의 다른 글

CsrfFilter  (0) 2025.05.12
CorsFilter  (0) 2025.05.11
SecurityContextHolderFilter  (0) 2025.05.09
WebAsyncManagerIntegrationFilter  (0) 2025.05.08
DisableEncodeUrlFilter  (0) 2025.05.07