Spring Security Architecture
Conceptual Architecture
- 거시적 관점에서 Spring Security는 웹 요청을 가로챈 후 사용자를 인증하고, 인증된 사용자가 적절한 권한을 지니고 있는지 확인
- Authentication Manager: (인증) 사용자 인증 관련 처리
- AccessDecisionManager: (인가) 사용자가 보호받는 리소스에 접근할 수 있는 적절한 권한이 있는지 확인
FilterChainProxy(Spring Security 필터 체인)
- Spring Security의 실제적 구현은 서블릿 필터 (javax.servlet.Filter 인터페이스 구현체)를 통해 이루어짐
+ 서블릿 필터는 웹 요청을 가로챈 후 전처리 또는 후처리를 수행하거나, 요청 자체를 리다렉트하기도 함
- FilterChainProxy 세부 내용은 WebSecurityConfigurerAdapter 추상 클래스를 상속하는 구현체에서 설정(보통 @EnableWebSecurity 어노테이션도 함께 사용)
+ 웹 요청은 이러한 필터 체인을 차례로 통과
웹 요청은 모든 필터를 통과하게 되지만, 모든 필터가 동작하는 것은 아님
각 필터는 웹 요청에 따라 동작 여부를 결정할 수 있고, 동작할 필요가 없다면 다음 필터로 웹 요청을 즉시 넘김
+ 요청을 처리하고 응답을 반환하면 필터 체인 호출 스택은 모든 필터에 대해 역순으로 진행
+ 보통 springSecurityFilterChain 이라는 이름으로 Bean 등록됨
- 웹 요청이 들어오면 서블릿 컨테이너가 받고, 해당 요청을 DelegatingFilterProxy로 전달.
+ DelegatingFilterProxt Bean은 SecurityFilterAutoConfiguration 클래스에서 자동으로 등록됨.
- DelegatingFilterProxy는 실제적으로 웹 요청을 처리할 Target Filter Bean을 지정해야함.
+ FilterChainPorxy가 Target Filter Bean이 된다.
**정리: 웹 요청 -> Servlet Container -> Delegating Filter Proxy -> Filter Chain Proxy 순으로 전달.
- FilterChain: Spring Security와 상관 없는 filter chain 목록. Filter Chain 목록 중에 DelegatinfFilterProxy가 있음
>>웹 요청이 Filter Chain을 하나하나 통과하게 됨
- 요청이 Delegatinf Filter Proxy에 도착 -> Delegating Filter Proxy는 Security Filter Chain을 가르키고 있음: Delegating Filter Proxy가 요청을 Security Filter Chain에 전달
FilterChainProxy를 구성하는 Filter 목록
spring Security는 정말 다양한 필터 구현을 제공. Spring Security를 잘 이해하고 활용한다는 것은 이들 Filter를 이해하고 적절하게 사용한다는 것을 의미.
* ChannelProcessingFilter: 웹 요청이 어떤 프로토콜로 (http 또는 https) 전달되어야하는지 처리
* SecurityContextPersistenceFilter: SecurityContextRepository를 통해 SecurityContext를 Load/Save 처리
* LogoutFilter: 로그아웃 URL로 요청을 감시하며 매칭되는 요청이 있으면 해당 사용자를 로가아웃
* UsernamePassowrdAuthenticationFilter: ID/비밀번호 기만 Form 인증 요청 URL(기본값 /login)을 감시하며 사용자를 인증
* DefaultLoginPageGeneratingFilter: 로그인을 수행하는데 필요한 HTML을 생성
* RequestCaheAwareFilter: 로그인 성공 이후 인증 요청에 의해 가로채어진 사용자의 원래 요청으로 이동하기 위해 사용
* SecurityContextHolderAwareRequestFilter: 서블릿 3 API 지원을 위해 HttpServletRequest를 HttpServletRequestWrapper 하위 클래스로 감쌈
* RememberMeAuthenticationFilter: 요청의 일부로 remember-me 쿠키 제공 여부를 확인, 쿠키가 있으면 사용자 인증 시도
* AnaonymousAuthenticationFilter: 해당 인증 필터에 도달할 때까지 사용자가 아직 인증되지 않았다면 익명 사용자로 처리
* ExceptionTranslationFilter: 요청을 처리하는 도중 발생할 수 있는 예외에 대해 라우팅과 위임 처리
* FilterSecurityInterceptor: 접근 권한 확인을 위해 요청을 AccessDecisionManager로 위임
https://docs.spring.io/spring-security/reference/servlet/architecture.html
Architecture :: Spring Security
Spring Security’s Servlet support is based on Servlet Filters, so it is helpful to look at the role of Filters generally first. The following image shows the typical layering of the handlers for a single HTTP request. The client sends a request to the ap
docs.spring.io
'Spring' 카테고리의 다른 글
Spring Security: AnonymousAuthenticationFilter (0) | 2023.04.06 |
---|---|
Spring Security: RequestCacheAwareFilter (0) | 2023.04.04 |
Spring Data JPA: Method Query, Custom Query, Query DSL (0) | 2023.03.24 |
Spring Data JPA: 프록시 (0) | 2023.03.23 |
Spring Data JPA: 고급 매핑 (0) | 2023.03.22 |