Genti2024 / GenTI-BE

springboot
0 stars 0 forks source link

[BUG] FE단에서 예외를 식별할 수 없는 문제 #93

Closed BYEONGRYEOL closed 2 months ago

BYEONGRYEOL commented 2 months ago

Describe the bug

SpringSecurity 내에서 예상하지 못한 예외가 발생하는 경우 GentiAuthenticationEntryPoint 클래스의 commerce 메서드로 인해 204로 처리되도록 하고 있었다.

@Override
    public void commence(HttpServletRequest request, HttpServletResponse response,
        AuthenticationException authException) {
        Exception exception;
        switch (response.getStatus()) {
            case 200:
                return;
            case 401:
                exception = (Exception)request.getAttribute("exception");
                if(exception instanceof ExpectedException){
                    if(ResponseCode.TOKEN_NOT_PROVIDED == ((ExpectedException)exception).getResponseCode()){
                        return;
                    }
                }
                break;
            case 403:
                exception = (Exception)request.getAttribute("exception");
                break;
            case 404:
                exception = ExpectedException.withoutLogging(ResponseCode.HandlerNotFound);
                break;
            case 408:
                exception = ExpectedException.withLogging(ResponseCode.TimeOut);
                break;
            default:
                exception = ExpectedException.withLogging(ResponseCode.UnHandledException);
                break;
        }
        resolver.resolveException(request, response, null, exception);
    }

위의 코드에서 default: 에 걸렸을 때가 문제인데, UnHandledException의 경우 위처럼 사용하는 것이 아닌 최종적으로 error 를 handling 하는 GlobalExceptionHandler가 생성해야한다. {예상된에러.다뤄지지않는에러} 라는 말도 어감이 이상함,

GlobalExceptionHandler 에선 다음과 같이 사용중이였다.

@ExceptionHandler(Exception.class)
    public ResponseEntity<ApiResult<?>> handleUnExpectedException(
        Exception exception) {
        String arg1 = exception.getMessage();
        log.error(exception.getMessage(), exception);
        return error(UnHandledException, arg1);
    }

이게 올바른 UnHandledException의 사용 용례지!

아무튼 그래서 예외 발생시 프론트단에서는 예외메세지를 제대로 확인하지못하고, 백엔드단에서도 직접 springboot log를 하나하나까보지 않으면 모르는 상황이 발생했다.

따라서 BE 개발자에의해 관리되지 않는 예외 발생시에도 FE단에 해당 예외 메세지가 전달될 수 있도록 변경

To Reproduce

저는 accessToken Authorization 헤더에 담아 보낼때 고의로 띄어쓰기 추가해서 넣어봤습니다.