Spring Security (3) - Security Filter Chain
Security Filter Chain
Spring Security에서 제공하는 인증, 인가를 위한 필터들의 모음
1. 필요한 필터 생성 (HttpSecurity)
- Spring Security는 인증, 인가에 대한 처리를 여러개의 필터를 연쇄적으로 실행하여 수행한다.
- 이때 필요한 필터와 필요하지 않은 필터를 명시해야 하는데 이를 WebSecurityConfigurerAdapter를 구현한 설정 파일에 명시한다.
- HttpSecurity클래스에서 이를 기반으로 해당되는 필터를 생성한다.
- 설정 파일 별로 필터 목록을 생성 후 WebSecurity로 전달한다.
- WebSecurity는 필터 목록들을 FilterChainProxy로 전달한다.
<FilterChainProxy>
SpringSecurityFilterChain으로 생성되는 bean이다.
WebSecurity로부터 받은 필터 목록을 가진다.
2. 사용자 인증 요청 처리
사용자 인증 요청이 들어오면 DelegatingFilterProxy가 요청을 받고 SpringSecurityFilterChain을 찾아 요청을 위임한다.
3. FilterChain
위임받은 요청을 필터 목록에 있는 필터들에게 순서대로 요청을 맡긴다. (doFilter 메소드 사용)
4. 필터 종류
1) SecurityContextPersistenceFilter: SecurityContextRepository에서 SecurityContext를 가져오거나 저장하는 역할
2) LogoutFilter: 설정된 로그아웃 URL로 오는 요청을 감시하며, 해당 유저를 로그아웃 처리
3)UsernamePasswordAuthenticationFilter: 설정된 로그인 URL로 오는 요청을 감시하며, 유저 인증 처리 (아이디와 비밀번호를 사용하는 form기반 인증)
4) ConcurrentSessioinFilter: 동시 세션과 관련된 필터로, 현재 사용자 계정으로 인증을 받은 사용자가 두 명 이상일 때 실행되는 필터
5) RememberMeAuthenticationFilter: 세션이 사라지거나 만료되더라도, 쿠키 또는 DB를 사용하여 저장된 토큰 기반으로 인증을 처리
6) AnonymousAuthenticationFilter: 사용자 정보가 인증되지 않았다면 익명 사용자 토큰을 반환 (인증하지 않은 사용자가 자원에 접속 시도할 경우 실행)
7) SessionManagementFilter: 로그인 후 Session과 관련된 작업을 처리
조건: 현재 세션에 SecurityContext가 없거나 세션이 null인 경우에 동작
작동방식
- Register SessionInfo: 사용자의 정보를 세션에 저장
- SessionFixation: 인증에 성공한 시점에 새로운 쿠키 발급
- ConcurrentSession: 사용자가 인증에 성공했다면 해당 사용자 계정으로 동시점에 세션 존재하는지 확인
8) ExceptionTranslationFilter: 필터 체인 내에서 발생되는 인증, 인가 예외 처리
9) FilterSecurityInterceptor: 권한부여와 관련한 결정을 AccessDecisionManager에게 위임해 권한부여 결정 및 접근 제어 처리
동작 방식
- Check Authenticated: 인증 객체가 존재하는지 확인
- AccessDecisionManager: 인가 처리
- AccessDecisionVoter: 접근하고자 하는 자원의 승인과 거부 판단