복붙노트

[SPRING] 스프링 보안 : 클라이언트 유형별 (브라우저 / 비 브라우저) CSRF 활성화 / 비활성화

SPRING

스프링 보안 : 클라이언트 유형별 (브라우저 / 비 브라우저) CSRF 활성화 / 비활성화

닥터는 말한다.

"CSRF 보호를 사용하는 경우 일반 사용자가 브라우저에서 처리 할 수있는 요청에 대해 CSRF 보호를 사용하는 것이 좋습니다. 브라우저가 아닌 클라이언트가 사용하는 서비스 만 만드는 경우에는 CSRF 보호. "

제 서비스가 제 3 자 외부 서비스와 같은 "브라우저"와 "비 브라우저"클라이언트 모두에 의해 사용될 예정이라면 스프링 보안은 특정 유형의 클라이언트에 대해 csrf를 독점적으로 비활성화하는 방법을 제공합니까?

참조 : http://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/csrf.html

해결법

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

    1.Spring Security XML에서이 작업을 수행 할 수있는 방법이있을 것이라고 확신하지만 Java Config를 사용하고 있기 때문에 여기에 내 솔루션이 있습니다.

    Spring Security XML에서이 작업을 수행 할 수있는 방법이있을 것이라고 확신하지만 Java Config를 사용하고 있기 때문에 여기에 내 솔루션이 있습니다.

     @Configuration
     @EnableWebSecurity
     public class SecurityConfig {
    
        @Configuration
        @Order(1)
        public static class SoapApiConfigurationAdapter extends WebSecurityConfigurerAdapter {
            protected void configure(HttpSecurity http) throws Exception {
                http
                    .antMatcher("/soap/**")
                    .csrf().disable()
                    .httpBasic();
            }
        }
    
    
        @Configuration
        public static class WebApiConfigurationAdapter extends WebSecurityConfigurerAdapter {
    
            protected void configure(HttpSecurity http) throws Exception {
                http        
                    .formLogin()
                        .loginProcessingUrl("/authentication")
                        .usernameParameter("j_username")
                        .passwordParameter("j_password").permitAll()
                        .and()
                    .csrf().disable()
    
            }
         }
    }
    
  2. ==============================

    2.IMHO, 상자 밖에서는 아무 것도 없습니다. 내가 귀하의 경우에 어떻게 할 것인가는 csrf가 면제되는 / api에 뿌리를 둔 URL의 계층 구조를 갖는 것입니다. 구성하기 쉽습니다. XML 설정에서 를 포함한 일반적인 블록을 가지고 있습니다. 단지 그것을 복제하고 첫 번째 블록을 수정하면됩니다.

    IMHO, 상자 밖에서는 아무 것도 없습니다. 내가 귀하의 경우에 어떻게 할 것인가는 csrf가 면제되는 / api에 뿌리를 둔 URL의 계층 구조를 갖는 것입니다. 구성하기 쉽습니다. XML 설정에서 를 포함한 일반적인 블록을 가지고 있습니다. 단지 그것을 복제하고 첫 번째 블록을 수정하면됩니다.

    <http pattern="/api/**">
        ...
        <!-- csrf -->
    </http>
    

    처음이므로 csrf를 사용하지 않고 / api 계층 구조에 대한 모든 요청이 트리거되고 다른 모든 요청이이를 사용합니다.

    응용 프로그램의 정상적인 부분에서는 / api / ** url을 사용하지 않고 브라우저 이외의 용도로 사용합니다.

    그런 다음 컨트롤러에서 일반 URL과 / api 아래에있는 복사본에 매핑합니다.

    @Controller
    @RequestMapping({ "/rootcontrollerurl", "/api/rootcontrollerurl"})
    class XController {
        @RequestMapping(value = "/request_part_url", ...)
        public ModelAndView method() {
            ...
        }
    }
    

    (물론 rootcontrollerurl과 request_part_url은 비어있을 수 있습니다 ...)

    그러나 csrf가 아닌 요청을 허용하고 결국에는 / api 계층 구조에서 컨트롤러를 제외시키는 보안 함의를 분석해야합니다.

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

    3.다음은 특정 엔드 포인트에서 CSRF 보호를 비활성화하는 방법입니다. appconfig-security.xml에서 다음 예제와 같이 패턴 정보가있는 노드를 추가하십시오.

    다음은 특정 엔드 포인트에서 CSRF 보호를 비활성화하는 방법입니다. appconfig-security.xml에서 다음 예제와 같이 패턴 정보가있는 노드를 추가하십시오.

    <http security="none" pattern="/sku/*"/>
    <http security="none" pattern="/sku/*/*"/>
    <http security="none" pattern="/sku"/>
    

    그냥 '*'기호를 사용하여 모든 요청을지도를 사용하려는 경우 순서가 중요하다는 것을 명심하십시오.

  4. from https://stackoverflow.com/questions/26179940/spring-security-enable-disable-csrf-by-client-type-browser-non-browser by cc-by-sa and MIT license