본문 바로가기
Develop/Spring

Spring Security 권한 부여 처리 흐름

by jaeyoungb 2022. 11. 22.

애플리케이션의 중요한 보안 요소 중 인증에 대한 처리가 되었다면, 권한 부여(Authorization, 인가)에 대한 요소도 체크해야 한다. 인증에 성공한 사용자라도, 주어진 권한 내에서 리소스에 접근할 수 있도록 해야 한다.

 

Spring Security의 컴포넌트로 보는 권한 부여(Authorization) 처리 흐름

 

  1. AuthorizationFilter는 SecurityContextHolder로부터 Authentication을 획득
  2. 획득한 Authentication과 HttpServletRequest를 AuthorizationManager에게 전달
  3. RequestMatcherDelegatingAuthorizationManager 내부에 매치되는 AuthorizationManager 구현 클래스가 있으면, 해당 AuthorizationManager 구현 클래스가 사용자의 권한을 체크
  4. 적절한 권한일 경우, 다음 요청 프로세스를 진행
  5. 적절한 권한이 아닐 경우, AccessDeniedException이 throw되고, ExceptionTranslationFilter가 AccessDeniedException을 처리

* Spring Security 5.5 이전 버전까지는 FilterSecurityInterceptor를 통한 권한 부여 처리 과정이 굉장히 복잡했지만,
Spring Security 5.5 버전부터 AuthorizationFilter를 통해,
AuthorizationManager  API를 이용해서 간결하게 권한 부여 처리를 할 수 있게 되었다.

 

 

AuthorizationFilter

  • URL을 통해, 사용자의 액세스를 제한하는 권한 부여 Filter
  • Spring Security 5.5 버전부터 FilterSecurityInterceptor를 대체
  • 생성자 주입을 통해 DI 받은 AuthorizationManager으로 권한 부여 처리를 진행
  • DI 받은 AuthorizationManager의 check() 메서드를 호출해서 적절한 권한 부여 여부를 체크

(URL 기반으로 권한 부여 처리를 하는 AuthorizationFilter는 AuthorizationManager의 구현 클래스로, RequestMatcherDelegatingAuthorizationManager를 사용)

 

AuthorizationFilter에 대해

- https://docs.spring.io/spring-security/site/docs/5.7.3/api/org/springframework/security/web/access/intercept/AuthorizationFilter.html

 

 

AuthorizationManager

  • 권한 부여 처리 총괄 역할을 하는 인터페이스
  • check() 메서드 하나만 정의되어 있고, 파라미터로 Supplier와 제네릭 타입의 객체를 가짐

AuthorizationManager에 대해

- https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/authorization/AuthorizationManager.html

 

 

RequestMatcherDelegatingAuthorizationManager

  • AuthorizationManager 인터페이스를 구현하는 구현 클래스 중 하나
  • RequestMatcher 평가식을 기반으로 해당 평가식에 매치되는 AuthorizationManager에게 권한 부여 처리를 위임
  • check() 메서드 내부에서 루프를 돌면서 RequestMathcerEntry 정보를 얻은 후, RequestMatcher 객체를 얻음
  • 이후 MatchResult.isMatch()가 true이면, AuthorizationManager 객체를 얻은 후, 사용자의 권한을 체크

* RequestMatcherDelegatingAuthorizationManager가 직접 권한 부여 처리를 하는 것이 아닌, RequestMatcher를 통해 매치되는 AuthorizationManager 구현 클래스에게 위임만 한다.

* RequestMatcher는 SecurityConfiguration에서 .antMatchers("/orders/**").hasRole("ADMIN")와 같은 메서드 체인 정보를 기반으로 생성된다.

 

RequestMatcherDelegatingAuthorizationManagerd에 대해

- https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/web/access/intercept/RequestMatcherDelegatingAuthorizationManager.html

 

 

ExceptionTranslationFilter의 처리 흐름에 대해

- https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-exceptiontranslationfilter

'Develop > Spring' 카테고리의 다른 글

JWT 개요  (0) 2022.11.24
Spring Security에서 지원하는 표현식(Spring EL)  (0) 2022.11.22
Spring Security 인증 처리 흐름  (0) 2022.11.21
Spring Security 웹 요청 흐름  (0) 2022.11.19
Spring Security - 기본  (0) 2022.11.19