본문 바로가기
Spring

Spring Security: SecurityContextPersistenceFilter

by S2채닝S2 2023. 4. 18.

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 기반 처리.

최근댓글

최근글

skin by © 2024 ttuttak