지금까지 등록한 필터들을 나열 하면 다음과 같습니다.

1. httpSessionContextIntegrationFilter => 세션 문맥 통합 필터
2. logoutFilter => 로그 아웃 필터
3. authenticationProcessingFilter => 인증 처리 필터
4. exceptionTranslationFilter => 예외 처리 필터
5. filterInvocationInterceptor => 권한 처리 필터

FilterChainProxy의 filterInvocationDefinitionSource속성에 등록한 이 들의 순서는 매우 중요합니다.

일례로, exceptionTranslationFilter가 filterInvocationInterceptor보다 뒤에 있으면 어떤 일이 발생할까요? 예외 처리 필터의 존재 가치가 없어집니다. 예외 처리 필터가 예외를 확인하기 전에 권한 처리 필터에게 넘겨지기 때문에, 예외 처리 필터는 예외가 발생한지도 모른 상태이고, 웹 브라우저는 그냥 에러를 출력하게 됩니다.

또 다른 예로, 권한 처리가 인증 처리 필터보다 앞에 있으면 어떤 일이 발생할까요? 위의 상태에서, 1, 2, 4, 5, 3형태로 배열 했더니 웹 요청 처리가 무한루프에 빠지는 것을 볼 수 있었습니다.ㅎㅎ

그런 반면, 로그 아웃 필터의 위치는 어디에 두던지 별 영향을 미치지 않는 것을 확인할 수 있었습니다.

필터들의 순서를 가지고 여러 가지 실험을 해봤을 때, 가장 안전한 선택은 다음과 같습니다.

1. 세션 문맥 통합 필터는 가장 앞에 둔다.
2. 권한 처리 필터는 가장 마지막에 둔다.
3. 예외 처리 필터는 권한 처리 필터 바로 앞에 둔다.
4. 인증 처리 필터는 예외 처리 필터 앞에 둔다.
5. 기타 인증과 관련된 필터(리멤버미 필터, 익명 사용자 처리 필터)는 인증 처리 필터 바로 뒤에 연달아 둔다.

예를 들어 다음과 같은 순서대로 필터를 나열하면 안전 합니다.

httpSessionContextIntegrationFilter,
authenticationProcessingFilter,
anonymousProcessingFilter,
rememberMeProcessingFilter,
logoutFilter,
exceptionTranslationFilter,
filterInvocationInterceptor