programing

Spring Security 헤더를 사용하지 않도록 설정해도 작동하지 않음

minimums 2023. 7. 7. 18:53
반응형

Spring Security 헤더를 사용하지 않도록 설정해도 작동하지 않음

Spring Security conf에서 캐시 제어 헤더를 비활성화해야 합니다.

문서에 따르면 간단한 것은http.headers.disable()해야 하지만, 나는 여전히 그것을 봅니다.

Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Expires:0
Pragma:no-cache

응답의 머리글입니다.

현재 보안 구성은 다음과 같습니다.

http.antMatcher("/myPath/**") // "myPath" is of course not the real path
    .headers().disable()
    .authorizeRequests()
     // ... abbreviated
    .anyRequest().authenticated();

지금까지 시도한 것들:

application.properties

는 습다니했가를 했습니다.security.headers.cache=false라인, 하지만 그것은 아무런 차이가 없었습니다.

필터 사용

다음 필터를 사용해 보았습니다.

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  chain.doFilter(request, new HttpServletResponseWrapper((HttpServletResponse) response) {
      @Override
      public void setHeader(String name, String value) {
        if (name.equalsIgnoreCase("Cache-Control")) {
          value = "";
        } else if (name.equalsIgnoreCase("Expires")) {
          value = "";
        } else if (name.equalsIgnoreCase("Pragma")) {
          value = "";
        }
        super.setHeader(name, value);
      }
  });
}

로깅을 추가한 후 이 필터는 다음과 같이 기록됩니다.X-XSS-Protection헤더, 모든 캐시 헤더는 나중에 어딘가에 기록되며 이 필터는 이 헤더를 "삭제"할 수 없습니다.보안 필터 체인의 마지막 위치에 이 필터를 추가해도 이 문제가 발생합니다.

인터셉트 사용

다음과 같은 인터셉트를 시도했습니다.

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    String requestUri = request.getRequestURI();
    response.setHeader("Cache-Control", "max-age=3600");
    response.setHeader("Expires", "3600");
    response.setHeader("Pragma", "");
}

의 머리글을 합니다.no-cache헤더는 인터셉터에 의해 추가된 헤더 외에도 계속 나타납니다.

저는 여기서 어찌할 바를 몰라요.Spring 보안에서 설정한 캐시 제어 헤더를 제거하려면 어떻게 해야 합니까?

도움이 될 수 있습니다.

@EnableWebSecurity
public class WebSecurityConfig extends
WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
    // ...
    .headers()
        .defaultsDisabled()
        .cacheControl();
}
}

http://docs.spring.io/spring-security/site/docs/current/reference/html/headers.html#headers-cache-control

필터와 인증 공급자를 구성하려면 두 가지 구성 방법이 재정의된 WebSecurityConfigurerAdapter를 확장하는 클래스가 필요합니다.예를 들어, 다음은 최소한으로 작동합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;

@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfigDemo extends WebSecurityConfigurerAdapter {

    @Autowired
    private DemoAuthenticationProvider demoAuthenticationProvider;

    @Override
    protected void configure(HttpSecurity http) throws Exception {        

    // Prevent the HTTP response header of "Pragma: no-cache".
    http.headers().cacheControl().disable();

    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {        
        auth.authenticationProvider(demoAuthenticationProvider);        
    }    

}

또한 다음과 같이(위와 동일한 클래스에서) 공용 정적 리소스에 대해 Spring Security를 완전히 비활성화할 수 있습니다.

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/static/public/**");
}

이렇게 하려면 캐시 제어 헤더를 올바르게 가져오도록 두 개의 리소스 처리기를 구성해야 합니다.

@Configuration
public class MvcConfigurer extends WebMvcConfigurerAdapter
        implements EmbeddedServletContainerCustomizer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // Resources without Spring Security. No cache control response headers.
        registry.addResourceHandler("/static/public/**")
            .addResourceLocations("classpath:/static/public/");

        // Resources controlled by Spring Security, which
        // adds "Cache-Control: must-revalidate".
        registry.addResourceHandler("/static/**")
            .addResourceLocations("classpath:/static/")
            .setCachePeriod(3600*24);
    }
}

그래서 저는 스스로 답을 찾았습니다.에 나는컨-트롤-헤더가라는 캐시-컨트롤 헤더는 었다-습니만입니다.spring.resources.cachePeriod다음과 다른 값으로 설정합니다.0안 좋은 점은 모든 리소스가 이 설정을 사용하기 때문에 리소스에 따라 다르게 만들 방법이 없는 것으로 알고 있습니다.

질문에 대한 답변이 많은 도움이 되었습니다.

OpenId Connect through를 사용하도록 설정한 후 이 문제가 발생했습니다.@EnableOAuth2Sso내 지원 수업에서., 약6시간동문디읽고결어과본하깅버안,@EnableOAuth2Sso 해야함치에 합니다.WebSecurityConfigurerAdapter그렇지 않으면 사용자 지정 설정이 기본 설정으로 재정의됩니다.

좋아요.

// In Application.java
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

//In WebSecurity.java
@Configuration
@EnableOAuth2Sso  // <- This MUST be here, not above
public class WebSecurity extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.headers().disable();
    }
}

나빠

// In Application.java
@SpringBootApplication
@EnableOAuth2Sso  // <- Will overwrite config below
public class Application {
    //...
}

@Configuration
public class WebSecurity extends WebSecurityConfigurerAdapter {
    //...
}

그래서 저도 비슷한 문제를 겪었습니다. 대부분의 REST 엔드포인트에 Spring이 주입하는 표준 "Don't cache me" 헤더가 있기를 원했지만, 한 엔드포인트에는 제 것을 삽입하려고 합니다.

응답 항목에 제공하는 HttpHeaders 개체에 사용자 자신의 것을 지정하는 것은 작동하지 않습니다.

머리글을 HttpServlet Response에 직접 명시적으로 설정합니다.

Spring은 "Cache-Control", "Pragma" 및 "Expires"를 설정하고 있습니다.다음은 재정의하고 1분 캐시로 설정하는 방법을 보여줍니다.

response.setHeader("Cache-Control", "max-age=60");
response.setHeader("Pragma", "");
HttpHeaders headers = new HttpHeaders();
headers.setExpires(System.currentTimeMillis()+60000);
return new ResponseEntity<>(body, headers, HttpStatus.OK);

사용하는 것이 옳습니다.

http
    .headers().disable()
    ...

헤더를 사용할 수 없습니다.캐시 제어만 비활성화하려면 다음을 사용할 수 있습니다.

http
    .headers()
        .cacheControl().disable()
        .and()
    ...

테스트와 함께 작동하는 것을 보여주는 샘플을 게시했습니다.

내 생각에 당신이 겪고 있는 문제는 당신이 여러 개의 뇌를 가지고 있다는 것입니다.HttpSecurity구성다음과 같은 경우를 기억하십시오.

http
    .antMatchers("/myPath/**")
    ...

다음으로 시작하는 URL/myPath/영향을 받을 것입니다.또한, 여러 개가 있는 경우HttpSecurity각각의 예HttpSecurity인스턴스는 순서대로 고려되며 첫 번째 인스턴스만 고려됩니다.HttpSecurity인스턴스가 사용됩니다.예를 들어 다음과 같은 경우:

@Configuration
@Order(1)
public class MyPathAdminWebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .antMatchers("/myPath/admin/**")
            .authorizeRequests()
                .anyRequest().hasRole("ADMIN");
    }
}

@Configuration
@Order(2)
public class MyPathWebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .antMatchers("/myPath/**")
            .headers()
                .cacheControl().disable();
    }
}

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated();
    }
}

/myPath/admin/abc를 요청하는 경우

첫번째MyPathAdminWebSecurityConfig고려됩니다.부터/myPath/admin/로 시작합니다./myPath/admin/우리는 사용할 것입니다.MyPathAdminWebSecurityConfig다른 구성은 고려하지 않습니다.즉, 이 요청에 대한 헤더를 다시 가져올 수 있습니다.

언급URL : https://stackoverflow.com/questions/36006029/disabling-spring-security-headers-does-not-work

반응형