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();
}
}
필터와 인증 공급자를 구성하려면 두 가지 구성 방법이 재정의된 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
'programing' 카테고리의 다른 글
| JasperReport를 여러 워크시트가 있는 Excel 파일로 내보내려면 어떻게 해야 합니까? (0) | 2023.07.07 |
|---|---|
| 경로에서 파일 이름을 추출하는 방법 (0) | 2023.07.07 |
| 데이터 프레임에 열이 있는지 여부를 확인하는 방법 (0) | 2023.07.07 |
| Oracle용 MyBatis 배치 삽입/업데이트 (0) | 2023.07.07 |
| 앱에서 파일 공유를 활성화하는 방법은 무엇입니까? (0) | 2023.07.02 |