
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.)