복붙노트

[SPRING] 봄 보안, 후행 슬래시 및 URL의 점

SPRING

봄 보안, 후행 슬래시 및 URL의 점

Tomcat에 배포 된 Spring MVC 3.2.4 애플리케이션을 보안하기 위해 Spring Security 3.1.4를 사용합니다. 다음과 같은 스프링 보안 구성이 있습니다.

<http auto-config="true" use-expressions="true">
   <http-basic />
   <logout ... />
   <form-login ... />

   <intercept-url pattern="/" access="isAnonymous() or hasRole('ROLE_USER')" />
   <intercept-url pattern="/about" access="isAnonymous() or hasRole('ROLE_USER')" />
   <intercept-url pattern="/login" access="isAnonymous() or hasRole('ROLE_USER')" />
   <intercept-url pattern="/under-construction" access="isAnonymous() or hasRole('ROLE_USER')" />
   <intercept-url pattern="/admin-task*" access="hasRole('ROLE_USER') and hasRole('ROLE_ADMINISTRATOR')" />
   <intercept-url pattern="/resources/**" access="isAnonymous() or hasRole('ROLE_USER')" />
   <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
</http>

후행 슬래시가없는 URL 패턴 (예 : / about)은 URL과 후행 슬래시 (예 : / about /)가 일치하지 않으며 그 반대도 마찬가지입니다. 즉, 슬래시가없는 동일한 URL과 슬래시가없는 URL은 Spring Security에서 서로 다른 두 개의 URL로 취급됩니다. 이 문제는 두 가지 보안 규칙을 사용하여 해결할 수 있습니다.

<intercept-url pattern="/about" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/about/" access="isAnonymous() or hasRole('ROLE_USER')" />

더 나은 솔루션이 있습니까?

path-type = "regex"는 URL 패턴을 정규 표현식으로 정의 할 수 있지만 가능하면 불필요한 복잡성을 피하고 싶습니다.

최신 정보

Adam Gent가 지적했듯이, /about.foo 및 / about과 같은 URL은 점이있는 URL과 관련하여 Spring MVC에서 동일한 URL로 처리하는 추가 문제가 있습니다. 그러나 Spring Security는 그것들을 두 개의 서로 다른 URL로 취급합니다. 따라서 하나 이상의 보안 규칙이 필요할 수 있습니다.

<intercept-url pattern="/about.*" .../>

해결법

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

    1.스프링 보안은 이제 여러분의 Spring MVC URL 매칭 컨피규레이션을 알고있는 새로운 매처를 추가했다. 이는 Spring Security가 Spring MVC가 사용하는 것과 동일한 규칙을 기반으로하는 경로를 일치 시키므로 URL이 유효하지만 안전하지 않을 가능성을 제거합니다.

    스프링 보안은 이제 여러분의 Spring MVC URL 매칭 컨피규레이션을 알고있는 새로운 매처를 추가했다. 이는 Spring Security가 Spring MVC가 사용하는 것과 동일한 규칙을 기반으로하는 경로를 일치 시키므로 URL이 유효하지만 안전하지 않을 가능성을 제거합니다.

    먼저 오래된 matchers를 새로운 MVC matcher로 교체해야합니다. Spring Security는 이제는 동기화되어 있지만 Spring MVC를 구성하여 경로 일치 구성을 추가하거나 제거 할 수 있습니다. 가능한 경우 기본값을 사용하는 것이 좋습니다.

    antMatchers를 사용하고 있다면 이제 mvcMatchers를 사용해야합니다.

    protected configure(HttpSecurity http) throws Exception {
      http.authorizeRequests()
            .mvcMatchers("/about").hasRole("USER");
    }
    

    http 태그에 속성 요청 matcher를 추가해야합니다.

    <http request-matcher="mvc">
      <intercept-url pattern="/about" access="hasRole('USER')"/>
    </http>
    

    전체 참조

    Spring Security가 이것을 자동으로 수행하므로 역할에 "ROLE_"접두사를 붙이지 않아야합니다.

    스프링 보안에서 후행 슬래시와 경로 접미사를 처리하는 방법을 찾지 못했습니다. 분명히 이러한 경우를 처리하기 위해 정규 표현식을 작성할 수는 있지만 보안 규칙이 지나치게 복잡하고 오류가 발생할 수 있습니다. 나는 실수로 자원을 노출시키지 않을 것이라고 최대한 확신하고 싶습니다.

    따라서, 내 접근 방식은 후행 슬래시와 접미사에 대해 엄격한 경로 일치를 구성하여 Spring에서이 동작을 비활성화하는 것입니다.

    @Configuration
    public class ServletConfig extends WebMvcConfigurerAdapter {
      @Override
      public void configurePathMatch(final PathMatchConfigurer configurer) {
        configurer.setUseSuffixPatternMatch(false);
        configurer.setUseTrailingSlashMatch(false);
      }
    }
    
    <mvc:annotation-driven>
      <mvc:path-matching suffix-pattern="false" trailing-slash="false" />
    </mvc:annotation-driven>
    
  2. ==============================

    2.

    <intercept-url pattern="/about/**"...
    

    또한 Spring Security 3.1.4에서 나에게 적합하다. 이 보안 / about, / about /, and / about / anything_else

  3. from https://stackoverflow.com/questions/20590794/spring-security-trailing-slashes-and-dots-in-urls by cc-by-sa and MIT license