HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🏬
302 → 403 응답 변경
🏬

302 → 403 응답 변경

작성자
태그
Dev
속성
Aug 9, 2022 07:06 AM

문제 상황

OAuth2를 사용하는 환경에서 로그인 안한 사용자(토큰이 없는)가 권한이 없는 api를 요청할때 403 이 아닌 302 응답을 내려주는 상황
 

해결

SecurityConfig.java
.exceptionHandling() .authenticationEntryPoint(new Http403ForbiddenEntryPoint())
authenticationEntryPoint를 추가하여 해결하였다.

원인

  • 스프링 시큐리티 필터 체인에는 인증 예외 AuthenticationException, 인가 예외 AccessDeniedException 를 처리하는 ExceptionTranslationFilter가 등록되어 있다.
 
ExceptionTranslationFilter
  • 인증 예외 발생
    • AuthenticationEntryPoint를 실행한다
  • 인가 예외 발생
    • 익명(anonymous) 사용자일 경우 AuthenticationEntryPoint
    • 익명(anonymous) 사용자가 아닐 경우 AccessDeniedHandler
      • 익명 사용자일 경우 인가된 사용자인데 인증이 되지 않은건지 파악할 수 없기 때문
      •  
         
anonymousAuthenticationFilter를 거쳐 익명(anonymous)사용자 권한을 contextHolder에 넣어두었기 때문에 AuthenticationEntryPoint를 타게 된다.
 
Spring Security의 Unauthorized, Forbidden 처리
Spring Security를 적용해서 HTTP 요청에 대해 인증 및 인가를 적용할 경우 시큐리티 필터 체인에 의해 인증 여부나 인가 여부에 따라 요청이 수락되거나 거절된다. 그런데 필터 체인 특성상 이런 Spring Security에 의한 차단은 서블릿 필터 단계에 속하는 부분이기 때문에 @ControllerAdvice 같은 예외 처리기로 처리할 수 없다. 그래서 JSON 응답을 커스텀하려면 별도로 설정이 필요하다.
Spring Security의 Unauthorized, Forbidden 처리
https://velog.io/@park2348190/Spring-Security%EC%9D%98-Unauthorized-Forbidden-%EC%B2%98%EB%A6%AC
Spring Security의 Unauthorized, Forbidden 처리