FastAPI 서버개발, CORS 설정

FastAPI는 현대적인 웹 API를 쉽게 구축할 수 있도록 돕는 Python 기반의 프레임워크입니다. 이 프레임워크는 높은 성능을 자랑하며, 데이터 검증, 자동 문서화 등의 기능을 제공합니다. 본 글에서는 FastAPI 서버 개발 과정에서 마주칠 수 있는 CORS(Cross-Origin Resource Sharing) 설정에 대해 자세히 설명하고, 이를 통해 다양한 클라이언트(웹 브라우저 등)에서 API를 안전하게 접근할 수 있도록 하는 방법을 다루겠습니다.

CORS란 무엇인가?

CORS(Cross-Origin Resource Sharing)는 웹 브라우저에서 서로 다른 출처(origin)에서 리소스를 요청할 수 있게 하는 보안 기능입니다. 예를 들어, 만약 http://example.com에서 호스팅되는 웹 애플리케이션이 http://api.example.com으로 요청을 보낼 경우, 두 URL의 출처가 다르기 때문에 기본적으로 차단됩니다. 이를 해결하기 위해 CORS를 설정하여 특정 출처에서 API를 접근할 수 있도록 허용할 수 있습니다.

CORS의 필요성

CORS는 보안상의 이유로 구현되어 있습니다. 사용자가 스스로 모르는 사이에 악성 스크립트가 다른 도메인에 있는 데이터에 접근하는 것을 방지하기 위함입니다. 하지만 웹 애플리케이션에서는 여러 서비스와 상호작용을 위해 다른 출처와 연결할 필요가 있습니다. 따라서, 올바른 CORS 정책을 설정하는 것이 중요합니다.

FastAPI에서 CORS 설정하기

FastAPI에서는 fastapi.middleware.cors 모듈의 CORSMiddleware 클래스를 사용하여 쉽게 CORS 정책을 설정할 수 있습니다. 아래의 단계를 통해 FastAPI 애플리케이션에 CORS를 추가하는 방법을 살펴보겠습니다.

1. FastAPI 설치하기

FastAPI 및 기타 필요한 라이브러리를 우선 설치해야 합니다. 아래의 명령어를 터미널에 입력하여 FastAPI와 uvicorn을 설치합니다.

pip install fastapi uvicorn

2. 기본 FastAPI 애플리케이션 생성하기

아래의 코드는 FastAPI 애플리케이션을 간단히 설정하는 예제입니다.

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"message": "Hello, FastAPI!"}

3. CORS 미들웨어 추가하기

CORS를 설정하기 위해 CORSMiddleware를 FastAPI 애플리케이션에 추가합니다. `allow_origins` 매개변수를 사용하여 허용할 출처를 지정할 수 있습니다.

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

# CORS 설정
origins = [
    "http://localhost:3000",
    "https://myfrontend.com",
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,  # 허용할 출처
    allow_credentials=True,
    allow_methods=["*"],  # 허용할 HTTP 메서드
    allow_headers=["*"],  # 허용할 헤더
)

@app.get("/")
async def read_root():
    return {"message": "Hello, FastAPI!"}

4. CORS 설정 옵션 설명하기

  • allow_origins: 요청을 허용할 출처를 명시합니다. 도메인 이름이나 와일드카드(*)를 사용할 수 있습니다.
  • allow_credentials: 쿠키 및 인증 정보를 포함한 요청을 허용할지 여부를 설정합니다.
  • allow_methods: 허용할 HTTP 메서드를 설정합니다. 기본값은 GET, POST입니다.
  • allow_headers: 클라이언트가 요청할 수 있는 헤더를 지정합니다.

5. 다양한 환경에서의 CORS 설정 예제

개발 환경, 테스트 환경, 운영 환경에 따라 CORS 설정을 다르게 할 수 있습니다. 예를 들어, 개발 환경에서는 로컬 출처만을 허용하고, 운영 환경에서는 여러 도메인을 허용할 수 있습니다. 아래는 상황에 따라 다르게 설정하는 예제입니다.

import os
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

# 환경에 따라 CORS 설정을 변경
if os.getenv("ENV") == "production":
    origins = [
        "https://myfrontend.com",
        "https://anotherdomain.com",
    ]
else:
    origins = [
        "http://localhost:3000",
    ]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.get("/")
async def read_root():
    return {"message": "Hello, FastAPI!"}

6. CORS 관련 문제 해결하기

CORS 설정을 제대로 해도 가끔 원하는 대로 동작하지 않을 수 있습니다. 이때 확인해야 할 몇 가지 사항이 있습니다.

  • 브라우저 콘솔 로그: 브라우저의 개발자 도구를 열고, 콘솔 탭에서 CORS 관련 에러 메시지를 확인합니다.
  • 서버 로그: FastAPI 서버의 로그 파일을 점검하여 요청이 서버에 도달했는지 확인합니다.
  • 네트워크 요청 확인: 개발자 도구의 네트워크 탭에서 요청 헤더와 응답 헤더를 분석하여 문제를 파악합니다.

결론

FastAPI는 CORS 설정을 통해 웹 애플리케이션과 API 간의 안전한 통신을 가능하게 합니다. 올바른 CORS 정책을 설정하여 다양한 출처의 클라이언트가 API를 접근할 수 있도록 하는 것이 중요합니다. 본 글에서 설명한 내용을 통해 FastAPI에서 CORS를 간단하게 설정하고 문제를 해결하는 데 도움이 되길 바랍니다.