Java/Java
[Java] printStackTrace 취약점
mingmongs
2025. 3. 17. 10:19

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

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

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

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

이 of 메소드 내부를 또 살펴보게 되면 아래의 computeFormat() 을 호출하게 되는데,
computeFormat 함수는 Reflection을 사용하는 것을 볼 수 있다.
2) e.printStackTrace() 사용을 지양해야 하는 이유
- System.err 로 쓰여지게 되면서 제어하기 어렵고, 리소스 비용이 비싼편이다.
- Java의 Reflection(리플렉션)을 사용하여 예외를 추적하는 것이라 많은 오버헤드가 발생한다.
- 서버에서 메소드(Method) 스택정보를 취합하기 때문에 서버에 부하의 원인이 된다.
- 출력이 어디로 향하는지 파악하기 어렵다. (톰캣의 경우 catalina.out 에 남을 수도 있다)
- 관리가 어렵다. (보통 log4j, logback 으로 로그 패턴 및 로그 메세지를 지정하여 사용한다.)
3) 대안
- e.getStackTrace() 사용
: 예외가 발생된 부분만 출력하는 함수로, 불필요한 로깅을 줄일 수 있다. - 로깅 프레임워크 사용
: logback, slf4j, java.util.logging, log4j 등의 로깅 프레임워크를 활용하여,
보존 정책을 상황에 맞게 설정하여 사용할 수 있다.
[reference]
https://tmdrnr96.tistory.com/43
https://developer-yeony.tistory.com/142
https://tmdrnr96.tistory.com/43