programing

OPTIONS http 메서드의 스프링 보안 비활성화

powerit 2023. 3. 19. 19:34
반응형

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

반응형