스프링 익셉션 예외 객체 전달 불가

Yeeun·2025년 5월 2일
0

SpringBoot

목록 보기
36/46

스프링 익셉션객체는 보안때문에 못넘긴다. 유저정의 익셉션은 객체넘길수있는데 그냥 익셉션객체는 안되.ㅁ 그래서 익셉션.겟메세지 , 익셉션.스택트래이스 이렇게 따로따로 넘겨줘야함.


✅ Spring에서 예외(익셉션) 객체를 바로 뷰나 응답에 넘기지 않는 이유

  • 스프링에서 기본적으로 제공하는 Exception 객체는 내부에 민감한 정보(예: 서버 경로, 클래스 정보, 라이브러리 경로 등)를 포함하고 있을 수 있어요.
  • 그대로 사용자에게 노출되면 보안상 위험해요. 예를 들어 NullPointerException을 전체 출력하면 코드 내부 구조를 유추할 수 있게 되죠.
  • 따라서, 예외 객체 전체를 응답으로 넘기는 건 스프링 보안 정책이나 REST API 보안 원칙에서 권장되지 않습니다.

✅ 해결 방법

1. 필요한 정보만 추출해서 전달

try {
    // some code
} catch (Exception e) {
    model.addAttribute("errorMessage", e.getMessage());
    model.addAttribute("stackTrace", e.getStackTrace());
    return "errorPage";
}
  • e.getMessage() → 에러 요약 메시지
  • e.getStackTrace() → 구체적인 위치, 필요하면 로깅 전용으로 사용

2. 사용자 정의 예외 (Custom Exception) 사용

public class MyCustomException extends RuntimeException {
    private int errorCode;

    public MyCustomException(String message, int errorCode) {
        super(message);
        this.errorCode = errorCode;
    }

    public int getErrorCode() {
        return errorCode;
    }
}
  • 이런 사용자 정의 예외는 내가 정의한 필드만 포함되어 있으므로 직렬화해서 클라이언트에게 전달하는 것도 괜찮음.

✅ 실제 실무에서는?

  • 로깅 시스템으로는 전체 스택 트레이스를 남기고,
  • 사용자에겐 에러 코드, 간단한 메시지만 전달합니다.

예시 (RestControllerAdvice)

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MyCustomException.class)
    public ResponseEntity<ErrorResponse> handleCustomException(MyCustomException e) {
        return new ResponseEntity<>(new ErrorResponse(e.getMessage(), e.getErrorCode()), HttpStatus.BAD_REQUEST);
    }
}

0개의 댓글