728x90

이전에 폼 로그인 방식의 로그인/로그아웃을 구현하면서 간단하게 구조를 분석해 보았지만 

시큐리티를 배우는 과정에서 좀 더 정확하게 배우고 넘어가야 할거 같아서

공식문서를 참고하며 구조를 처음부터 정확하게 분석해 보겠다.

 

전체적인 흐름

 

 

위의 이미지는 공식문서에서 제공해 주는 클라이언트의 요청부터 스프링 시큐리티의 필터가 처리되는 과정이다.

ServletFilterChain
	ServletFilter
		DelegatingFilterProxy
			FilterChainProxy
				SecurityFilterChain
					SecurityFilter (ExceptionTranslationFilter, etc...)

이미지에 나타난 구조를 계층으로 표현하면 위와 같다.

 

코드로 살펴보기 전에 위의 과정을 글로 간단하게 정리해보겠다.

 

클라이언트가 서버에 요청을 보내면 서블릿 컨테이너는 필터 체인과 서블릿 생성

  • 필터체인은 필터 인스턴스들을 포함한다.
  • 서블릿은 요청 URI 경로를 기반으로 HttpServletRequest를 처리한다.
  • Spring MVC에서 서블릿은 DispatcherServlet의 인스턴스를 의미한다.
  • 실제 필터의 동작은 서블릿 필터에 전달되는 스프링 시큐리티의 필터 체인이 수행한다.

 

 

DelegatingFilterProxy를 통해 서블릿 컨테이너와 스프링 컨테이너를 연결

  • 서블릿 컨테이너와 스프링 컨테이너는 서로 다른 영역이다.
  • 스프링 시큐리티의 필터 체인은 스프링 컨테이너에 존재한다.
  • 스프링 컨테이너에 빈으로 등록되어 있는 필터 체인을 사용하기 위한 다리 역할이다.
  • 즉, 스프링 컨테이너에서 필터의 빈을 조회하고 호출한다.

 

FilterChainProxy를 통한 스프링 시큐리티 필터 체인 관리 및 실행

  • 스프링 시큐리티에서 제공하는 특수한 필터다.
  • SecurityFilterChain을 통해 필터 인스턴스들을 위임한다.
  • FilterChainProxy는 빈이기 때문에 DelegatingFilterProxy에 래핑 된다.
  • 등록된 필터 체인을 순서대로 실행한다.

 

SecurityFilterChain을 통한 스프링 시큐리티 필터 선택

  • 현재 요청에 대해 FilterChainProxy가 어떤 스프링 시큐리티 필터를 사용할지 결정한다.

 

SecurityFilter 삽입

  • SecurityFilterChain API를 사용해 FilterChainProxy에 삽입한다.
  • 필터의 순서는 아래와 같다.
  • 더보기
    ForceEagerSessionCreationFilter
    ChannelProcessingFilter
    WebAsyncManagerIntegrationFilter
    SecurityContextPersistenceFilter
    HeaderWriterFilter
    CorsFilter
    CsrfFilter
    LogoutFilter
    OAuth2AuthorizationRequestRedirectFilter
    Saml2WebSsoAuthenticationRequestFilter
    X509AuthenticationFilter
    AbstractPreAuthenticatedProcessingFilter
    CasAuthenticationFilter
    OAuth2LoginAuthenticationFilter
    Saml2WebSsoAuthenticationFilter
    UsernamePasswordAuthenticationFilter
    DefaultLoginPageGeneratingFilter
    DefaultLogoutPageGeneratingFilter
    ConcurrentSessionFilter
    DigestAuthenticationFilter
    BearerTokenAuthenticationFilter
    BasicAuthenticationFilter
    RequestCacheAwareFilter
    SecurityContextHolderAwareRequestFilter
    JaasApiIntegrationFilter
    RememberMeAuthenticationFilter
    AnonymousAuthenticationFilter
    OAuth2AuthorizationCodeGrantFilter
    SessionManagementFilter
    ExceptionTranslationFilter
    AuthorizationFilter
    SwitchUserFilter

 

ExceptionTranslationFilter을 통한 예외처리

  • AuthenticationException과 AccessDeniedException를 HTTP 응답으로 변환 가능하다.
  • SecurityFilter 중 하나로 FilterChainProxy 삽입된다.
  • AuthenticationException라면 인증을 시작한다.
  • AccessDeniedException라면 접근을 거부한다.

 

인증 간의 요청 저장

요청에 인증이 없거나 필요한 경우 인증 성공 후 다시 요청을 하려면

기존 요청에 대한 정보를 가지고 있어야 한다.

 

스프링 시큐리티에서는 RequestCache를 구현하여 HttpServletRequest를 저장한다.

 

RequestCache에 HttpServletRequest 저장

HttpServletRequest가 저장된 후에 사용자가 인증에 성공하면

RequestCache에 저장된 HttpServletRequest가 재사용 된다.

 

기본적으로 RequestCacheAwareFilter가 RequestCache를 사용해

HttpServletRequest를 저장하는 역할을 수행한다.

'Back-End > Security' 카테고리의 다른 글

OAuth 2.0 동작 방식  (0) 2023.07.17
OAuth 2.0  (0) 2023.07.17
JWT  (0) 2023.07.12
토큰 기반 자격 증명  (0) 2023.07.11
[스프링 시큐리티] 접근 제어 표현식  (0) 2023.07.11

+ Recent posts