OPTIONS Http 메서드에 대한 Spring 보안 비활성화
HTTP 메서드 유형에 대해 Spring Security를 비활성화 할 수 있습니까?
http 요청의 헤더에 인증 토큰을 첨부해야하는 서비스가있는 Spring REST 애플리케이션이 있습니다. 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에서 Security Layer를 벗어나도록 할 수 있습니까?
이것을 시도해 보셨습니까?
여러 요소를 사용하여 서로 다른 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 패턴과 원하는 방법을 선택해야 함을 의미합니다.
주석 기반 보안 구성 파일 ( @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();
}
컨텍스트에서 모든 옵션 허용 :
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**");
}
누군가가 Spring Boot를 사용하여 쉬운 솔루션을 찾고있는 경우. 빈을 추가하기 만하면됩니다.
@Bean
public IgnoredRequestCustomizer optionsIgnoredRequestsCustomizer() {
return configurer -> {
List<RequestMatcher> matchers = new ArrayList<>();
matchers.add(new AntPathRequestMatcher("/**", "OPTIONS"));
configurer.requestMatchers(new OrRequestMatcher(matchers));
};
}
Please note that depending on your application this may open it for potential exploits.
Opened issue for a better solution: https://github.com/spring-projects/spring-security/issues/4448
In some cases, it is needed add configuration.setAllowedHeaders(Arrays.asList("Content-Type"));
to corsConfigurationSource()
when using WebSecurityConfigurerAdapter
to solve the cors problem.
참고URL : https://stackoverflow.com/questions/21696592/disable-spring-security-for-options-http-method
'developer tip' 카테고리의 다른 글
Clojure XML 구문 분석 (0) | 2020.11.17 |
---|---|
Thymeleaf : Concatenation-식으로 구문 분석 할 수 없습니다. (0) | 2020.11.16 |
Python을 사용하여 웹 페이지를 PDF로 변환하는 방법 (0) | 2020.11.16 |
matplotlib에서 축 값 숨기기 (0) | 2020.11.16 |
현재 테마에서 'coordinatorLayoutStyle'스타일을 찾지 못했습니다. (0) | 2020.11.16 |