Delegating Filter Proxy 탐험
Delegating Filter Proxy
Delegating Filter Proxy가 정말로 이론으로 배운 것 처럼 구현되어있는지 내부를 구경해보자.
public class DelegatingFilterProxy extends GenericFilterBean {
@Nullable
private String contextAttribute;
@Nullable
private WebApplicationContext webApplicationContext;
...
GenericFilterBean을 상속받고 있는데 이전 시간에도 언급한적 있지만 이 필터는 스프링의 설정 정보를 포함하는 필터이자 추상 클래스이다.
지금부터 Intellij IDE의 디버그 모드로 이 Delegating Filter Proxy의 내부는 어떤 값을 갖고 있는지 확인해보려고 한다.
여러 메소드들을 포함하고 있는데 그 중에서 doFilter
메소드의 마지막에 브레이크 포인트를 걸어고 요청을 보냈다.
...
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
// Lazily initialize the delegate if necessary.
Filter delegateToUse = this.delegate;
if (delegateToUse == null) {
synchronized (this.delegateMonitor) {
delegateToUse = this.delegate;
if (delegateToUse == null) {
WebApplicationContext wac = findWebApplicationContext();
if (wac == null) {
throw new IllegalStateException("No WebApplicationContext found: " +
"no ContextLoaderListener or DispatcherServlet registered?");
}
delegateToUse = initDelegate(wac);
}
this.delegate = delegateToUse;
}
}
// Let the delegate perform the actual doFilter operation.
invokeDelegate(delegateToUse, request, response, filterChain); // 브레이크 포인트
}
위와같이 여러 클래스 속성들이 있지만 그 중에 delegate 속성이 눈에 띈다.
이 필터 체인을 확대해보면,
15개의 필터들이 존재하는 것을 확인할 수 있다.
우리는 이전 시간에 6개의 필터만 언급했는데 사실은 더 많은 필터들이 존재한다.
살펴보면 우리가 이전 시간에 언급했던 필터들이 존재하는 것을 확인할 수 있다.
그 중에서도 우리가 이전시간에 AuthenticationFilter로 배웠던 필터가 UserNamePasswordAuthenticationFilter 필터라는 다소 긴 이름으로 존재하는 것을 볼 수 있다.
여기서 provider에 userDetailsService가 존재하는 것을 볼 수 있는데 그 구현체가 InMemoryUserDetailsManager인 것을 확인할 수 있다.
기본값은 인메모리이며 이전시간에 배웠듯이, Jdbc를 사용하여 DB에 인증 정보를 저장하거나 Ldap을 사용하여 저장하는 것도 가능하다.