[Spring] Spring Security Architecture에 대한 정리
업데이트:
Spring Security Architecture
거시적 관점
웹 요청을 가로챈 후 사용자를 인증하고, 인증된 사용자가 적절한 권한을 지니고 있는지 확인
Spring Security Architecture는 크게 아래 두 핵심 모듈로 이뤄져있다.
Authentication Manager
- 사용자의 인증과 관련된 처리를 담당
Access Decision Manager
- 사용자가 적절한 권한을 가지고 있는지 확인
미시적 관점
서버로 들어오는 모든 요청은 서블릿을 거쳐 들어오게 된다.
요청은 서블릿으로 전달되기 전에 서블릿 필터(Delegating Filter Proxy Filter)를 거치게된다.
-
서블릿 필터
웹 요청을 가로채 전처리, 후처리를 수행하거나 요청 자체를 리다이렉트 한다.
요청을 받아 보안 처리를 하는 과정.
- 웹 요청을 수신한 서블릿 컨테이너는 받은 요청을 먼저 DelegatingFilterProxy로 전달한다.
- 요청을 받은 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)에서 언급하는 주요한 필터는 다음과 같다.
필터링은 필터 이름에 적혀있는 숫자 순서대로 수행되며 이 순서는 매우 중요하다.
주요 필터
- ChannelProcessingFilter
- 다른 프로토콜로 리다이렉트 해야할 가능성이 있기 때문에 첫번째.
- 웹 요청이 어떤 프로토콜로 (http 또는 https) 전달되어야 하는지 처리
- SecurityContextPersistenceFilter
- 요청의 시작 부분에서
Security Context
가SecurityContextHolder
에 셋업되어야 하고 요청이 끝날 때SecurityContext
의 변화가HttpSession
에 복사될 수 있게 하기 위해(다음 웹 요청에 사용할 준비를 하기 위해) 두번째. SecurityContextRepository
를 통해SecurityContext
를 Load/Save 처리
- 요청의 시작 부분에서
-
LogoutFilter
로그아웃 URL로 요청을 감시하여 매칭되는 요청이 있으면 해당 사용자를 로그아웃 시킴
-
UsernamePasswordAuthenticationFilter
ID/비밀번호 기반 Form 인증 요청 URL(기본값: /login) 을 감시하여 사용자를 인증함
-
DefaultLoginPageGeneratingFilter
로그인을 수행하는데 필요한 HTML을 생성함
-
RequestCacheAwareFilter
로그인 성공 이후 인증 요청에 의해 가로채어진 사용자의 원래 요청으로 이동하기 위해 사용됨
-
SecurityContextHolderAwareRequestFilter
서블릿 3 API 지원을 위해
HttpServletRequest
를HttpServletRequestWrapper
하위 클래스로 감쌈 -
RemeberMeAuthenticationFilter
요청의 일부로 remeber-me 쿠키 제공 여부를 확인하고, 쿠키가 있으면 사용자 인증을 시도
-
ExceptionTranslationFilter
해당 인증 필터에 도달할때까지 사용자가 아직 인증되지 않았다면, 익명 사용자로 처리하도록 함
-
FilterSecurityInterceptor
접근 권한 확인을 위해 요청을 AccessDecisionManager로 위임
댓글남기기