Spring Security 5 에서는 SecurityContextPersistenceFilter 를 사용하여 Security Context 가 SecurityContextRepository 에 자동으로 저장된다고 한다. 정상적인 요청과 응답이 수행되기 전에 세션을 생성한다는 문제점과 이러한 세션을 추적하기가 어렵다는 문제가 있었다.
Spring Security 6 에서는 SecurityContextPersistenceFilter 가 Defrecated 되고 SecurityContextHolderFilter 를 사용하여 SecurityContext 를 SecurityContextRepository 로 부터 읽기 동작만을 수행한다. 인증된 세션의 저장은 유저가 직접 명시적으로 저장해야 한다.
SecurityContextPersistenceFilter 내용을 보면 아래와 같다.
SecurityContextRepository 인 this.repo 는 HttpSessionSecurityContextRepository 를 기본 구성 클래스로 사용한다.
SeucirytContextRepository 를 HttpSessionSecurityContextRepository 를 사용한다고 설정한다.
아래는 실제로 인증된 객체를 가지고 있는 AuthenticationSuccessHandler Custom 클래스이다.
public class AuthenticationSuccessHandlerCustomImpl implements AuthenticationSuccessHandler {
private final SecurityContextHolderStrategy securityContextHolderStrategy = SecurityContextHolder.getContextHolderStrategy();
private final SecurityContextRepository securityContextRepository = new HttpSessionSecurityContextRepository();
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
String redirectUrl = request.getContextPath() + "/test";
SecurityContext securityContext = this.securityContextHolderStrategy.getContext();
securityContext.setAuthentication(authentication);
this.securityContextHolderStrategy.setContext(securityContext);
this.securityContextRepository.saveContext(securityContext, request, response);
response.sendRedirect(redirectUrl);
}
}
위처럼 SecurityContextHolder 에서 SecurityContext 를 불러와 인증 객체 Authentication 을 설정한다.
설정된 SecurityContext 는 SecurityContextHolder 에 설정하고 SecurityContextRepository에
SecurityContext 를 save 한다.
SecurityContextHolderFilter 의 doFilter 메소드에서 finally 부분을 보면 SecurityContextHolderStrategy 를 통해 SecurityContextHolder 를 clearContext()를 하는데 SecurityContext는 Repository 에 저장한 후에