SecurityContextPersistenceFilter의 위치
- FilterChainProxy의 dofilterInternal메소드의 getFilters부분에 breakpoint를 건다
- 디버그 모드로 서버를 실행
- https://localhost:443으로 접근
- break: SecurityContextPersistenceFilter는 filterchain의 두 번째 위치에 존재한다.
SecurityContextPersistenceFilter의 역할
로그인 이후에 벌어지는 일들을 파악해보자!
- breakpoint: AbstractAuthenticationProcessingFilter - dofilter() - if(authenticationResult == null)
- authenticationResult : 로그인 후 인증이 완료된 사용자 객체. 실제 type은 UsernamePasswordAuthenticationToken임
- 인증 결과로 successfulAuthentication()을 실행
- successfulAuthenticatoin():
- SecurityContextHolder.getContext().setAuthentication(authResult) :authenticationResult를 SecurityContextHolder의 ThreadLocal변수에 저장
- this.successHandler.onAuthenticationSuccess(): 인증 완료 후 지정된 redirection으로 이동
- redirection이 일어나면서 SecurityFilterChain이 역순으로 실행되고 SecurityContextPersistenceFilter의 finally부분에 도달
- AbstractAuthenticationProcessingFilter 의 successfulAuthenticatoin(): SecurityContextHolder.getContext().setAuthentication(authResult)에서 ThreadLocal에 저장한 authenticationResult를 가져옴(UsernamePasswordAuthenticationToken)
- 이렇게 가져온 authenticationResult는 인증이 완료된 사용자일 것.
- repo에 saveContext로 저장.
- 인증이 필요한 url로 재 요청시 인증이 완료된 사용자의 SecurityContext를 로드
- repo에 저장된 context를 가져옴
- 로드된 securityContext를 다시 SecurityContextHolder를 통해 ThreadLocal변수에 다시 set
- 이후 다른 filter 실행: SecurityContextHolder를 통해 인증이 완료된 사용자 정보를 나머지 filter에서 조회
SecurityContextPersistenceFilter의 핵심적인 부분
- SecurityContext를 load하고 save하는 부분
- this.repo.loadContext(holder);
- this.repo.saveContext(contextAfterChainExcution, holder.getRequest(), holder.getResponse());
- this.repo는 SecurityContextRepository 인터페이스임
- HttpSessionSecurityContextRepository가 Spring에서 사용하는 기본 구현체
- 이름에서 알 수 있듯이 HttpSession 기반 처리.
'Spring' 카테고리의 다른 글
Spring Bean, DI, Component Scan (0) | 2024.09.25 |
---|---|
SpringSecurity: ExceptionTranslationFilter (0) | 2023.04.18 |
SecurityContextHolder, SecurityContext, Authentication (0) | 2023.04.06 |
Thread Per Request 모델과 ThreadLocal (0) | 2023.04.06 |
Spring Security: AnonymousAuthenticationFilter (0) | 2023.04.06 |