개발일지/League Linker

🚨ERROR - 사용자 인증_500 error 올바르게 처리하기

기억지기 개발자 2024. 9. 12. 08:35

🌑 문제 발생

애플리케이션에서 인증되지 않은(유효하지 않은 토큰이나, 아예 토큰을 넣지 않은 경우) 사용자가 API 요청을 보냈을 때 401 Unauthorized 에러가 발생해야 하지만, 실제로는 500 Internal Server Error가 발생했다.

 

당장에 문제가 되는 것은 아니지만 상황별로 적절한 오류가 발생해야 프론트와 작업할 때도 문제가 없이 적절히 처리할 수 있을 거 같아서 반드시 해결을 하고 넘어가고 싶었다. 

 

해결을 해봐야 한 걸음 성장할 수 있으니까ㅎㅎ

 


🌕 해결

< 기존 filterChain 메소드의 예외처리 코드 > defaultAuthenticationEntryPointFor 사용

.exceptionHandling(exceptionHandling -> exceptionHandling
                        .defaultAuthenticationEntryPointFor(
                                new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED),
                                new AntPathRequestMatcher("/api/**")
                        ))
                .build();

 

[ 발생할 수 있는 문제 ]

1. 인증되지 않은 사용자에 대한 처리

  • defaultAuthenticationEntryPointFor는 인증이 필요한 요청에 대해 인증되지 않은 사용자가 요청할 때 401 Unauthorized 응답을 보내도록 설정한다. 그러나 이 메서드는 모든 인증 예외를 처리하지 않는다.
  • 이 설정이 인증과 관련된 모든 예외를 처리하는 것이 아니라, 오직 HttpStatus.UNAUTHORIZED로 응답을 보내는 역할만 하므로, 500 Internal Server Error를 발생시키는 예외를 처리하는 데 한계가 있을 수 있다.

2. 예외가 발생할 수 있는 상황

  • 만약 요청 처리 중 다른 예외가 발생하거나, 인증 처리 외의 문제로 인해 500 Internal Server Error가 발생하는 경우, 이 예외는 defaultAuthenticationEntryPointFor의 설정으로 처리되지 않는다.
  • 예를 들어, 인증 로직에서 특정 사용자 정보를 찾지 못했거나, 서버 내부에서 예기치 않은 문제가 발생했을 때 500 오류가 발생할 수 있다.

 

< 변경된 filterChain 메소드의 예외처리 코드 > - authenticationEntryPoint 사용

.exceptionHandling(exceptionHandling -> exceptionHandling
                        .authenticationEntryPoint((request, response, authException) -> {
                            response.sendError(HttpStatus.UNAUTHORIZED.value(), "인증되지 않은 사용자입니다.");
                        })
                )
                .build();

 

[ 변경된 코드가 올바르게 401 Unauthorized 에러를 반환하는 이유 ]

1. 인증 예외 처리

  • authenticationEntryPoint는 인증 관련 예외가 발생했을 때 호출된다.
    이 설정을 통해 인증되지 않은 사용자가 요청을 보냈을 때, 401 Unauthorized 상태 코드와 함께 “인증되지 않은 사용자입니다. “라는 메시지를 응답으로 보낼 수 있다.
  • authenticationEntryPoint는 인증 문제를 구체적으로 처리하여, 예외 발생 시 적절한 상태 코드를 반환하도록 한다.
    이를 통해 클라이언트는 인증 문제를 명확하게 처리할 수 있다.

2. 명확한 예외 처리

    • defaultAuthenticationEntryPointFor와는 달리, authenticationEntryPoint 설정은 인증 예외를 보다 직접적으로 처리한다.
      이로 인해 인증 관련 오류가 발생했을 때 500 Internal Server Error가 아닌 401 Unauthorized로 응답할 수 있습니다.
    • 이 방법은 인증 예외가 발생한 경우에만 적용되며, 인증 외의 다른 예외는 GlobalExceptionHandler를 통해 처리할 수 있다.

 

프로젝트 전반에서 대부분은 인증을 받은 사용자만 사용할 수 있는 기능이 많다보니 전역으로 해당 예외를 처리하는 것이 좋다는 판단을 했다.

 


⭐️ 비교해보기!!

  defaultAuthenticationEntryPointFor authenticationEntryPoint
기능 특정 경로에 대해 인증 예외를 처리 모든 인증 예외를 처리하며, 전역으로 적용
사용사례 경로 별로 다른 인증 예외 처리를 설정하고자 할 때 유용 전역으로 모든 인증 예외를 같은 방식으로 처리할 때 유용