spring-web 모듈은 몇 가지 유용한 필터를 제공합니다.
Form Data
Forwarded Headers
Shallow ETag
CORS
브라우저는 HTTP GET 또는 HTTP POST를 통해서만 양식 데이터를 제출할 수 있지만 브라우저가 아닌 클라이언트도 HTTP PUT, PATCH 및 DELETE를 사용할 수 있습니다. Servlet API는 HTTP POST에 대해서만 form field access을 지원하기 위해 ServletRequest.getParameter*() 메소드가 필요합니다.
spring-web 모듈은 application/x-www-form-urlencoded 콘텐츠 유형으로 HTTP PUT, PATCH 및 DELETE 요청을 가로채기 위해 FormContentFilter를 제공하고, 요청 본문에서 form data를 읽고, ServletRequest를 래핑하여 ServletRequest.getParameter*() 메소드 패밀리를 통해 form data를 사용합니다.
요청이 프록시(예: 로드 밸런서)를 통과할 때 호스트, 포트 및 체계가 변경될 수 있으므로 클라이언트 관점에서 올바른 호스트, 포트 및 체계를 가리키는 링크를 만드는 것이 어렵습니다.
RFC 7239는 프록시가 원래 요청에 대한 정보를 제공하는 데 사용할 수 있는 Forwarded HTTP 헤더를 정의합니다. X-Forwarded-Host, X-Forwarded-Port, X-Forwarded-Proto, X-Forwarded-Ssl 및 X-Forwarded-Prefix를 비롯한 다른 비표준 헤더도 있습니다.
ForwardedHeaderFilter는 a) 전달된 헤더를 기반으로 호스트, 포트 및 체계를 변경하고 b) 추가 영향을 제거하기 위해 해당 헤더를 제거하기 위해 요청을 수정하는 서블릿 필터입니다. 필터는 요청 래핑에 의존하므로 원래 요청이 아닌 수정된 작업과 함께 작동해야 하는 RequestContextFilter와 같은 다른 필터보다 먼저 정렬되어야 합니다.
헤더가 의도한 대로 프록시에 의해 추가되었는지 또는 악의적인 클라이언트에 의해 추가되었는지 애플리케이션이 알 수 없기 때문에 전달된 헤더에 대한 보안 고려 사항이 있습니다. 이것이 외부에서 들어오는 신뢰할 수 없는 Forwarded 헤더를 제거하도록 신뢰 경계에 있는 프록시를 구성해야 하는 이유입니다. 또한 RemoveOnly=true로 ForwardedHeaderFilter를 구성할 수도 있습니다. 이 경우 헤더는 제거하지만 사용하지 않습니다.
비동기 요청 및 오류 디스패치를 지원하려면 이 필터를 DispatcherType.ASYNC 및 DispatcherType.ERROR와 매핑해야 합니다. Spring Framework의 AbstractAnnotationConfigDispatcherServletInitializer(Servlet Config 참조)를 사용하는 경우 모든 디스패치 유형에 대해 모든 필터가 자동으로 등록됩니다. 그러나 web.xml을 통해 또는 FilterRegistrationBean을 통해 Spring Boot에서 필터를 등록하는 경우, DispatcherType.REQUEST 외에 DispatcherType.ASYNC 및 DispatcherType.ERROR를 포함해야 합니다.
ShallowEtagHeaderFilter 필터는 응답에 기록된 콘텐츠를 캐싱하고 MD5 해시를 계산하여 "얕은" ETag를 만듭니다. 다음에 클라이언트가 보낼 때 동일한 작업을 수행하지만 계산된 값을 If-None-Match 요청 헤더와 비교하고 두 값이 같으면 304(NOT_MODIFIED)를 반환합니다.
이 전략은 각 요청에 대해 전체 응답을 계산해야 하므로 CPU가 아닌 네트워크 대역폭을 절약합니다. 앞에서 설명한 컨트롤러 수준의 다른 전략은 계산을 피할 수 있습니다. HTTP 캐싱을 참조하십시오.
이 필터에는 W/"02a2d595e6ed9a0b24f027f2b63b134d6"(RFC 7232 섹션 2.3에 정의됨)과 유사한 약한 ETag를 작성하도록 필터를 구성하는 writeWeakETag 매개변수가 있습니다.
비동기 요청을 지원하려면 이 필터를 DispatcherType.ASYNC와 매핑해야 필터가 지연되고 마지막 비동기 디스패치 끝까지 ETag를 성공적으로 생성할 수 있습니다. Spring Framework의 AbstractAnnotationConfigDispatcherServletInitializer(Servlet Config 참조)를 사용하는 경우 모든 디스패치 유형에 대해 모든 필터가 자동으로 등록됩니다. 그러나 web.xml을 통해 또는 FilterRegistrationBean을 통해 Spring Boot에서 필터를 등록하는 경우 DispatcherType.ASYNC를 포함해야 합니다.
Spring MVC는 컨트롤러의 annotation을 통해 CORS 구성에 대한 세분화된 지원을 제공합니다. 그러나 Spring Security와 함께 사용할 때 Spring Security의 필터 체인보다 먼저 위치해야 하는 내장 CorsFilter에 의존하는 것이 좋습니다.
자세한 내용은 CORS 및 CORS 필터 섹션을 참조하세요.