developer tip

OPTIONS Http 메서드에 대한 Spring 보안 비활성화

copycodes 2020. 11. 16. 21:42
반응형

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

반응형