ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • FastAPI 시리즈 15화 - 보안 관점에서 보는 FastAPI 최적 설정 가이드
    기술과 산업/언어 및 프레임워크 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
Designed by Tistory.