<Spring Security> 2. 아키텍쳐
by BFine
출처 : https://inf.run/4Vam
가. DelegatingFilterProxy
a. Security는 어떻게 Filter 기반으로 동작할 수 있을까?
- Security는 Servlet Filter 기반으로 Client의 요청을 전처리, 후처리를 통해 보안을 구현한다.
- 하지만 Servlet 필터에 Spring Bean 주입하는 것은 불가능 하다.
=> Spring Bean은 Spring Container, Servlet Filter는 Servlet Container 에서 동작
- 그래서 Servlet Conatiner에서 동작하는 DelegatingFilterProxy가 요청을 Spring Bean에게
위임하는 방식을 도입하였기 때문에 Servlet Filter 기반으로 동작할 수 있다.
b. FilterChainProxy
- 위의 DelegatingFilterProxy이 위임하는 주체가 FilterChainProxy 이다.
- 이는 ApplicationContext에 있는 "springSecurityFilterChain" 이라는 Spring Bean을 가져온다.
=> SecurityFilterAutoConfiguration 에서 구동시 등록된다.
나. Filter들
a. default 설정
- 설정을 따로 하지 않는 경우에는 아래처럼 15개의 필터가 등록되어 chain 형태로 처리되는 것을 알 수 있다.
- 이부분은 HttpSecurity의 보안 API를 사용하면 편의에 맞게 Filter를 추가하거나(생성) 대체가 가능하다.
다. Authentication
a. 인증 정보는 어떻게 처리할까?
- 가장 중요한 사용자를 식별하는 id 와 password를 담고 있는 객체가 Authentication 이다.
- 로그인 할때 id 와 password를 가지고 있고 검증을 위해 사용되어 진다.
- 이 후에는 인증된 User객체, 권한정보 등을 담아 SecurityContext에 저장되어 전역으로 사용할수 있게 된다.
=> SecurityContextHolder.getContext().getAuthentication()
- 구조
1. principal : 아이디 or User 객체
2. credentials : 비밀번호
3. authorities : 권한목록
4. details : 인증 부가 정보
5. Authenticated : 인증 여부
b. UsernamePasswordAuthenticationFilter
- 사용자 Request에서 인증정보를 찾아서 Authentication 객체(Token)를 생성하는 역할을 한다.
=> Authenticated는 false (아직 인증 되어있지않음)
c. AuthenticationToken
- Authentication(interface)을 구현한 실제 인증정보를 나타내는 객체를 의미한다.
- 사용자 정의로도 구현이 가능하다.
d. AuthenticationManger
- 인증 처리하는 provider에게 위임하는 역할을 하며 인증 후 provider는 새롭게 Authentication을 구성한다.
e. AuthenticationProcessingFilter
- Authentication(Token 객체)를 SecurityContext에 저장하는 역할을 하는 필터이다.
라. SecurityContext
a. Authentication 의 보관소
- SecurityContext는 Authentication 객체가 저장되는 보관소로 TheadLocal에 저장된다.
=> ThreadLocal은 Thread 마다 고유하게 할당된 저장공간 (공유불가, Thread-safe)
- 인증 이후에 "SPRING_SECURITY_CONTEXT"라는 이름으로 HttpSession에 저장된다.
b. SecurityContextHolder
- SecurityContext의 객체 저장 방식을 지정한다.
1. MODE_THREADLOCAL : 스레드당 SecurityContext (default)
2. MODE_INHERITABLETHREADLOCAL : 메인 스레드와 자식 스레드 동일한 SecurityContext
3. MODE_GLOBAL : 프로그램내에서 하나의 SecurityContext 만 사용
c. SecurityContextPresistenceFilter
- 인증 전에는 SecurityContext를 생성하는 역할을 하며 인증 후에는 Session에서
SecurityContext를 꺼내 로드하는 역할을 한다. (SecurityContextHolder에 ThreadLocal에 저장)
'공부 > Spring Security' 카테고리의 다른 글
<Spring Security> 5. FilterChainProxy에 들어가는 Filter들 분석하기 (0) | 2021.10.21 |
---|---|
<Spring Security> 4. Custom 필터 추가해보기 (0) | 2021.10.11 |
<Spring Security> 3. 인증&인가 처리 과정 (0) | 2021.09.05 |
<Spring Security> 1. 기본 설정 (0) | 2021.09.01 |
<Spring Security> 0. 스프링 시큐리티란 (0) | 2021.07.14 |
블로그의 정보
57개월 BackEnd
BFine