디버그 및 테스트 모드 활성화

Python 웹 프레임워크의 디버그 또는 테스트 모드가 프로덕션에서 활성화된 상태

설명

Django, Flask, FastAPI와 같은 웹 프레임워크의 디버그 모드는 개발 중 상세한 오류 정보를 확인하기 위한 기능입니다. 프로덕션에서 활성화하면 스택 트레이스, 소스 코드 일부, 로컬 변수, 설정값 등의 내부 정보가 응답에 포함될 수 있습니다.

Flask의 TESTING 설정은 디버그 모드와 별개의 기능입니다. 이 설정은 테스트 전용 확장 동작을 활성화하고, PROPAGATE_EXCEPTIONS를 별도로 설정하지 않으면 예외 전파도 암시적으로 활성화합니다. TESTING=True 자체가 Flask의 대화형 디버거를 켜지는 않지만, 프로덕션의 정상적인 오류 처리 흐름을 바꾸고 테스트 전용 동작이 실제 요청에 영향을 주게 할 수 있습니다.

잠재적 영향

  • 내부 정보 노출: Django의 상세 오류 페이지와 FastAPI의 디버그 트레이스백은 소스 위치, 설정, 요청 처리 구조와 같은 정보를 노출할 수 있습니다.
  • 원격 코드 실행: 프로덕션에 노출된 Flask/Werkzeug 대화형 디버거는 브라우저에서 Python 코드를 실행할 수 있습니다. PIN을 보안 통제로 신뢰해서는 안 됩니다.
  • 오류 처리 및 확장 동작 변경: Flask 테스트 모드는 예외를 애플리케이션 오류 처리기로 전달하는 대신 전파할 수 있으며, 확장 기능이 테스트 전용 동작을 활성화할 수 있습니다.

해결 방법

  • 프로덕션 구성에서는 Django DEBUG, Flask DEBUG와 TESTING, FastAPI debug를 명시적인 불리언 False로 유지합니다.
  • 개발·테스트·프로덕션 구성을 분리하고, 배포 전에 실제 적용될 설정을 자동으로 검증합니다.
  • 프로덕션에서는 프레임워크의 개발 서버나 대화형 디버거를 사용하지 말고, 일반 오류 응답과 서버 측 로깅·알림을 구성합니다.
  • 환경 변수 값을 직접 불리언 인수에 전달하지 않습니다. os.getenv("DEBUG", "False")는 문자열을 반환하며, 비어 있지 않은 문자열 "False"도 Python에서 참으로 평가됩니다. 환경 변수를 사용할 때는 형식이 지정된 설정 계층에서 불리언으로 파싱한 뒤 사용합니다.

개발·테스트 환경에서 필요한 설정은 프로덕션 구성과 분리하고, 배포 시 최종 적용값을 확인하세요.

예시

Django

변경 전

python
# settings/production.py
DEBUG = True

변경 후

python
# settings/production.py
DEBUG = False

Flask 디버그 모드

변경 전

python
from flask import Flask

app = Flask(__name__)
app.run(debug=True)

변경 후

python
from flask import Flask

app = Flask(__name__)
app.config["DEBUG"] = False

# 프로덕션에서는 Flask 개발 서버가 아닌 프로덕션 WSGI 서버로 실행합니다.

Flask 테스트 모드

변경 전

python
from flask import Flask

app = Flask(__name__)
app.config.update(TESTING=True)
# app.testing = True도 같은 설정을 활성화합니다.

변경 후

python
from flask import Flask

app = Flask(__name__)
app.config.update(TESTING=False)

FastAPI

변경 전

python
from fastapi import FastAPI

app = FastAPI(debug=True)

변경 후

python
from fastapi import FastAPI

app = FastAPI(debug=False)

설명:

  • 변경 전: 프로덕션에서 상세 오류 또는 테스트 전용 동작을 활성화합니다.
  • 변경 후: 프로덕션 구성에 실제 불리언 False를 사용하여 관련 기능을 비활성화합니다.

참조