-
FastAPI 시리즈 15화 - 보안 관점에서 보는 FastAPI 최적 설정 가이드기술과 산업/언어 및 프레임워크 2025. 6. 22. 13:26728x90
FastAPI 서비스 운영 시 반드시 점검해야 할 보안 설정과 환경 구성 방법을 정리합니다. 서버 실행 옵션, HTTPS 적용, 미들웨어 보안 설정 등 실전 배포 전 필수 체크리스트를 제공합니다.
왜 운영 환경 최적화가 중요한가?
FastAPI는 개발 속도가 빠르고 문서화도 자동으로 되지만,
운영 환경에서 기본 설정 그대로 사용하면 다음과 같은 문제가 발생할 수 있습니다:
- 서버 재시작 없이 코드가 반영되는 --reload 모드 유지
- Swagger UI로 민감한 API 노출
- 토큰 만료/암호화 처리 미흡
- 파일 업로드 크기 무제한 설정
- HTTPS 미적용으로 인해 토큰/쿠키 유출 가능
운영 환경에서는 반드시 보안과 안정성 중심으로 구성을 재점검해야 합니다.
1. 서버 실행 설정 점검 (Uvicorn/Gunicorn)
✅ 개발 시
uvicorn app.main:app --reload
- 코드 변경 시 자동 재시작 (편리하지만 보안상 위험)
- 운영 환경에서는 절대 사용하지 말아야 할 옵션
✅ 운영 시
uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 4 --proxy-headers
혹은 Gunicorn + Uvicorn worker 조합:
gunicorn app.main:app -k uvicorn.workers.UvicornWorker --workers 4
- workers: 병렬 요청 처리 가능 (CPU 코어 수 기준)
- proxy-headers: 리버스 프록시(예: Nginx) 뒤에 있을 경우 필수
2. Swagger UI 비공개 설정
Swagger UI는 개발 중에는 매우 유용하지만, 운영 시 다음을 고려해야 합니다:
✅ 방법 1: 문서 경로 비활성화
app = FastAPI(docs_url=None, redoc_url=None)
✅ 방법 2: 관리자 인증 후만 노출
@app.get("/docs", include_in_schema=False) def custom_docs(user=Depends(admin_only)): return get_swagger_ui_html(openapi_url="/openapi.json", title="Secure Docs")
- include_in_schema=False로 자동 문서화 제외
- Depends()로 관리자만 접근 허용
3. HTTPS 적용 및 HSTS 설정
- HTTPS는 선택이 아니라 필수입니다.
- 인증 토큰이나 세션 쿠키는 HTTP 환경에서는 쉽게 탈취될 수 있음
✅ HTTPS 적용 방법
- Nginx, Cloudflare, ALB 등에서 TLS 종료 (TLS Termination)
- FastAPI는 내부 포트에서 HTTP만 유지
- Strict-Transport-Security 헤더로 HTTPS만 강제
response.headers["Strict-Transport-Security"] = "max-age=63072000; includeSubDomains; preload"
4. 민감 정보 보호 (예: JWT 키, DB 비밀번호 등)
환경변수를 통해 구성하고 .env 파일 사용 권장
from dotenv import load_dotenv import os load_dotenv() SECRET_KEY = os.getenv("SECRET_KEY") DATABASE_URL = os.getenv("DATABASE_URL")
✅
.env
예시
SECRET_KEY=myproductionsecret DATABASE_URL=postgresql://user:pass@host/db
- Git에 커밋하지 않도록 .gitignore에 .env 반드시 추가
5. 파일 업로드 용량 제한
기본 설정으로는 업로드 용량 무제한 → DoS 공격 위험
✅ Uvicorn 실행 시 제한 설정
uvicorn app.main:app --limit-max-request-size 10485760 # 10MB
- 파일 업로드 시 적절한 제한 설정 필수
- 서버 디스크 사용량 모니터링 병행
6. CORS 및 보안 헤더 미들웨어 적용 (복습)
- CORS: 외부 도메인 제한 설정
- 보안 헤더: 콘텐츠 타입 오용, XSS 방지, iframe 차단
이미 14화에서 다룬 CORSMiddleware와 SecurityHeadersMiddleware를 반드시 추가해야 함
7. 공격 대응 체크리스트
공격 유형대응 방법
CSRF REST API는 보통 CSRF에 강함, 필요 시 쿠키 + CSRF 토큰 조합 XSS 모든 응답 콘텐츠 타입 명확 지정 + escape 처리 SQL Injection ORM 사용 + 쿼리 바인딩 토큰 탈취 HTTPS 적용, 만료시간 짧게 설정 로그 유출 HTTPException 메시지에 민감 정보 포함 금지
정리 – 실전 배포 전 보안 설정 체크리스트
항목설정 내용
서버 실행 --reload 제거, workers 지정 문서화 Swagger UI 차단 또는 인증 필요 HTTPS TLS 적용 + HSTS 설정 민감 정보 .env 사용, 하드코딩 금지 파일 업로드 용량 제한 설정 CORS/보안 헤더 미들웨어로 적용 토큰 보안 만료시간, 암호화, 리프레시 토큰 분리 FastAPI는 가볍고 빠르지만, 운영 환경에서는 항상 **“보안 우선”**의 원칙이 필요합니다.
728x90'기술과 산업 > 언어 및 프레임워크' 카테고리의 다른 글
Spring Framework 시리즈 14화 – Model, ModelAndView, ResponseEntity 비교와 활용법 (0) 2025.07.02 Spring AI 시리즈 9화 - Milvus와 Spring AI 통합 전략 (1) 2025.06.26 전자정부 표준프레임워크 시리즈 15화 – Gradle + Spring Boot 전환 전략: 표준프레임워크의 현대화 실전 사례 (2) 2025.06.22 Spring Boot 고급 시리즈 7화 – 도메인 이벤트 기반 아키텍처 설계와 적용 전략 (0) 2025.06.22 Spring Boot 고급 시리즈 6화 – 트랜잭션 경계와 영속성 컨텍스트: JPA의 진짜 작동 원리 (0) 2025.06.22