복붙노트

[SPRING] 스프링 보안 - 캐시 제어를 피할 방법이 없습니다.

SPRING

스프링 보안 - 캐시 제어를 피할 방법이 없습니다.

나는 응용 프로그램을 가지고 있고 스프링의 컨트롤러 매핑을 사용하여 내 사용자에게 이미지를로드합니다. (InputStream, 응답 등).

필자의 컨트롤러에서는 헤더를 캐시 제어, 파일 기반으로 설정했습니다. 그러나 모든 요청에는 항상 no-cache 및 Cache-Control : "max-age = 0"이라는 프라그 마가 있습니다. 이것은 내 응답 설정을 대체합니다.

이 문제를 해결하기 위해 모든 노력을했지만 아무것도 작동하지 않습니다.

나는 이미 모든 페이지를 읽고 그것에 대해 발견 한 모든 것을 시도한다. http://docs.spring.io/autorepo/docs/spring-security/3.2.0.CI-SNAPSHOT/reference/html/headers.html

내 spring security.xml에는 다음과 같은 것들이있다.

    <security:headers disabled="true"/>

누구든지이 문제를 해결할 좋은 생각이 있습니까?

컨트롤러를 통해로드해야하는 이미지를로드하려면 정적을 직접 호출하지 마십시오.

해결법

  1. ==============================

    1.Cache-Control 헤더는 HttpServletResponse에서 오버라이드하여 액션 단위로 제어 할 수 있습니다.

    Cache-Control 헤더는 HttpServletResponse에서 오버라이드하여 액션 단위로 제어 할 수 있습니다.

    @RequestMapping(value = "/foo", method = RequestMethod.GET)
    public String someAction(HttpServletResponse response) {
        response.setHeader("Cache-Control", "no-transform, public, max-age=86400");
    
        // ...
    }
    

    스프링 시큐러티 구성을 조작 할 필요가 없습니다.

    http://docs.spring.io/spring-security/site/docs/current/reference/html/headers.html#headers-cache-control을 참조하십시오.

  2. ==============================

    2.Java 기반 구성을 사용하는 경우 캐시 제어 헤더를 다음과 같이 비활성화 할 수 있습니다.

    Java 기반 구성을 사용하는 경우 캐시 제어 헤더를 다음과 같이 비활성화 할 수 있습니다.

    @Configuration
    @EnableWebMvcSecurity
    class SpringWebSecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(final HttpSecurity http) throws Exception {
            http.headers().cacheControl().disable();
        }
    }
    

    그러면 CacheControlHeadersWriter가 제거되고 Spring은 더 이상 캐시 제어 헤더를 작성하지 않습니다.

  3. ==============================

    3.당신이 링크 한 Per Spring Security 레퍼런스 (3.2.0)

    당신이 링크 한 Per Spring Security 레퍼런스 (3.2.0)

    단순히 헤더를 추가하면 모든 하위 요소 (예 : 캐시 제어, xxs ...)가 켜집니다. 헤더를 전혀 사용하지 않거나 사용할 하위 요소를 명시 적으로 지정하십시오.

    BTW, 나는 장애인 (3.2.0에 대한) 헤더의 속성이라고 생각하지 않습니다. 버전 4.0을 사용하는 경우 disabled-defaults와 같이 disabled 속성이 있습니다.

  4. ==============================

    4.아하의 대답에 추가. 또한 Pragma 헤더를 일부 가비지로 대체해야합니다.

    아하의 대답에 추가. 또한 Pragma 헤더를 일부 가비지로 대체해야합니다.

    @RequestMapping(value = "/foo", method = RequestMethod.GET)
    public String someAction(HttpServletResponse response) {
        response.setHeader("Cache-Control", "no-transform, public, max-age=86400");
        response.setHeader("Pragma", "");
        // ...
    }
    

    Expires 헤더는 여전히 응답에 표시되지만 대부분의 브라우저에서 Cache-Control 헤더에 의해 무시됩니다.

  5. ==============================

    5.언젠가는 -하지만 같은 문제에 대해 연구하는 동안, 나는이 게시물을 발견하고 이것은 또는 나 -

    언젠가는 -하지만 같은 문제에 대해 연구하는 동안, 나는이 게시물을 발견하고 이것은 또는 나 -

    봄 보안에서 특정 URL에 대한 캐싱 사용 중지

    위에서 언급 한 솔루션의 장점은 고유 한 클래스를 사용하여 각 헤더를 구체적으로 사용할 수 있도록하고 antmatcher를 사용하여 특정 요청 경로를 각 헤더에 정렬하는 것입니다. 필자는 캐시 만료 세트가있는 정적 리소스와 캐시가없는 모든 JSP 용으로 별도의 캐시 참조를 사용했습니다. ant matcher이기 때문에, 컨트롤러 uri는 같은 접근법을 사용하여 일치시킬 수 있습니다.

  6. from https://stackoverflow.com/questions/31412918/spring-security-no-way-to-avoid-cache-control by cc-by-sa and MIT license