업데이트:

1 분 소요

Spring Security Architecture

거시적 관점

웹 요청을 가로챈 후 사용자를 인증하고, 인증된 사용자가 적절한 권한을 지니고 있는지 확인

Spring Security Architecture는 크게 아래 두 핵심 모듈로 이뤄져있다.

  • Authentication Manager
    • 사용자의 인증과 관련된 처리를 담당
  • Access Decision Manager
    • 사용자가 적절한 권한을 가지고 있는지 확인

미시적 관점

서버로 들어오는 모든 요청은 서블릿을 거쳐 들어오게 된다.

요청은 서블릿으로 전달되기 전에 서블릿 필터(Delegating Filter Proxy Filter)를 거치게된다.

  • 서블릿 필터

    웹 요청을 가로채 전처리, 후처리를 수행하거나 요청 자체를 리다이렉트 한다.

secArchitecture.png

secArchitecture1.png

요청을 받아 보안 처리를 하는 과정.

  1. 웹 요청을 수신한 서블릿 컨테이너는 받은 요청을 먼저 DelegatingFilterProxy로 전달한다.
  2. 요청을 받은 DelegatingFilterProxy는 실제 보안 처리를 수행할 FilterChainProxy을 지정한다.

FilterChainProxy를 구성하고 있는 필터의 수는 적지 않다.

이렇게나 많다😨
  • ForceEagerSessionCreationFilter
  • ChannelProcessingFilter
  • WebAsyncManagerIntegrationFilter
  • SecurityContextPersistenceFilter
  • HeaderWriterFilter
  • CorsFilter
  • CsrfFilter
  • LogoutFilter
  • OAuth2AuthorizationRequestRedirectFilter
  • Saml2WebSsoAuthenticationRequestFilter
  • X509AuthenticationFilter
  • AbstractPreAuthenticatedProcessingFilter
  • CasAuthenticationFilter
  • OAuth2LoginAuthenticationFilter
  • Saml2WebSsoAuthenticationFilter
  • UsernamePasswordAuthenticationFilter
  • OpenIDAuthenticationFilter
  • DefaultLoginPageGeneratingFilter
  • DefaultLogoutPageGeneratingFilter
  • ConcurrentSessionFilter
  • DigestAuthenticationFilter
  • BearerTokenAuthenticationFilter
  • BasicAuthenticationFilter
  • RequestCacheAwareFilter
  • SecurityContextHolderAwareRequestFilter
  • JaasApiIntegrationFilter
  • RememberMeAuthenticationFilter
  • AnonymousAuthenticationFilter
  • OAuth2AuthorizationCodeGrantFilter
  • SessionManagementFilter
  • ExceptionTranslationFilter
  • FilterSecurityInterceptor
  • SwitchUserFilter
  • Architecture


이 중 Spring Security Docs(https://docs.spring.io/spring-security/site/docs/3.0.x/reference/security-filter-chain.html)에서 언급하는 주요한 필터는 다음과 같다.

필터링은 필터 이름에 적혀있는 숫자 순서대로 수행되며 이 순서는 매우 중요하다.

주요 필터

  1. ChannelProcessingFilter
    • 다른 프로토콜로 리다이렉트 해야할 가능성이 있기 때문에 첫번째.
    • 웹 요청이 어떤 프로토콜로 (http 또는 https) 전달되어야 하는지 처리
  2. SecurityContextPersistenceFilter
    • 요청의 시작 부분에서 Security ContextSecurityContextHolder에 셋업되어야 하고 요청이 끝날 때 SecurityContext의 변화가 HttpSession에 복사될 수 있게 하기 위해(다음 웹 요청에 사용할 준비를 하기 위해) 두번째.
    • SecurityContextRepository를 통해 SecurityContext를 Load/Save 처리
  3. LogoutFilter

    로그아웃 URL로 요청을 감시하여 매칭되는 요청이 있으면 해당 사용자를 로그아웃 시킴

  4. UsernamePasswordAuthenticationFilter

    ID/비밀번호 기반 Form 인증 요청 URL(기본값: /login) 을 감시하여 사용자를 인증함

  5. DefaultLoginPageGeneratingFilter

    로그인을 수행하는데 필요한 HTML을 생성함

  6. RequestCacheAwareFilter

    로그인 성공 이후 인증 요청에 의해 가로채어진 사용자의 원래 요청으로 이동하기 위해 사용됨

  7. SecurityContextHolderAwareRequestFilter

    서블릿 3 API 지원을 위해 HttpServletRequestHttpServletRequestWrapper 하위 클래스로 감쌈

  8. RemeberMeAuthenticationFilter

    요청의 일부로 remeber-me 쿠키 제공 여부를 확인하고, 쿠키가 있으면 사용자 인증을 시도

  9. ExceptionTranslationFilter

    해당 인증 필터에 도달할때까지 사용자가 아직 인증되지 않았다면, 익명 사용자로 처리하도록 함

  10. FilterSecurityInterceptor

    접근 권한 확인을 위해 요청을 AccessDecisionManager로 위임

댓글남기기