복붙노트

[SPRING] 스프링 보안 3.2 특정 URL에 대한 CSRF 비활성화

SPRING

스프링 보안 3.2 특정 URL에 대한 CSRF 비활성화

Spring 보안 3.2를 사용하는 Spring MVC 애플리케이션에서 CSRF를 사용 가능하게했다.

내 spring-security.xml

<http>
 <intercept-url pattern="/**/verify"  requires-channel="https"/>
 <intercept-url pattern="/**/login*"  requires-channel="http"/>
 ...
 ...
 <csrf />
</http>

요청 URL에 'verify'가 포함 된 요청에 대해 CSRF를 비활성화하려고합니다.

MySecurityConfig.java

@Configuration
@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {

private CsrfMatcher csrfRequestMatcher = new CsrfMatcher();

@Override
public void configure(HttpSecurity http) throws Exception {

    http.csrf().requireCsrfProtectionMatcher(csrfRequestMatcher);

}

class CsrfMatcher implements RequestMatcher {
    @Override
    public boolean matches(HttpServletRequest request) {

        if (request.getRequestURL().indexOf("verify") != -1)
            return false;
        else if (request.getRequestURL().indexOf("homePage") != -1)         
            return false;

        return true;
    }
}

}

Csrf 필터는 'verify'에서 제출 된 CSRF 토큰의 유효성을 검사하며 http에서 https에 대한 요청을 제출할 때 잘못된 토큰 예외 (403)가 발생합니다. 그런 시나리오에서 어떻게 csrf 토큰 인증을 비활성화 할 수 있습니까?

해결법

  1. ==============================

    1.나는 이것이 직접적인 대답은 아니라는 것을 알고 있지만, 사람들은 (나 같은) 대개 이런 종류의 질문을 검색 할 때 스프링의 버전을 명시하지 않는다. 따라서 봄 보안 이후 일부 경로를 무시할 수있는 방법이 있습니다.

    나는 이것이 직접적인 대답은 아니라는 것을 알고 있지만, 사람들은 (나 같은) 대개 이런 종류의 질문을 검색 할 때 스프링의 버전을 명시하지 않는다. 따라서 봄 보안 이후 일부 경로를 무시할 수있는 방법이 있습니다.

    다음 사항은 CSRF 보호가 무시한다는 것을 보장한다.

         http
             .csrf()
                 .ignoringAntMatchers("/sockjs/**")
                 .and()
             ...
    
  2. ==============================

    2.내 대답이 다른 사람을 도울 수 있기를 바랍니다. 이 질문은 스프링 부트의 특정 URL에 대해 CSRF를 비활성화하는 방법을 찾아 냈습니다.

    내 대답이 다른 사람을 도울 수 있기를 바랍니다. 이 질문은 스프링 부트의 특정 URL에 대해 CSRF를 비활성화하는 방법을 찾아 냈습니다.

    여기에 설명 된 솔루션을 사용했습니다. http://blog.netgloo.com/2014/09/28/spring-boot-enable-the-csrf-check-selectively-only-for-some-requests/

    이것은 일부 URL에서 CSFR 제어를 비활성화 할 수있는 스프링 보안 구성입니다.

    @Configuration
    @EnableWebMvcSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
      @Override
      protected void configure(HttpSecurity http) throws Exception {
    
        // Build the request matcher for CSFR protection
        RequestMatcher csrfRequestMatcher = new RequestMatcher() {
    
          // Disable CSFR protection on the following urls:
          private AntPathRequestMatcher[] requestMatchers = {
              new AntPathRequestMatcher("/login"),
              new AntPathRequestMatcher("/logout"),
              new AntPathRequestMatcher("/verify/**")
          };
    
          @Override
          public boolean matches(HttpServletRequest request) {
            // If the request match one url the CSFR protection will be disabled
            for (AntPathRequestMatcher rm : requestMatchers) {
              if (rm.matches(request)) { return false; }
            }
            return true;
          } // method matches
    
        }; // new RequestMatcher
    
        // Set security configurations
        http
          // Disable the csrf protection on some request matches
          .csrf()
            .requireCsrfProtectionMatcher(csrfRequestMatcher)
            .and()
          // Other configurations for the http object
          // ...
    
        return;
      } // method configure
    
    
      @Autowired
      public void configureGlobal(AuthenticationManagerBuilder auth) 
          throws Exception {
    
        // Authentication manager configuration  
        // ...
    
      }
    
    }
    

    이것은 Spring Boot 1.2.2 (및 Spring Security 3.2.6)와 함께 작동합니다.

  3. ==============================

    3.스프링 보안 v4.1을 사용하고 있습니다. 읽기 및 테스트를 많이 한 후에 XML 구성을 사용하여 특정 URL에 대한 crcf 보안 기능을 비활성화합니다.

    스프링 보안 v4.1을 사용하고 있습니다. 읽기 및 테스트를 많이 한 후에 XML 구성을 사용하여 특정 URL에 대한 crcf 보안 기능을 비활성화합니다.

    <beans:beans xmlns="http://www.springframework.org/schema/security"
                 xmlns:beans="http://www.springframework.org/schema/beans"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xmlns:util="http://www.springframework.org/schema/util"
                 xsi:schemaLocation="
        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    
        <http pattern="/files/**" security="none" create-session="stateless"/>
    
        <http>
            <intercept-url pattern="/admin/**" access="hasAuthority('GenericUser')" />
            <intercept-url pattern="/**" access="permitAll" />
            <form-login 
                login-page="/login" 
                login-processing-url="/login"
                authentication-failure-url="/login"
                default-target-url="/admin/"
                password-parameter="password"
                username-parameter="username"
            />
            <logout delete-cookies="JSESSIONID" logout-success-url="/login" logout-url="/admin/logout" />
            <http-basic />
            <csrf request-matcher-ref="csrfMatcher"/>
        </http>
    
        <beans:bean id="csrfMatcher" class="org.springframework.security.web.util.matcher.OrRequestMatcher">
            <beans:constructor-arg>
                <util:list value-type="org.springframework.security.web.util.matcher.RequestMatcher">
                    <beans:bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
                        <beans:constructor-arg name="pattern" value="/rest/**"/>
                        <beans:constructor-arg name="httpMethod" value="POST"/>
                    </beans:bean>
                    <beans:bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
                        <beans:constructor-arg name="pattern" value="/rest/**"/>
                        <beans:constructor-arg name="httpMethod" value="PUT"/>
                    </beans:bean>
                    <beans:bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
                        <beans:constructor-arg name="pattern" value="/rest/**"/>
                        <beans:constructor-arg name="httpMethod" value="DELETE"/>
                    </beans:bean>
                </util:list>
            </beans:constructor-arg>
        </beans:bean>
    
        //...
    
    </beans:bean>
    

    위의 구성으로 / rest /로 시작하는 모든 URL의 POST | PUT | DELETE 요청에 대해서만 crcf 보안을 사용할 수 있습니다.

  4. ==============================

    4.다음은 XML 구성을 사용하여 URL에 대한 CSRF 확인을 비활성화하는 방법에 대한 잘 수행 된 블로그입니다.

    다음은 XML 구성을 사용하여 URL에 대한 CSRF 확인을 비활성화하는 방법에 대한 잘 수행 된 블로그입니다.

    http://blogs.sourceallies.com/2014/04/customizing-csrf-protection-in-spring-security/

    불행히도 내 버전 인 Spring Security 3.2.8에서는 작동하지 않는 것 같습니다.

  5. ==============================

    5.일시적으로이 간단한 행은 편리 할 수 ​​있습니다.

    일시적으로이 간단한 행은 편리 할 수 ​​있습니다.

    <http pattern="/home/test**" security="none" />
    
  6. ==============================

    6.security = "none"을 사용하십시오. 예 : spring-security-config.xml

    security = "none"을 사용하십시오. 예 : spring-security-config.xml

    <security:intercept-url pattern="/*/verify" security="none" />
    
  7. from https://stackoverflow.com/questions/22524470/spring-security-3-2-csrf-disable-for-specific-urls by cc-by-sa and MIT license