그림은 DispatcherServlet에 클라이언트의 요청이 전달되기 전에 필터 체인을 구성한 예다.
ServletFilter : WAS에서 실행되는 필터, 클라이언트의 요청이 도달하기전에 가로채서 필터를 진행하는 JAVA의 컴포넌트
FilterChain : Filter들의 묶음
🔥Filter와 FilterChain의 특성
1) Servlet Filter Chain은 URI path를 기반으로 요청을 처리한다.
요청이 들어오면 서블릿 컨테이너는 요청 URI의 경로를 가지고 Filter와 Servlet 매핑 결정을 함
2) Filter Chain에서 Filter는 순서대로 동작
3) 순서를 지정하기 위해서 Bean으로 등록되는 Filter에 @Order 어노테션 적용
또는 FilterRegistrationBean을 Filter 순서 지정@Bean public FilterRegistrationBean<FirstFilter> firstFilterFilterRegistrationBean(){ FilterRegistrationBean<FirstFilter> registrationBean = new FilterRegistrationBean<>(new FirstFilter()); registrationBean.setOrder(2); return registrationBean; }
그림에서도 볼 수 있듯 Servlet Container와 Spring Container는 엄연히 다른 공간에 위치되어 있다.
Spring Security 필터는 Spring Container를 이용하고 있다.
🔥우선 여기까지 순서를 정리해보자면
1) Servlet Filter가 요청을 DelegatingFilterProxt로 전달
2) DelegatingilterProxy는 해당 요청을 스프링 컨테이너에 생성된 Filter를 구현한 스프링 빈에 위임
3) SpringSecurityFilterChain 이름으로 생성된 빈을 ApplcationContext에서 찾아 위임을 요청
Sprng Security의 Filter Chain : 보안을 위한 작업을 처리하는 필터의 모음
FilterChainProxy :
public class FirstFilter implements Filter {
// (1) 초기화 작업
public void init(FilterConfig filterConfig) throws ServletException {
}
// (2) 해당 Filter가 처리하는 실질적인 로직 구현
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
// (2-1) 이곳에서 request(ServletRequest)를 이용해 다음 Filter로 넘어가기 전처리 작업을 수행한다.
// (2-2)
chain.doFilter(request, response);
// (2-3) 이곳에서 response(ServletResponse)를 이용해 response에 대한 후처리 작업을 할 수 있다.
}
// (3)Filter 컨테이너에서 종료될 때 호출
public void destroy() {
// (5) Filter가 사용한 자원을 반납하는 처리
}
}
이 후 빈으로 등록
// PasswordEncoderFactories로 만들 수 있습니다.
PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();