ExceptionTranslationFilter

  • DefaultSecurityFilterChain에 기본적으로 등록되는 필터
  • 필터 이후에 발생하는 인증, 인가 예외를 핸들링하기 위해 사용
HTTP 요청
    ↓
인증 필터
    ↓
AuthorizationFilter / Method Security
    ↓
AuthenticationException 또는 AccessDeniedException
    ↓
ExceptionTranslationFilter
    ├─ 인증이 필요함
    │      → AuthenticationEntryPoint
    │      → 일반적인 REST 응답: 401 Unauthorized
    │
    └─ 인증은 되었지만 권한이 부족함
           → AccessDeniedHandler
           → 일반적인 응답: 403 Forbidden

내부적으로 AuthenticationException와 AccessDeniedException에 대한 예외처리를 수행

  • AuthenticationException이 발생하면 AuthenticationEntryPoint를 호출한다.
  • AccessDeniedException이 발생했더라도 사용자가 익명 사용자라면 AuthenticationEntryPoint를 호출한다.
  • 사용자가 인증된 상태라면 AccessDeniedHandler를 호출한다.

CAUTION

ExceptionTranslationFilter 필터 이전에 발생하는 예외의 경우 처리하지 못한다. 예외 처리는 호출한 필터가 진행할 수 있다.

예를 들어 UsernamePasswordAuthenticationFilter는 ExceptionTranslationFilter 보다 앞에 존재하기 때문에 ExceptionTranslationFilter에서 처리할 수 없다.

AuthenticationEntryPoint

인증이 필요한 클라이언트에게 인증을 시작하도록 요구하는 컴포넌트

  • 인증처리
  • 핵심 메서드: commence()

구현체는 다음과 같음

AccessDeniedHandler

사용자가 인증되었지만 요청한 리소스에 접근할 권한이 없는 경우를 처리

  • 인가처리
  • 핵심 메서드: handle()
  • 기본 구현체는 AccessDeniedHandlerImpl를 사용

커스텀

return http.exceptionHandling(exceptionHandling -> exceptionHandling  
		.authenticationEntryPoint(customAuthenticationEntryPoint)  
		.accessDeniedHandler(customAccessDeniedHandler))

위와 같이 Spring Security의 인증·인가 과정에서 발생한 예외를 HTTP 응답으로 변환하는 방법을 커스텀할 수 있다.

  • 내부적으로 ExceptionHandlingConfigurer가 ExceptionTranslationFilter를 Security Filter Chain에 추가하고, 설정된 AuthenticationEntryPoint와 AccessDeniedHandler를 해당 필터에 연결한다.

출처 및 참고자료

https://www.youtube.com/watch?v=SpHoeh4DsPA&list=PLJkjrxxiBSFCFM0pjDwm6F98veieD0MER&index=23