1. SecuritycontextHolderFilter
->인증을 위한 첫 필터이다.
->잘못된 동작으로 인한 중복된 Authentication 필터 적용을 방지한다.
->SecurityContextRepository를 통해 SecurityContext(SupplierDeferredSecurityContext)를 가져온다.
->가져온 SecurityContext를 SecurityContextHolderStrategy 객체 안의 static 필드 ContextHolder에 저장하여 한 스레드 안의 모든 구간에서 SecurityContext를 쓸 수 있게 한다.
2. SupplierDeferredSecurityContext(위에 보이는 deferredContext변수)
->securityContextRepository에서 loadDeferredContext() 메소드 실행 시 return해주는 객체이다.
->보통 securityContextHolderStrategy 객체 안의 contextHolder 변수에 저장된다.
->위의 setDeferredContext(deferredContex)메소드를 실행하면 deferredContext.get()이라는 메소드가 실행된다.
->get() 실행 시 init()메소드 실행하는데, 그냥 securityContext가 없으면, 비어있는 SecurityContext 하나 만들어 return 하는 것이다.
->이 return 된 SecurityContext를 securityContextHolderStrategy 객체 안의 contextHolder 변수 안에 저장한다.
->DelegatingSecurityContextRepository에 static class DelegatingDeferredSecurityContext를 상속하고 있다.
->뭔가 DelegatingDeferredSecurityContext를 안쓰기엔 너무 중요해서 그냥 상속으로 고치는걸 미뤄둔 것 같달까..?(뻘소리다.)
3. SecurityContextRepository
->위의 SupplierDeferredSecurityContext를 return 해주는 객체이다.
->SecurityContextRepository를 상속한 여러개의 Repository가 있다.
->그 중 DelegatingSecurityContextRepository 클래스는 모든 Repository를 총 관리하는 Repository이다.
-> DelegatingSecurityContextRepository의 loadDeferredContext 메소드이다.
->var3은 여러 Repository들을 뜻한다. + SupplierDeferredSecurityContext를 return 해줄 변수를 null로 초기화
HttpSessionSecurityContextRepository,RequestAttributeSecurityContextRepository,InMemorySecurityContextRepository
등등의 여러 Repository를 delegate에 저장
->즉 delegate.loadDeferredContext는 HttpSessionsecurityContextRepository.loadDeferredContext() 이런 식이 되는 것이다.
-> HttpSessionsecurityContextRepository.loadDeferredContext()이다.
->readSecurityContextFromSession()은 간단히 session에 Context가 있으면 그 Context, 아니면 null을 반환한다.
->그 후 그것을 SupplierDeferredSecurityContext로 DelegatingSecurityContext로 다시 return
->그렇게 위 위 코드의 deferredSecurityContext에는 SupplierDeferredSecurityContext가 저장된다.
**SupplierDeferredSecurityContext는 DeferredSecurityContext를 상속했기 때문에 다형성으로 가능(그냥 필요할때 막 갖다 상속한것 같다. 그냥 어려워서 하는 뻘소리다.....,,,)
-> 이제 DelegatingSecurityContextRepository는 deferredSecurityContext(Supplier 혹은 Context가 있는 레알 Context)를 return 해준다.
-> 즉, Repository는 저장소에 SecurityContext가 없을 경우 null을 return하는 Supplier를 return하고, 있을 경우 존재하는 SecurityContext를 return하는 Supplier를 return 한다고 보면 될 것 같다.
4. SecurityContextHolderStrategy
->SecurityContextHolderStrategy 또한 여러가지 이다. 그 중 ThreadLocalSecurityContextHolderStrategy만 예시를 들어 설명하겠다.
->SecurityContextHolderStrategy는 내부 전역 필드인 ThreadLocal contextHolder에 Supplier를 저장하는 역할을 한다.
->SecurityContextHolderFilter에서 setDeferredContext() 메소드를 실행하면, 위에서 말한 것처럼 SupplierDeferredSecurityContext의 get이 실행되고, SecurityContext가 없으면 빈 객체를 만들어 반환 혹은 이미 있으면, 그걸 ContextHolder에 저장해 이 요청이 하나의 스레드 안에서 잘 실행할 준비를 끝마친다.
그 후 doFilter 하고 Anonymous Filter로 가즈아~~!!
내일 계속........
'스프링 시큐리티' 카테고리의 다른 글
시큐리티 필터 체인 (0) | 2025.04.28 |
---|---|
SpringApplication.run 이후 초기화 (0) | 2025.04.26 |
Authentication 흐름 2(AnonymousAuthenticationFilter) (1) | 2024.08.06 |
FilterChain과 책임 연쇄 패턴 (1) | 2024.08.05 |
DelegatingFilterProxy와 흐름 (0) | 2024.07.20 |