권한 부여 처리는 Spring Security에서 가장 중요한 기능 중 하나이다. 인증에 성공했다고 해서 애플리케이션 리소스를 마음대로 이용할 수는 없기 때문이다.
따라서, 인증에 성공한다면 다음과 같이 사용자가 시스템에서 수행할 수 있는 작업을 결정하는 권한 부여(Authorization) 과정이 수행된다.
- Spring Security Filter Chain에서 URL을 통해 사용자의 액세스를 제한하는 권한 부여 Filter는 AuthoriztionFilter이다. AuthorizationFilter는 먼저 SecurityContextHolder로부터 Authentication을 획득한다.
(Authentication 객체로부터 Principal을 추출하여 사용자의 정보를 얻을 수 있다.) - AuthorizationFilter가 SecurityConfig에서 설정된 권한 정보를 가져오고 사용자의 권한과 비교한다.
(권한 비교를 수행하는 객체는 AuthorizationManager 인터페이스를 구현한 RequestMatcherDelegatingAuthorizationManager 클래스이다.) - RequestMatcherDelegatingAuthorizationManager 클래스는 권한 부여를 위한 로직을 구현한 객체를 여러 개 가지고 있고, 각 객체는 요청에 매핑되는 규칙(RequestMatcher)과 함께 등록된다.
- Authorization은 요청 URL을 가지고 각 객체의 규칙과 매칭하여 권한을 부여한다.
- 만약, 권한이 없다면 AccessDeniedException이 발생하고 AccessDeniedException은 ExceptionTranslationFilter로 전달된다.
- ExceptionTranslationFilter는 AccessDeniedHandler를 통해 AccessDeniedException을 처리한다.
(AccessDeniedHandler는 사용자에게 알맞은 에러 메시지를 보여주고 로그인 페이지로 이동하게끔 유도한다.) - 사용자가 로그인하지 않은 상태라면 AuthenticationEntryPoint를 사용해 로그인 페이지로 이동하게 한다.
- 사용자가 로그인에 성공하면 ExceptionTranslationFilter는 저장된 요청 URL로 리다이렉트한다.
- HttpServletRequest를 래핑하여 SecurityContextHolderAwareRequestFilter에서 SecurityContext를 추출한다.
(이때, SecurityContext에는 인증된 사용자 정보와 해당 사용자가 가지고 있는 권한 정보가 저장되어 있다.) - AuthorizationFilter를 통해 요청 URL에 대한 권한이 있는지 검사한다. 권한이 없다면 다시 AccessDeniedException이 발생한다.
component
- AuthorizationFilter
: Spring Security Filter Chain에서 URL을 통해 사용자의 액세스를 제한하는 권한 부여 필터이다. 인증(Authentication)이 먼저 이루어진 후, 해당 사용자의 권한을 확인하여 인가(Authorization) 처리를 한다.| - AuthorizationManager
: 권한 부여 처리를 수행하는 인터페이스이다. 주어진 요청에 대해 인증된 사용자가 가진 권한과 비교하여 해당 요청에 대한 액세스 권한을 판단한다. - RequestMatcherDelegatingAuthorizationManager
: AuthorizationManager 인터페이스를 구현한 구현 클래스이다. Spring Security가 자동으로 생성하는 권한 부여 매니저 중 하나로, HttpServletRequest에 대한 권한을 검사하는 데 사용된다. RequestMatcher를 이용하여 요청 URL과 연관된 권한 정보를 가져오고 이를 인증된 사용자의 권한 정보와 비교해서 해당 요청에 대한 액세스 권한을 판단한다.
'개발 일지 > Spring' 카테고리의 다른 글
[Spring Security] 토큰 기반 인증 절차 (0) | 2023.03.21 |
---|---|
[Spring Security] JWT (0) | 2023.03.20 |
[Spring MVC] Spring Security (0) | 2023.03.17 |
[Spring Security] 인증 처리 흐름 (0) | 2023.03.16 |
[Spring] @AllArgsConstructor /@RequiredArgsConstructor (0) | 2023.03.16 |