study/spring-security-in-action

8장 권한 부여 구성: 제한 적용

fd27 2023. 9. 24. 22:13

이 블로그 내용은 아래 도서를 학습한 내용입니다.
학습 도서 정보
스프링 시큐리티 인 액션(Spring Security in Action)
로렌티우 스필카 지음
최민석 옮김
위키북스


  • MVC 선택기 : 경로에 MVC 식을 이용해 엔드포인트를 선택한다.
  • 앤트 선택기: 경로에 앤트 식을 이용해 엔드포인트를 선택한다.
  • 정규식 선택기: 경로에 정규식(regex)을 이용해 엔드포인트를 선택한다.

 

8.1 선택기 메서드로 엔드포인트 선택

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.httpBasic();

    http.authorizeRequests()
            .mvcMatchers("/hello").hasRole("ADMIN")
            .mvcMatchers("/ciao").hasRole("MANAGER");
            
}

위와 같이 설정하면, /hello, /ciao 이외의 모든 요청은 인증되지 않은 사용자를 포함해 기본적으로 모든 사용자에게 접근이 허용된다.

마지막에 아래 구성처럼 설정한 것과 같다.

anyRequests().permitAll()

 

8.2 MVC 선택기로 권한을 부여할 요청 선택

권한 부여 구성을 적용할 요청을 지정하는 일반적인 방법은 MVC 식을 이용하는 것이다. 애플리케이션을 개발할 때도 이 메서드를 이용할 기회가 많다.

이 선택기는 표준 MVC 구문으로 경로를 지정하며 그 구문은 @RequestMapping, @GetMapping, @PostMapping 등의 어노테이션으로 엔드포인트 매핑을 작성할 때의 구문과 동일 하다.

 

  • mvcMatchers(HttpMethod method, String... pattenrs) : 제한을 적용할 HTTP 방식과 경로를 모두 지정할 수 있다. 같은 경로에 대해 HTTP 방식별로 다른 제한을 적용할 때 유용하다.
  • mvcMatchers(String... patterns) : 경로만을 기준으로 권한 부여 제한을 적용할 때 더쉽고 간단하게 이용할 수 있다. 이 메서드를 이용하면 자동으로 해당 경로의 모든 HTTP 방식에 제한이 적용된다.

스프링 시큐리티는 기본적으로 csrf 보호를 적용한다. 그래서 간단한 POST, PUT, DELETE로 노출된 엔드포인트를 테스트하려면 csrf를 비활성화 하여야 한다.

http.csrf().disable();
@RestController
public class TestController {

    @PostMapping("/a")
    public String postEndpointA() {
        return "Works!";
    }

    @GetMapping("/a")
    public String getEndpointA() {
        return "Works!";
    }

    @GetMapping("/a/b")
    public String getEnpointB() {
        return "Works!";
    }

    @GetMapping("/a/b/c")
    public String getEnpointC() {
        return "Works!";
    }
}
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.httpBasic();

    http.authorizeRequests()
            .mvcMatchers( "/a/b/**").authenticated()
            .anyRequest().permitAll();

    http.csrf().disable();
}

 

경로 변수에 엔드포인트를 지정하고 숫자 이외의 다른 값을 포함한 경로 변수를 이용하는 모든 요청을 거부한다.

@RestController
public class ProductController {

    @GetMapping("/product/{code}")
    public String productCode(@PathVariable String code) {
        return code;
    }

}
@Configuration
public class ProjectConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.httpBasic();

        http.authorizeRequests()
                .mvcMatchers( "/product/{code:^[0-9]*$}").permitAll()
                .anyRequest().denyAll();
    }
}
설명
/a /a 경로만
/a/* * 연산자는 한 경로 이름만 대체한다. 이 경우 /a/b 또는 /a/c와는 일치하지만, /a/b/c 와는 일치하지 않는다.
/a/** ** 여러 경로 이름을 대체한다. 이 경우 /a, /a/b, /a/b/c 가 모두 이 식과 일치한다.
/a/{param} 이 식은 주어진 경로 매개 변수를 포함한 /a 경로에 적용된다.
/a/{param:regex} 이 식은 매개 변수 값과 주어진 정규식이 일치할 때만 주어진 경로 매개 변수를 포함한 /a 경로에 적용 된다.

 

8.3 앤트 선택기로 권한을 부여할 요청 선택

앤트 선택기보다 MVC 선택기를 권장한다. 그러나 이전에는 많은 애플리케이션에서 앤트 선택기가 이용됐다.

 

  • antMathcers(HttpMethod method, String patterns): 
  • antMatchers(String patterns):
  • antMatchers(HttpMethod):

MVC 선택기 권장 이유

antMatchers("/hello").authenticated(); 라고 적으면 /hello는 보안 적용되지만, /hello/는 보안이 적용되지 않는다!!

mvcMathcers("/hello").authenticated(); 라고 적으면 /hello와 /hello/ 둘다 보안이 적용된다!!

 

이는 아주 중요한 특징이다! 이를 모르는 개발자가 앤트 선택기를 이용하면 의도치 않게 경로를 보호되지 않는 상태로 방치할 수 있다. 이는 애플리케이션에 중대한 보안 침해를 야기한다.

 

MVC 선택기를 이용하는 것이 좋다. MVC 선택기를 이용하면 스프링의 경로 및 작업 매핑과 관련한 몇가지 위험을 예방할 수 있다. 그 이유는 권한 부여 규칙을 위하 경로를 해석하는 방법과 스프링이 경로를 엔드포인트에 매핑하기 위해 해석하는 방법이 같기 때문이다. 반면에 앤트 선택기를 이용하려면 권한 부여 규칙을 적용할 모든 경로에 확실하게 적용되게 식을 작성해야 한다.

 

8.4 정규식 선택기로 권한을 부여할 요청 선택

 

요약