스프링 시큐리티의 필터는 HttpFilter를 사용한다.
HttpFilter는 아래와 같은 구조를 가지며 doFilter() 메서드를 재정의해 논리를 구현 해야한다.
해당 메서드에 논리를 구현하고 마지막으로 FilterChanin 객체의 doFilter(request, response) 메서드를 호출해서 필터체인의 다음 필터가 실행되게 호출해주면 되고 요청을 차단하고 싶으면 response에 http 설정 해주고 return을 호출해주면 된다.
public abstract class HttpFilter extends GenericFilter {
private static final long serialVersionUID = 1L;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (!(request instanceof HttpServletRequest)) {
throw new ServletException(request + " not HttpServletRequest");
}
if (!(response instanceof HttpServletResponse)) {
throw new ServletException(response + " not HttpServletResponse");
}
doFilter((HttpServletRequest) request, (HttpServletResponse) response, chain);
}
protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);
}
}
필터 체인은 필터가 동작하는 순서가 정의된 필터의 모음이다.
여태 시큐리티 설정은 HttpSecurity 객체를 이용해왔는데 해당 인스턴스의 httpBasic()과 같은 메서드들을 호출하면 필터가 필터체인에 추가가 되었기에 시큐리티 동작을 했던 것이다.
필터들은 필터체인 내에서 인덱스를 갖게 되는데 같은 인덱스로 등록이 가능하며 동일한 값일때 호출 순서는 정해지지 않는다.
스프링 시큐리티에서 필터체인은 같은 필터가 여러번 호출 될 수 있다.
이를 방지하기 위해 OncePerRequestFilter를 구현해서 필터를 등록하면 된다. 해당 필터는 필터체인내에서 한번만 논리를 실행한다.