1. 오류 메시지 정보 노출의 위험성
시스템 오류 발생 시 화면이나 응답 데이터에 출력되는 스택 트레이스(Stack Trace), DB 쿼리문, 경로 정보 등은 개발자에게는 유용한 디버깅 정보이지만, 공격자에게는 시스템의 지형도를 그려주는 아주 친절한 안내서가 됩니다. 이러한 상세 정보가 노출되면 공격자는 서버의 운영체제 종류, 사용 중인 라이브러리의 버전, 데이터베이스의 구조 등을 파악하여 타깃 공격(Targeted Attack)을 설계할 수 있습니다. 이는 앞서 살펴본 SQL 삽입(CWE-89)이나 XXE(CWE-611) 공격의 성공 가능성을 비약적으로 높이는 결과를 초래합니다.
2. 흔히 발생하는 잘못된 예외 처리 패턴
가장 빈번하게 나타나는 취약점은 예외 처리(CWE-754) 블록에서 e.printStackTrace()를 호출하거나, HTTP 응답 본문에 예외 객체를 직접 담아 보내는 경우입니다. 특히 스프링 부트(Spring Boot)와 같은 프레임워크의 기본 설정을 그대로 사용할 경우, 404나 500 에러 화면에서 서버 내부 정보가 고스란히 노출되기도 합니다. 또한, 디버그 코드(CWE-489)가 제거되지 않아 로직 흐름이 화면에 출력되는 상황 역시 정보 노출의 주요 원인입니다.
3. 실무적 대응: 사용자 정의 에러 페이지와 로깅 분리
정보 노출을 막는 가장 효과적인 방법은 내부용 로그와 외부용 메시지를 철저히 분리하는 것입니다. 상세한 에러 정보는 서버 내부 로그(logger.debug 또는 logger.error)에 기록하여 관리자만 확인하게 하고, 사용자에게는 "일시적인 장애가 발생했습니다"와 같은 추상적이고 정제된 메시지만을 전달해야 합니다. 이를 위해 전역 예외 처리기(Global Exception Handler)를 구축하여 모든 예외 상황에 대해 일관된 보안 에러 응답 형식을 정의하는 것이 권장됩니다.
4. CWE-209 대응 및 통합 보안 적용 자바 코드 예시
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
// [CWE-209 & CWE-754 조치] 모든 예외를 한 곳에서 처리
@ExceptionHandler(Exception.class)
public ErrorResponse handleAllException(Exception e) {
// [CWE-489 & CWE-754] 내부 로그에는 상세 정보를 남김 (운영 시 로그 레벨로 제어)
// printStackTrace() 대신 로거를 사용
logger.debug("Internal System Error: {}", e.getMessage(), e);
// [CWE-209 조치] 사용자에게는 내부 정보가 없는 정제된 메시지만 반환
return new ErrorResponse("ERR_999", "시스템 처리에 실패했습니다. 관리자에게 문의하세요.");
}
}
class ErrorResponse {
private String code;
private String message;
public ErrorResponse(String code, String message) {
this.code = code;
this.message = message;
}
// Getter, Setter 생략...
}
코멘트: 완벽한 보안은 사소한 틈을 막는 것에서 시작됩니다. CWE-209 대응은 단순히 에러를 숨기는 것이 아니라, 공격자에게는 침묵하고 관리자에게는 명확히 보고하는 소통의 분리입니다. 앞서 연재한 XML 보안, SQL 삽입 방어, 예외 처리 전략들과 함께 이 '정보 노출 방지'를 적용한다면, 외부의 어떤 공격 시도에도 시스템의 내부 비밀을 안전하게 지켜낼 수 있는 견고한 방어선을 구축하게 될 것입니다.
댓글 달기