OPTIONS http 메서드의 스프링 보안 비활성화
HTTP 메서드의 종류에 대해 스프링보안을 디세블로 할 수 있습니까?
Spring REST 어플리케이션에는 인가 토큰을 http 요청 헤더에 부가해야 하는 서비스가 있습니다.JS 클라이언트를 작성하고 있으며, JQuery를 사용하여 GET/POST 요청을 보내고 있습니다.애플리케이션은 이 필터 코드로 CORS 대응.
doFilter(....) {
HttpServletResponse httpResp = (HttpServletResponse) response;
httpResp.setHeader("Access-Control-Allow-Origin", "*");
httpResp.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
httpResp.setHeader("Access-Control-Max-Age", "3600");
Enumeration<String> headersEnum = ((HttpServletRequest) request).getHeaders("Access-Control-Request-Headers");
StringBuilder headers = new StringBuilder();
String delim = "";
while (headersEnum.hasMoreElements()) {
headers.append(delim).append(headersEnum.nextElement());
delim = ", ";
}
httpResp.setHeader("Access-Control-Allow-Headers", headers.toString());
}
단, JQuery가 CORS에 대한 OPTIONS 요청을 전송하면 서버는 Authorization Failed 토큰으로 응답합니다.OPTIONS 요청에는 Authorization 토큰이 없습니다.OPTIONS를 Spring Security Configuration에서 보안 레이어를 벗어날 수 있을까요?
주석 기반 보안 구성 파일을 사용하는 경우(@EnableWebSecurity
&@Configuration
)에서는 다음과 같은 작업을 수행할 수 있습니다.configure()
을 가능하게 하는 방법OPTION
특정 경로에 대한 인증 없이 Spring Security에 의해 허용되는 요구:
@Override
protected void configure(HttpSecurity http) throws Exception
{
http
.csrf().disable()
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS,"/path/to/allow").permitAll()//allow CORS option calls
.antMatchers("/resources/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
}
컨텍스트에서 모든 OPTIONS 허용:
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**");
}
이거 먹어봤어?
여러 요소를 사용하여 URL 세트마다 다른 접근요건을 정의할 수 있지만 나열된 순서대로 평가되고 첫 번째 일치가 사용됩니다.그래서 가장 구체적인 성냥을 맨 위에 넣어야 합니다.메서드 속성을 추가하여 특정 HTTP 메서드(GET, POST, PUT 등)로 일치를 제한할 수도 있습니다.
<http auto-config="true">
<intercept-url pattern="/client/edit" access="isAuthenticated" method="GET" />
<intercept-url pattern="/client/edit" access="hasRole('EDITOR')" method="POST" />
</http>
위는 대행 수신할 URL 패턴과 원하는 방법을 선택해야 함을 의미합니다.
승인된 답변은 권장되지 않습니다.그러면 안 됩니다.
다음은 Spring Security와 jQuery's ajax의 CORS 셋업을 위한 올바른 방법입니다.
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(userAuthenticationProvider);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors() // <-- This let it use "corsConfigurationSource" bean.
.and()
.authorizeRequests()
.anyRequest().authenticated()
.and()
...
}
@Bean
protected CorsConfigurationSource corsConfigurationSource() {
final CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Collections.singletonList("http://localhost:3000"));
configuration.setAllowedMethods(Arrays.asList("HEAD", "GET", "POST", "PUT", "DELETE", "PATCH"));
// NOTE: setAllowCredentials(true) is important,
// otherwise, the value of the 'Access-Control-Allow-Origin' header in the response
// must not be the wildcard '*' when the request's credentials mode is 'include'.
configuration.setAllowCredentials(true);
// NOTE: setAllowedHeaders is important!
// Without it, OPTIONS preflight request will fail with 403 Invalid CORS request
configuration.setAllowedHeaders(Arrays.asList(
"Authorization",
"Accept",
"Cache-Control",
"Content-Type",
"Origin",
"ajax", // <-- This is needed for jQuery's ajax request.
"x-csrf-token",
"x-requested-with"
));
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
그리고 jQuery 쪽에서.
$.ajaxSetup({
// NOTE: Necessary for CORS
crossDomain: true,
xhrFields: {
withCredentials: true
}
});
Spring Boot을 사용하여 간단한 솔루션을 찾고 있는 경우.콩을 하나 더 넣기만 하면 됩니다.
@Bean
public IgnoredRequestCustomizer optionsIgnoredRequestsCustomizer() {
return configurer -> {
List<RequestMatcher> matchers = new ArrayList<>();
matchers.add(new AntPathRequestMatcher("/**", "OPTIONS"));
configurer.requestMatchers(new OrRequestMatcher(matchers));
};
}
사용하시는 어플리케이션에 따라서는 악용 가능성이 있는 경우가 있습니다.
보다 나은 솔루션을 위해 발행된 호:https://github.com/spring-projects/spring-security/issues/4448
주석 기반 보안 구성을 사용하는 경우 스프링을 추가해야 합니다.CorsFilter
호출하여 응용 프로그램콘텍스트에 접속하다.cors()
다음과 같습니다.
@Override
protected void configure(HttpSecurity http) throws Exception
{
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/resources/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic()
.and()
.cors();
}
경우에 따라 추가가 필요할 수 있습니다.configuration.setAllowedHeaders(Arrays.asList("Content-Type"));
로.corsConfigurationSource()
사용할 때WebSecurityConfigurerAdapter
코르스 문제를 해결하려고요
언급URL : https://stackoverflow.com/questions/21696592/disable-spring-security-for-options-http-method
'programing' 카테고리의 다른 글
ajax jquery 단순 가져오기 요청 (0) | 2023.03.19 |
---|---|
React Native에서 ScrollView의 현재 스크롤 위치를 가져옵니다. (0) | 2023.03.19 |
WordPress를 통해 액세스할 수 있는 커스텀 기능 필요 (0) | 2023.03.19 |
jQuery click 기능이 Ajax 호출 후 작동하지 않습니까? (0) | 2023.03.19 |
Sys.WebForms.PageRequestManagerServerErrorException:서버에서 요청을 처리하는 동안 알 수 없는 오류가 발생했습니다." (0) | 2023.03.19 |