[Security] __AuthorizationFilter?__

Authorize HttpServletRequests with AuthorizationFilter :: Spring Security
This version is still in development and is not considered stable yet. For the latest stable version, please use Spring Security 6.2.1!
https://docs.spring.io/spring-security/reference/5.7-SNAPSHOT/servlet/authorization/authorize-http-requests.html#page-title

AuthorizationFilter?

  • 인증된 요청이 특정 자원에 대한 접근 권한을 가지고 있는지 확인하는 역할임
  • 스프링 필터 체인에 포함되어 잇음.
    • 사용자의 요청이 처리되기 전에 해당 요청이 허용된 권한을 가진 사용자에 의해 이루어졌는지 검사한다.
@Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {   
        http.
// 중략
                .authorizeHttpRequests((authorize) -> authorize
                        .antMatchers("/", "/refresh-token", "/login")
                        .permitAll()
                        .anyRequest()
                        .authenticated()
                )
//중략
        return http.build();
    }

authorize의 타입 → AbstractRequestMatcherRegistry

  • authorizeHttpRequests 메서드는
    public HttpSecurity authorizeHttpRequests(
    			Customizer<AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry> authorizeHttpRequestsCustomizer)
    			throws Exception {
    		ApplicationContext context = getContext();
    		authorizeHttpRequestsCustomizer
    				.customize(getOrApply(new AuthorizeHttpRequestsConfigurer<>(context)).getRegistry());
    		return HttpSecurity.this;
    	}
    • 인자로 AuthorizationManagerRequestMatcherRegistry 를 받으며 Customizer 를 통해 람다식으로 인자를 받을 수 있게 된다..

antMatchers 로 여러 URI 를 기입할 수 있는 이유?

  • AbstractRequestMathcerRegistry.antMathers
    public C antMatchers(String... antPatterns) {
    		Assert.state(!this.anyRequestConfigured, "Can't configure antMatchers after anyRequest");
    		return chainRequestMatchers(RequestMatchers.antMatchers(antPatterns));
    	}
    • 가변인자 설정으로 여럿 인자를 받을 수 있음.
    • 그리고 패턴에 대해 별도 검증을 위해 여럿 메서드를 타고들어가는데, 거기서 현재 request uri 와 대조해 체크를 하는 것 같다.

permitAll()??

  • AuthorizeHttpRequestsConfigurer.permitAll() 메서드
    public AuthorizationManagerRequestMatcherRegistry permitAll() {
    			return access(permitAllAuthorizationManager);
    		}
    • 메서드를 타고 들어가다 보면 AuthorizeHttpRequestsConfigurer.addMapping 에서
      private AuthorizationManagerRequestMatcherRegistry addMapping(List<? extends RequestMatcher> matchers,
      			AuthorizationManager<RequestAuthorizationContext> manager) {
      		for (RequestMatcher matcher : matchers) {
      			this.registry.addMapping(matcher, manager);
      		}
      		return this.registry;
      	}
      • registry
        • 즉.
        private final AuthorizationManagerRequestMatcherRegistry registry;
        • 에 해당 매핑을 등록하게된다.

anyRequest()..?

  • AbstractRequestMatcherRegistry.anyRequest()
    public C anyRequest() {
    		Assert.state(!this.anyRequestConfigured, "Can't configure anyRequest after itself");
    		C configurer = requestMatchers(ANY_REQUEST);
    		this.anyRequestConfigured = true;
    		return configurer;
    	}
    • 이전 필터에서 걸리지 않은 모든 요청을 의미한다.
      • ANY_REQUEST 상수필드의 경우
        public final class AnyRequestMatcher implements RequestMatcher {
        
        	public static final RequestMatcher INSTANCE = new AnyRequestMatcher();
        
        	private AnyRequestMatcher() {
        	}
        
        	@Override
        	public boolean matches(HttpServletRequest request) {
        		return true;
        	}
        • 해당 클래스와 이어져있는데
          • matches 메서드를 상속받고
          • 항상 을 반환하는 것으로 보아..
          • URI 대조시 무조건 필터가 적용됨을 가정하기 위함인것같다.
      • this.anyRequestConfigured = true;
        • 의 경우
        • AbstractRequestMatherRegistry (추상 클래스에서) 곳곳에
          public C antMatchers(String... antPatterns) {
          		Assert.state(!this.anyRequestConfigured, "Can't configure antMatchers after anyRequest");
          		return chainRequestMatchers(RequestMatchers.antMatchers(antPatterns));
          	}

          Assert.state(!this.anyRequestConfigured, "Can't configure antMatchers after anyRequest"); 라는 실패조건의 분기가 걸려있는 것을 볼 수 있는데

          anyRequest() 체이닝 이후에는 어떠한 필터를 설정하더라도, 적용될 수 없으니, 빠른 실패를 시켜주는 것으로 보인다.


Uploaded by N2T