Java/Java

[Java] printStackTrace 취약점

mingmongs 2025. 3. 17. 10:19

title

intelliJ 환경에서 Java Spring 개발을 하던 중, e.printStackTrace() 구문을 사용한
라인에서 warning 표시가 나오는 것을 보았다.
코드를 지우면서 문득 왜 사용을 지양해야하는지 궁금해져서 찾아보게 되었다.

 

ex1

 

1) printStackTrace란?

: printStackTrace() 는 예외발생 당시의 호출스택(Call Stack)에 있었던 메소드의 정보와 예외 메시지를 화면에 출력한다.

ex2

위의 코드는 실제 printStackTrace() 함수의 내부 구현인데,
System.errPrintStream으로 사용하고 있다.

ex3

그리고 이 함수 내부를 타고 가다가 보면 StackTraceElement.of 를 통해 StackElement를 가져온다.

ex4

이 of 메소드 내부를 또 살펴보게 되면 아래의 computeFormat() 을 호출하게 되는데,
computeFormat 함수는 Reflection을 사용하는 것을 볼 수 있다.

 

2) e.printStackTrace() 사용을 지양해야 하는 이유

  1. System.err 로 쓰여지게 되면서 제어하기 어렵고, 리소스 비용이 비싼편이다.
  2. Java의 Reflection(리플렉션)을 사용하여 예외를 추적하는 것이라 많은 오버헤드가 발생한다.
  3. 서버에서 메소드(Method) 스택정보를 취합하기 때문에 서버에 부하의 원인이 된다.
  4. 출력이 어디로 향하는지 파악하기 어렵다. (톰캣의 경우 catalina.out 에 남을 수도 있다)
  5. 관리가 어렵다. (보통 log4j, logback 으로 로그 패턴 및 로그 메세지를 지정하여 사용한다.)

 

3) 대안

  1. e.getStackTrace() 사용
    : 예외가 발생된 부분만 출력하는 함수로, 불필요한 로깅을 줄일 수 있다.
  2. 로깅 프레임워크 사용
    : logback, slf4j, java.util.logging, log4j 등의 로깅 프레임워크를 활용하여,
     보존 정책을 상황에 맞게 설정하여 사용할 수 있다.

 

[reference]
https://tmdrnr96.tistory.com/43
https://developer-yeony.tistory.com/142
https://tmdrnr96.tistory.com/43