Backend/Spring
[Spring] Spring Security Architecture에 대해서
mirae.kwak
2022. 9. 1. 17:37
728x90
Spring Security Architecture
Conceptual Architecture
거시적인 관점에서 Spring Security는 웹 요청을 가로챈 후 사용자를 인증하고, 인증된 사용자가 적절한 권한을 지니고 있는지 확인함
- AuthenticationManager 사용자 인증 관련 처리
- AccessDecisionManager 사용자가 보호받는 리소스에 접근할 수 있는 적절한 권한이 있는지 확인
- AuthenticationManager : 사용자 인증과 관련된 처리를 담당 - 인증
- Access Decision Manager : 사용자가 적절한 권한을 가지고 있는지 확인 - 인가
FilterChainProxy (Spring Security 필터 체인)
Spring Security의 실제적인 구현은 서블릿 필터 (javax.servlet.Filter 인터페이스 구현체)를 통해 이루어짐
- 서블릿 필터는 웹 요청을 가로챈 후 전처리 또는 후처리를 수행하거나, 요청 자체를 리다이렉트 하기도 함
- 서블릿 필터 = 필터 구현체들의 집합
FilterChainProxy 세부 내용은 WebSecurityConfigurerAdapter 추상 클래스를 상속하는 구현체에서 설정함(보통 @EnableWebSecurity 어노테이션도 함께 사용)
- 웹 요청은 이러한 필터 체인을 차례대로 통과하게 됨
- 웹 요청은 모든 필터를 통과하게 되지만, 모든 필터가 동작하는 것은 아님
- 각 필터는 웹 요청에 따라 동작 여부를 결정할 수 있고, 동작할 필요가 없다면 다음 필터로 웹 요청을 즉시 넘김
- 요청을 처리하고 응답을 반환하면 필터 체인 호출 스택은 모든 필터에 대해 역순으로 진행
- 보통 springSecurityFilterChain 이라는 이름으로 Bean 등록됨
웹 요청은 어떻게 FilterChainProxy로 전달될까?
- 웹 요청을 수신한 서블릿 컨테이너는 해당 요청을 DelegatingFilterProxy(javax.servlet.Filter 인터페이스 구현체)로 전달함
- DelegatingFilterProxy는 요청을 delegate로 전달함
- DelegatingFilterProxy Bean은 SecurityFilterAutoConfiguration 클래스에서 자동으로 등록됨
- DelegatingFilterProxy는 실제적으로 웹 요청을 처리할 Target Filter Bean을 지정해야함
- Target Filter Bean은 바로 앞에서 알아본 FilterChainProxy
- 서버를 띄우면 필터체인목록(spring security filter chain과는 전혀 다름)이 존재
- 필터체인목록 중에 DelegatingFilterProxy가 껴있음
- DelegatingFilterProxy에 웹 요청이 도착하게 되면 가리키고 있던 Spring SecurityFilterChain으로 전달
- SecurityFilterChain은 Spring Security Filter 목록을 가져와서 요청 처리
Spring Security FilterChainProxy를 구성하는 filter 목록
필터이름 | 설명 |
ChannelProcessingFilter | 웹 요청이 어떤 프로토콜로(http 또는 https) 전달되어야 하는지 처리 |
SecurityContextPersistenceFilter | SecurityContextRepository를 통해 SecurityContext를 Load/Save 처리 |
LogoutFilter | 로그아웃 URL로 요청을 감시하여 매칭되는 요청이 있으면 해당 사용자를 로그아웃 시킴 |
UsernamePasswordAuthenticationFilter | ID/비밀번호 기반 Form 인증 요청 URL(기본값:/login)을 감시하여 사용자를 인증함 |
DefaultLoginPageGeneratingFilter | 로그인을 수행하는데 필요한 HTML을 생성함 |
RequestCacheAwareFilter | 로그인 성공 이후 인증 요청에 의해 가로채어진 사용자의 원래 요청으로 이동하기 위해 사용됨 |
SecurityContextHolderAwareRequestFilter | 서블릿 3 API 지원을 위해 HttpServletRequst를 HttpServletRequestWrapper 하위 클래스로 감쌈 |
RememberMeAuthenticationFilter | 요청의 일부로 remember-me 쿠키 제공 여부를 확인하고, 쿠키가 있으면 사용자 인증을 시도함 |
AnonymousAuthenticationFilter | 해당 인증 필터에 도달할 때 까지 사용자가 아직 인증되지 않았다면, 익명 사용자로 처리하도록 함 |
ExceptionTranslationFilter | 요청을 처리하는 도중 발생할 수 있는 예외에 대한 라우팅과 위임을 처리함 |
FilterSecurityInterceptor | 접근 권한 확인을 위해 요청을 AccessDecisionManager로 위임 |
- RequestCacheAwareFilter 사용 예시
728x90