SecurityContext를 HTTP session에 캐시(기본 전략)하여 여러 요청에서 Authentication을 공유하는 필터다.
SecurityContextRepository를 교체하여 세션을 HTTP session 이 아닌 다른 곳에 저장하는 것도 가능하다.
만약 SecurityContextPersistenceFilter 를 사용하지 않는다면? -> UsernamePasswordAuthenticationFilter 혹은 다른 필터를 사용해서 매 요청시 인증을 처리해야하고, 그 내용을 http 헤더나 본문에 포함해야 한다.
만약 인증이 필요한 페이지에서 새로고침을 한다면? -> SecurityContextFilter 가 Security Context 를 꺼내준다. -> Http 세션이 달라지면 꺼내 올 수 없다.
DelegatingFilterProxy
일반적인 서블릿 필터중 하나이다.
서블릿 필터 처리를 스프링에 들어있는 빈으로 위임하고 싶을 때 사용하는 서블릿 필터이다.
그럼 DelegatingFilterProxy 가 필요한 이유는 무엇일까?
서블릿 필터는 스프링에서 정의된 빈을 주입해서 사용할 수 없다.
특정한 이름을 가진 스프링 빈을 찾아서 그 빈에게 요청을 위임 해야한다.
DelegatingFilterProxy 는 타겟 빈 이름을 설정하는데, 아래와 같이 FilterChainProxy는 springSecurityFilterChain 이름으로, 빈으로 등록된다.
public abstract class AbstractSecurityWebApplicationInitializer implements WebApplicationInitializer {
private static final String SERVLET_CONTEXT_PREFIX = "org.springframework.web.servlet.FrameworkServlet.CONTEXT.";
public static final String DEFAULT_FILTER_NAME = "springSecurityFilterChain";
...
}
스프링 부트를 사용할 때는 자동으로 등록된다. (SecurityFilterAutoConfiguration)
스프링 부트 없이 스프링 시큐리티 설정할 때는 AbstractSecurityWebApplicationInitializer를 사용해서 등록해야 한다.
따라서 springSecurityFilterChain 이름으로 생성된 빈을 ApplicationContext 에서 찾아 요청을 위임한다.