🐣문제상황

 

스프링 프로젝트에서

에러를 커스텀하다가 401, 403에러는 커스텀한대로 나오지 않는 것을 발견했다.

 

 

난 요기에 넣어서 나오게 하고싶었고,

 

다른 에러는 요런식으로 잘 나오는데

 

그치만 401 에러는 이렇게만 나왔다

 

 

 

 

 

 

 

🐣원인

Spring Security에서 발생하는 예외는 Spring MVC의 기본 예외 처리와 별도로 처리하기 때문!

401 Unauthorized 응답은 기본적으로 Spring Security의 AuthenticationEntryPoint에서 처리된다.

이 처리 방식은@RestControllerAdvice, @ExceptionHandler를 통해 설정해줬던  Spring MVC의 예외 처리 흐름과 다르다!!

 

Spring Security의 요청 처리 단계는 MVC 요청 처리 흐름보다 앞서 있는데,

보안 관련 작업 의 특성상 요청의 인증 및 권한 처리가 컨트롤러에 도달하기 전에 이루어져야 하기 때문이다.

 

스프링의 요청 처리 흐름에 대해 더 자세한건 요기

 

[Spring] Spring에서의 요청처리 흐름(+Spring Security/MVC의 에러 처리 위치)

에러 커스텀 리팩토링 작업을 하다가Spring Security의 요청 처리 단계는 MVC 요청 처리 흐름보다 앞서 있다는 사실을 알았고,이런 처리를 명확하게 하기 위해서는요청 처리 흐름에 대해 조금 더 자

develoyummer.tistory.com

 

 

 

 

🐣해결 방법

인증(401) 인가(403)용 핸들러를 직접 만들어 security 클래스에 설정해 주어야 한다.

 

401 Unauthorized - AuthenticationEntryPoint

 

 

 

403 Forbidden - AccessDeniedHandler

 

 

이렇게 ErrorResponse 객체에 담아 반환할 수 있게 한 후

Spring Security에 커스텀한 핸들러들을 DI 시킨 후 설정 해주었다.

 

Security Config

 

참고로 스프링 3.xx 버전은 저렇게 람다식으로 구현해야 한다..

 

 

 

 

 

그럼 이제 커스텀한대로 에러가 잘 나오는것을 확인할 수 있다.

 

 

 

 

참고

https://ailiartsua.tistory.com/35

복사했습니다!