본문 바로가기
Spring Security

Authentication과 SecurityContextHolder

by 홍굴이 2021. 6. 3.

인증이 된 Authentication 객체는 어떻게 되는가?

→ SecurityContextHolder 에 들어가서 Application 전반에 걸쳐 사용할 수 있게 된다.

 

AuthenticationManager가 인증을 마친 뒤 Return 받은 Authentication 객체가 언제 SecurityContextHolder에 저장되는가?

 

 

SecurityContextPersisteneceFilter.class

  • SecurityContext를 Http session에 캐시하여 여러 요청에서 Authentication을 공유하는 필터
  • SecurityContextRepository를 교체하여 세션을 HTTP session이 아닌 다른 곳에 저장하는 것도 가능하다.

 

SecurityContextPersisteneceFilter의 과정

  1. 매 요청마다 SecurityContextPersisteneceFilter를 거친다.
  2. 이미 만들어져 있던 SecurityContext를 현재 SecurityContextHolder에 복구하는 작업을 한다. ( SecurityContextHolder.setContext() )
  3. 요청이 종료되면 SecurityContext를 비워준다.( SecurityContextHolder.clearContext() )

this.repo.loadContext(holder): 어딘가에 존재하는 인증 정보를 가져오려고 하는 작업

SecurityContextHolder.setContext안에 contextBeforeChainExecution -> Null : 인증된 사용자가 존재하지 않는다는 의미

 

즉, loadContext메소드를 통해 

가져와서 아래와 같이 setContext로 넣어줍니다.

 

UsernamePasswordAuthenticationFilter.class

  • 폼 인증을 처리하는 Security 필터
  • 인증을 처리하고, 인증이 완료되었다면 Authentication 객체를 SecurityContextHolder에 넣어준다.

  • 인증이 완료되었다면 상속을 받고 있는 Parent(AbstractAuthenticationProcessingFilter)로 이동하게된다.
  • UsernamePasswordAuthenticationFilter 가 구현하고있는 attemptAuthentication() 메소드는 템플릿메소드 패턴이 적용되었다. 즉, AbstractAuthenticationProcessingFilter의 attemptAuthentication 메소드를 구현하였다.
    -> 템플릿메소드패턴 : 부모의 일부분을 자식이 구현하는 구조
  • AbstractAuthenticationProcessingFilter 의 successfulAuthentication 메소드를 통해 SecurityContextHolder에 값이 담기는 것을 확인할 수 있습니다.

 

'Spring Security' 카테고리의 다른 글

Spring Security & CSRF & Json Web Token  (0) 2021.12.24
AuthenticationManager와 Authentication  (0) 2021.06.02
SecurityContextHolder와 Authentication  (0) 2021.06.02

댓글