2024. 5. 15. 17:03ㆍ스프링부트
시큐리티 필터 이론
우리는 이전에 필터에 대해서 공부했다.
FilterRegistrationBean 을 사용하여 필터를 등록했었다.
이렇게 등록된 필터들은 여러 필터들이 모여 체인을 형성한다.
서블릿 컨테이너가 요청 URI 경로를 보고 필터를 거친다.
이러한 서블릿 필터중 delegatingFiilterProxy가 있고 해당 필터 내부에는 delegatingFiilterProxy의 작업을 위임받아 처리하는 FilterChainProxy가 있다.
우리가 보통 securityConfig를 할때 등록되는 필터들은 이 filterChainProxy에 등록된다고 생각할 수 있다.
filterChainProxy의 필터 종류
기본적으로 수많은 기본 필터들이 존재한다.
우리가 config할때 UsernamePasswordAuthenticationFilter 앞에 커스텀한 jwt 필터를 추가할때가 있는데
filterChainProxy을 알아야 어느 위치에 어떤 필터를 추가할지 알 수 있다.
위의 그림에서 Spring Security 을 위한 설정 클래스임을 정의하기 위해 WebSecurityConfigurerAdapter라고 정의되어있지만 과거 방식이고
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception
위의 함수를 통해 빈을 직접 정의해야한다.
일반적인 동작 과정
1. Security Context 복원 혹은 생성
2. 사용자 이름과 비밀번호를 추출하여 UsernamePasswordAuthenticationToken 객체를 생성
3. 인증 매니저가 토큰을 처리할 수 있는 인증 프로바이더를 찾고 토큰 처리를 위임
4. userDetailService에서 회원 정보 로드
5. UsernamePasswordAuthenticationToken과 회원 정보를 비교
5. 성공시 Authentication 객체를 만들어 Security Context에 보관
6. HttpSession 의 Attribute에 Security Context 저장
단순히 2가지 필터만 놓고 봤을때
SecurityContextPersistenceFilter 시작 -> UsernamePasswordAuthenticationFilter 시작 ->
인증 객체 컨텍스트에 저장-> UsernamePasswordAuthenticationFilter 끝 ->
컨텍스트 저장 -> SecurityContextPersistenceFilter 끝
Security Context? Authentication ?
우리가 로그인하면 필터링을 하면서 정보를 검증하고 성공하면 Authentication 객체를 만든다.
이를 서버에서 전역적으로 접근 가능하도록 저장소에 이를 보관해야하고 이 저장소를 ThreadLocal에 저장시켜 전역적으로
접근 가능하도록 만들어야한다. ThreadLocal을 가지는 객체가 Contextholder이고 인증 객체를 저장하는 것이 securityContext이다.
위에서는 2가지 필터만 놓고 봤지만 더 다양한 필터가 존재하고 더 다양한 로직((세션 관리, 페이지 생성, 로그아웃 , 캐시 등)이 존재한다.
SecurityContextPersistenceFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
DefaultLoginPageGeneratingFilter
BasicAuthenticationFilter
RequestCacheAwareFilter
SecurityContextHolderAwareRequestFilter
AnonymousAuthenticationFilter
SessionManagementFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
시큐리티 권한 설정
따라가면 jwt 관련 내용 나옴
'스프링부트' 카테고리의 다른 글
spring jpa (0) | 2024.05.20 |
---|---|
스프링 웹소켓 및 STOMP (0) | 2024.05.19 |
스프링 Aop (0) | 2024.05.14 |
스프링 필터 vs 인터셉터 (0) | 2024.05.14 |
스프링 intellij 디버깅 (0) | 2024.05.14 |