Spring Security - ExceptionTranslationFilter
in Spring / Spring-security
예외 처리를 도와주는 ExceptionTranslationFilter
에 대해 알아봅니다
✅ ExceptionTranslationFilter
ExceptionTranslationFilter
는 FilterChainProxy
의 보안필터 중 하나로
AccessDeniedException
과 AuthenticationException
을 HTTP 응답으로 변환해주는 역할을 한다.
- 먼저
ExceptionTranslationFilter
는FilterChain.doFilter(request, response)
를 호출하여 애플리케이션의 나머지 작업을 처리한다. - 만약 인증되지 않은 사용자였거나,
AuthenticationException
이 발생한다면 인증절차를 시작한다.- SecurityContextHolder 를 비운다
- RequestCache 에
HttpServletRequest
를 저장하고 사용자임이 인증되면 이후의 요청에RequestCache
를 사용한다 AuthenticationEntryPoint
는 클라이언트에 자격증명을 요청할 때 사용된다. 예를 들자면, 로그인 페이지로 리다이렉트하거나WWW-Authenticate 헤더
를 보낸다
- 반대로
AccessDeniedException
이 발생한 경우, 접근을 거부하고AccessDeniedHandler
를 호출하여 이후의 처리를 위임한다.
애플리케이션에서
AccessDeniedException
이나AuthenticationException
이 발생하지 않는다면,
ExceptionTranslationFilter
는 아무런 동작도 하지 않는다.
ExceptionTranslationFilter
의 의사코드는 다음과 같다.
try {
// 1
filterChain.doFilter(request, response);
}
catch (AccessDeniedException | AuthenticationException ex) {
// 2
if (!authenticated || ex instanceof AuthenticationException) {
startAuthentication();
}
// 3
else {
accessDenied();
}
}
- 이전 내용에서
FilterChain.doFilter(request, response)
를 호출하여 애플리케이션의 나머지 작업을 처리한다고 한 것을 기억할 것이다. 즉, 애플리케이션의 다른 코드에서 (i.e.FilterSecurityInterceptor 나 시큐리티 메소드)AuthenticationException
이나AccessDeniedException
을 발생시키면 이 부분에서 예외를 포착하고 처리한다. - 인증되지 않은 사용자거나,
AuthenticationException
이 발생한다면 인증 절차를 시작한다. - 이도저도 아니므로 접근을 거부한다.