개발 일지/Spring

[Spring Security] 권한 부여 처리 흐름

미숫가루설탕많이 2023. 3. 17. 16:05

 권한 부여 처리는 Spring Security에서 가장 중요한 기능 중 하나이다. 인증에 성공했다고 해서 애플리케이션 리소스를 마음대로 이용할 수는 없기 때문이다.

 

 따라서, 인증에 성공한다면 다음과 같이 사용자가 시스템에서 수행할 수 있는 작업을 결정하는 권한 부여(Authorization) 과정이 수행된다.

 

  1. Spring Security Filter Chain에서 URL을 통해 사용자의 액세스를 제한하는 권한 부여 Filter는 AuthoriztionFilter이다. AuthorizationFilter는 먼저 SecurityContextHolder로부터 Authentication을 획득한다.
    (Authentication 객체로부터 Principal을 추출하여 사용자의 정보를 얻을 수 있다.)

  2. AuthorizationFilter가 SecurityConfig에서 설정된 권한 정보를 가져오고 사용자의 권한과 비교한다.
    (권한 비교를 수행하는 객체는 AuthorizationManager 인터페이스를 구현한 RequestMatcherDelegatingAuthorizationManager 클래스이다.)

  3. RequestMatcherDelegatingAuthorizationManager 클래스는 권한 부여를 위한 로직을 구현한 객체를 여러 개 가지고 있고, 각 객체는 요청에 매핑되는 규칙(RequestMatcher)과 함께 등록된다.

  4. Authorization은 요청 URL을 가지고 각 객체의 규칙과 매칭하여 권한을 부여한다.

  5. 만약, 권한이 없다면 AccessDeniedException이 발생하고 AccessDeniedException은 ExceptionTranslationFilter로 전달된다.

  6. ExceptionTranslationFilter는 AccessDeniedHandler를 통해 AccessDeniedException을 처리한다.
    (AccessDeniedHandler는 사용자에게 알맞은 에러 메시지를 보여주고 로그인 페이지로 이동하게끔 유도한다.)

  7. 사용자가 로그인하지 않은 상태라면 AuthenticationEntryPoint를 사용해 로그인 페이지로 이동하게 한다.
  8. 사용자가 로그인에 성공하면 ExceptionTranslationFilter는 저장된 요청 URL로 리다이렉트한다.

  9. HttpServletRequest를 래핑하여 SecurityContextHolderAwareRequestFilter에서 SecurityContext를 추출한다.
    (이때, SecurityContext에는 인증된 사용자 정보와 해당 사용자가 가지고 있는 권한 정보가 저장되어 있다.)

  10. AuthorizationFilter를 통해 요청 URL에 대한 권한이 있는지 검사한다. 권한이 없다면 다시 AccessDeniedException이 발생한다.

 

 

 

 

component

 

  • AuthorizationFilter
    : Spring Security Filter Chain에서 URL을 통해 사용자의 액세스를 제한하는 권한 부여 필터이다. 인증(Authentication)이 먼저 이루어진 후, 해당 사용자의 권한을 확인하여 인가(Authorization) 처리를 한다.|

  • AuthorizationManager
    : 권한 부여 처리를 수행하는 인터페이스이다. 주어진 요청에 대해 인증된 사용자가 가진 권한과 비교하여 해당 요청에 대한 액세스 권한을 판단한다.

  • RequestMatcherDelegatingAuthorizationManager
    : AuthorizationManager 인터페이스를 구현한 구현 클래스이다. Spring Security가 자동으로 생성하는 권한 부여 매니저 중 하나로, HttpServletRequest에 대한 권한을 검사하는 데 사용된다. RequestMatcher를 이용하여 요청 URL과 연관된 권한 정보를 가져오고 이를 인증된 사용자의 권한 정보와 비교해서 해당 요청에 대한 액세스 권한을 판단한다.