애플리케이션의 중요한 보안 요소 중 인증에 대한 처리가 되었다면, 권한 부여(Authorization, 인가)에 대한 요소도 체크해야 한다. 인증에 성공한 사용자라도, 주어진 권한 내에서 리소스에 접근할 수 있도록 해야 한다.
- AuthorizationFilter는 SecurityContextHolder로부터 Authentication을 획득
- 획득한 Authentication과 HttpServletRequest를 AuthorizationManager에게 전달
- RequestMatcherDelegatingAuthorizationManager 내부에 매치되는 AuthorizationManager 구현 클래스가 있으면, 해당 AuthorizationManager 구현 클래스가 사용자의 권한을 체크
- 적절한 권한일 경우, 다음 요청 프로세스를 진행
- 적절한 권한이 아닐 경우, 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에 대해
AuthorizationManager
- 권한 부여 처리 총괄 역할을 하는 인터페이스
- check() 메서드 하나만 정의되어 있고, 파라미터로 Supplier와 제네릭 타입의 객체를 가짐
AuthorizationManager에 대해
RequestMatcherDelegatingAuthorizationManager
- AuthorizationManager 인터페이스를 구현하는 구현 클래스 중 하나
- RequestMatcher 평가식을 기반으로 해당 평가식에 매치되는 AuthorizationManager에게 권한 부여 처리를 위임
- check() 메서드 내부에서 루프를 돌면서 RequestMathcerEntry 정보를 얻은 후, RequestMatcher 객체를 얻음
- 이후 MatchResult.isMatch()가 true이면, AuthorizationManager 객체를 얻은 후, 사용자의 권한을 체크
* RequestMatcherDelegatingAuthorizationManager가 직접 권한 부여 처리를 하는 것이 아닌, RequestMatcher를 통해 매치되는 AuthorizationManager 구현 클래스에게 위임만 한다.
* RequestMatcher는 SecurityConfiguration에서 .antMatchers("/orders/**").hasRole("ADMIN")와 같은 메서드 체인 정보를 기반으로 생성된다.
RequestMatcherDelegatingAuthorizationManagerd에 대해
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 |