springframework/시작하자SpringSecurity

18.인증 저장소 필터 , SecurityContextPersistenceFilter

Jungsoomin :) 2020. 9. 22. 15:19

SecurityContextPersistenceFilter

SecurityContext 객체의 생성, 저장, 조회 를 담당

 

FilterChainProxyFilter2번 째에 위치


접근에 따른 동작

익명사용자의 접근

  • SecrutityContext 객체를 생성하여  SecurityContextHolder에 저장함

  • AnonymousAuthenticationFilter 에서 만든 AnonymousAuthenticationToken 객체를 SecurityContext에 저장시킴

인증 시도

  • SecurityContext 객체를 생성하여 SecurityContextHolder에 저장

  • UsernamePasswordAuthenticationFilter 에서 인증 성공 후 만든  UsernamePasswordAuthenticationTokenSecurityContext에 저장

  • 최종 인증 완료SessionSecurityContext 를 저장

인증 성공 

  1. Session 에서 SecurityContext 를 꺼내 SecurityContextHolder 에 저장

  2. SecurityContext에 안에 Authentication 객체가 존재 시 계속적으로 인증을 유지

모든 응답의 최종과정

  • SecurityContextHolder.clearContext() SecurityContext를 비우고 다음 작업을 준비한다.


동작 과정

 

  1. 사용자Request

  2. SecurityContextPersistenceFilter 작동

  3. HttpSecurityContextRepository 호출

  4. 인증 전이라면 SecurityContext 를 생성하여 SecurityContextHolder를 생성하고 다른 필터로 chain

  5. 다른필터에서 Authentication객체를 생성하면  SecurityContextHolderSecurityContext에 저장 

  6. SecurityContextPersistenceFilter SessionSecurityContext를 저장시킴 

  7. 기존의 SecurityContextclear 시키고 Response

  • 만약 HttpSecurityContextRepository 호출 시점에 사용자가 인증 된 상태라면

  • SecurityContextPersistenceFilter Session에서 SecurityContext를 가져와SecurityContextHolder에 저장하고 다른 Filter로 Chain


큰틀에서 확인

 

  1. 인증 전이거나 Anonymous 사용자일 경우

  2. SecurityContextPersistenceFilter SecurityContextHolderThreadLocal  SecurityContext를 저장 하고 다른 Filter로 Chain

  1. 인증 후 일 경우

  2. SecurityContextPersistenceFilterSession에서 SecruityContext 를 가져와 ThreadLocal에 저장, ThreadLocalSecurityContextHolder에 저장하고 다음 Filter로 Chain

** 상관 관계 SecurityContextHolder > ThreadLocal > SecurityContext > Authentication