image.png

Authentication 객체를 관리하는 SecurityContext는 사용자의 요청이 서버로 들어오면 생성되고, 처리가 끝난 후 응답되는 순간에 초기화 된다.

따라서 SecurityContext는 의 생명주기는 Request이므로 요청이 시작 될 때 세션으로부터 꺼내어 사용하고, 요청이 끝나면 삭제한다.

하나의 SecurityContextHolder에 보통 유저 당 하나의 SecurityContext가 생긴다.

그러면 SecurityContext는 최소 0개에서 N개, 하나의 SecurityContext 안에 하나의 Authentication을 가지고 있다.

즉, Authentication 객체는 Security Context 가 관리한다.

https://docs.spring.io/spring-security/reference/servlet/authentication/architecture.html

에서 커스텀으로 SecurityContext를 처음 등록할 때

SecurityContextHolder.getContext().setAuthentication(authentication) 

가 아니라

SecurityContext context = SecurityContextHolder.createEmptyContext();
context.setAuthentication(authentication);
SecurityContextHolder.setContext(context); 

로 등록하라고 한다.

(to avoid race conditions across multiple threads.)