🌑 문제 발생
애플리케이션에서 인증되지 않은(유효하지 않은 토큰이나, 아예 토큰을 넣지 않은 경우) 사용자가 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 | |
기능 | 특정 경로에 대해 인증 예외를 처리 | 모든 인증 예외를 처리하며, 전역으로 적용 |
사용사례 | 경로 별로 다른 인증 예외 처리를 설정하고자 할 때 유용 | 전역으로 모든 인증 예외를 같은 방식으로 처리할 때 유용 |
'개발일지 > League Linker' 카테고리의 다른 글
[개발]🎁배운점 - 카카오톡 로그인 기능 개발, 사전 조사의 중요성을 깨닫다 (0) | 2024.09.22 |
---|---|
🤦🏻♀️고민하기 - Spring Security_API 경로에 따른 인증 및 역할 관리(2) (2) | 2024.09.13 |
🤦🏻♀️고민하기 - Spring Security_API 경로에 따른 인증 및 역할 관리(1) (2) | 2024.09.04 |
[spring boot] - Swagger로 API 문서화하기 (0) | 2024.09.03 |
[개발] - MapStruct를 사용하여 매핑 구현하기 (0) | 2024.09.01 |