인증이 된 Authentication 객체는 어떻게 되는가?
→ SecurityContextHolder 에 들어가서 Application 전반에 걸쳐 사용할 수 있게 된다.
AuthenticationManager가 인증을 마친 뒤 Return 받은 Authentication 객체가 언제 SecurityContextHolder에 저장되는가?
SecurityContextPersisteneceFilter.class
- SecurityContext를 Http session에 캐시하여 여러 요청에서 Authentication을 공유하는 필터
- SecurityContextRepository를 교체하여 세션을 HTTP session이 아닌 다른 곳에 저장하는 것도 가능하다.
SecurityContextPersisteneceFilter의 과정
- 매 요청마다 SecurityContextPersisteneceFilter를 거친다.
- 이미 만들어져 있던 SecurityContext를 현재 SecurityContextHolder에 복구하는 작업을 한다. ( SecurityContextHolder.setContext() )
- 요청이 종료되면 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 |
댓글