2-4. 에러 처리 가이드 (제4절)

에러 발생 시 부적절한 처리로 인해 발생하는 취약점을 **Java**와 **Python** 코드를 통해 학습합니다.


제4절: 에러 처리

1. 오류 메시지 정보 노출

개발 환경의 상세한 오류 메시지(스택 트레이스 등)를 사용자에게 그대로 노출하여 시스템 정보를 유출합니다.

Java - 취약한 코드정보 노출
/* 취약한 코드 (Java) */
try {
    // DB 연결 실패 또는 SQL 구문 오류 발생 가정
    connection.createStatement(); 
} catch (Exception e) {
    // 상세 예외 정보를 응답에 포함
    response.getWriter().write(e.toString()); 
}
// -> DB 스키마, 서버 경로 등 상세 정보 노출 위험
Java - 안전한 코드Fix: 일반화된 오류
/* 안전한 코드 (Java) */
try {
    connection.createStatement();
} catch (SQLException e) {
    // 1. 상세 내용은 서버 로그에만 기록 (클라이언트에게 전송 금지)
    log.error("Database error occurred: ", e);
    
    // 2. 클라이언트에게는 일반적인 메시지만 전달
    response.sendError(500, "서비스 처리 중 오류가 발생했습니다.");
}
Python - 취약한 코드정보 노출
# 취약한 코드 (Python - Flask/Django 예시)
from flask import jsonify

@app.route('/data')
def get_data():
    try:
        result = 10 / 0 # ZeroDivisionError 발생 가정
    except Exception as e:
        # 상세 에러 메시지 직접 반환
        return jsonify({'error': str(e)}), 500
# -> "division by zero"와 같은 내부 예외 메시지 노출
Python - 안전한 코드Fix: 일반화된 오류
# 안전한 코드 (Python - Flask/Django 예시)
import logging
log = logging.getLogger(__name__)

@app.route('/data')
def get_data():
    try:
        result = 10 / 0 
    except Exception as e:
        # 1. 상세 내용은 서버 로그에 기록
        log.error("데이터 처리 중 오류 발생", exc_info=True)
        
        # 2. 사용자에게는 일반 메시지 반환
        return jsonify({'error': 'Internal Server Error'}), 500

2. 오류 상황 대응 부재 및 3. 부적절한 예외 처리

광범위한 예외를 잡거나, 로그를 남기지 않거나, 적절한 후속 조치 없이 에러를 무시(Swallowing)하여 오류 상황에 대응하지 못합니다.

Java - 취약한 코드Swallowing Error
/* 취약한 코드 (Java) */
try {
    fileManager.deleteFile(userFile);
} catch (Exception e) { 
    // 모든 예외를 잡고 로그 기록 등 아무런 조치도 취하지 않음
    // 오류가 발생했지만 프로그램은 정상적으로 계속 실행되어 디버깅 불가
}
Java - 안전한 코드Fix: 명시적 Catch 및 Log
/* 안전한 코드 (Java) */
try {
    fileManager.deleteFile(userFile);
} catch (SecurityException e) { 
    // 1. 필요한 특정 예외만 잡고 상세 로그 기록
    log.warn("파일 삭제 권한 없음: ", e);
    // 2. 적절한 오류 전파 (재시도, 사용자 알림 등)
    throw new CustomFileException("권한 문제로 삭제 실패");
} catch (IOException e) {
    log.error("파일 I/O 오류 발생: ", e);
}
Python - 취약한 코드대응 부재/Swallowing
# 취약한 코드 (Python)
try:
    result = calculate_critical_value(data)
except: 
    # 예외의 종류와 상관없이 모두 무시하고 통과 (except Exception: 보다 더 나쁨)
    pass 
    
return default_value 
# -> 계산 오류에도 불구하고 기본값 반환, 오류 감지 불가능
Python - 안전한 코드Fix: 명시적 Catch 및 Log
# 안전한 코드 (Python)
import logging
log = logging.getLogger(__name__)

try:
    result = calculate_critical_value(data)
except ZeroDivisionError as e: 
    # 1. 특정 예외만 잡고 로그 기록
    log.warning(f"계산 중 0 나누기 오류 발생: {e}")
    result = 0 # 2. 안전한 기본값 설정
except Exception as e:
    # 3. 예상치 못한 예외는 상세 로그 기록 후 재전파
    log.error("알 수 없는 오류 발생", exc_info=True)
    raise