기술과 산업/언어 및 프레임워크

FastAPI 시리즈 15화 - 보안 관점에서 보는 FastAPI 최적 설정 가이드

B컷개발자 2025. 6. 22. 13:26
728x90

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화에서 다룬 CORSMiddlewareSecurityHeadersMiddleware를 반드시 추가해야 함

 


 

7. 공격 대응 체크리스트

공격 유형대응 방법

CSRF REST API는 보통 CSRF에 강함, 필요 시 쿠키 + CSRF 토큰 조합
XSS 모든 응답 콘텐츠 타입 명확 지정 + escape 처리
SQL Injection ORM 사용 + 쿼리 바인딩
토큰 탈취 HTTPS 적용, 만료시간 짧게 설정
로그 유출 HTTPException 메시지에 민감 정보 포함 금지

 


 

정리 – 실전 배포 전 보안 설정 체크리스트

항목설정 내용

서버 실행 --reload 제거, workers 지정
문서화 Swagger UI 차단 또는 인증 필요
HTTPS TLS 적용 + HSTS 설정
민감 정보 .env 사용, 하드코딩 금지
파일 업로드 용량 제한 설정
CORS/보안 헤더 미들웨어로 적용
토큰 보안 만료시간, 암호화, 리프레시 토큰 분리

 

FastAPI는 가볍고 빠르지만, 운영 환경에서는 항상 **“보안 우선”**의 원칙이 필요합니다.

728x90