스프링 시큐리티 설정을 하자-(4) 예외처리

Alex·2025년 1월 17일
0

Plaything

목록 보기
79/118
post-thumbnail

스프링 시큐리티에서 발생하는 예외는 @ControllerAdvice에서 처리하지 못한다.

일반적으로 예외는 애플리케이션의 컨트롤러가 요청을 받고 비즈니스 로직을 처리하는 과정에서 발생한다.

스프링 시큐리티는 요청이 디스패쳐 서블릿에 도달하기 전 필터 체인에서 예외를 발생하기에, 컨트롤러 계층에서 발생하는 예외를 처리하는 @ControllerAdvice에서는 예외를 catch할 수가 없다.

그렇다면 이를 어떻게 처리해야 할까?

Handle Spring Security Exceptions With @ExceptionHandler에 관련 내용들이 있다.

스프링 시큐리티 예외는 커스텀 필터를 추가해서 처리할 수 있다. 컨트롤러 어드바이스에서 처리하려면, AuthenticationEntryPoint. AuthenticationEntryPoint가 필요하다. 전자가 사용하기에 간단해서 전자의 방식을 활용하기로 했다.


인증 처리 과정에서 발생한 예외를 처리하는 AuthenticationEntryPoint를 구현한 클래스를 만들고, 그냥 response로 상태코드를 보내는 방식을 쓰기로 했다. 보안 관점에서 어떤 부분에서 예외가 발생했는지 구체적으로 알려주는 게 좋은 건 아니라고 들었기 때문이다.

권한이 없는 경우 403 예외를 던지는 핸들러도 만들어준다.

설정파일에서는

이렇게 앞단에 예외를 붙여주면 된다.

그리고, JWTFilter에서도

이렇게 예외를 던져줘야 filter가 잡을 수 있다.

비즈니스 로직에 대한 예외는?

스프링 필터쪽에서 비즈니스 예외가 던져지면 글로벌 예외 핸들러가 이를 잡을 수가 없어서
500에러만 나간다.

이런식으로 내가 직접 response를 작성해줘야 한다.

profile
답을 찾기 위해서 노력하는 사람

0개의 댓글