FastAPI to React CORS 오류

✒️ 2026-03-01 13:01 내용 수정


📋 문제 개요

문제 설명
프론트엔드 로컬 환경과 배포된 FastAPI 서버간 API 요청 연결 안됨.

fastapi_to_react_cors_error1.png

사진을 보면 400코드를 받은 상태고, 현재 서버에선 CORS 미들웨어로 특정 클라이언트 요청만 받도록 설정해둔 상태다.
다만 개발 환경에서 Render로 배포된 FastAPI로 React 로컬에서의 요청을 전송할 때 CORS로 요청이 전송되지 않았다.
React 로컬의 IP 주소를 허용 origin 목록에 넣어도 문제가 해결되지 않았다.
fastapi_to_react_cors_error2.png


🔍 상세 정보

발생 환경

재현 방법

  1. FastAPI의 CORS 설정 중 허용할 Origin 설정(allow_origins)에 IP 주소만 입력

에러 메시지 및 로그


🔎 원인 분석

조사 과정

근본 원인

허용할 Origin 목록에 로컬 환경 IP 주소가 아닌 Request Header에 표기되는 Origin 을 작성해야 함.


✅ 해결 방법

적용한 솔루션

임시 조치 (Workaround)

  1. 서버의 CORS의 설정 변경
    1. allow_origins 을 와일드 카드(*)로 설정하여 모든 Origin 허용
    2. allow_credentials = False 로 임시 변경
    3. allow_methodsOPTIONS 추가
    4. allow_headers=["Access-Control-Request-Method"] 를 추가
  2. Origin을 검증하는 verify_origin 함수에서 모든 Origin을 허용
# main.py

# CORS 미들웨어 등록
app.add_middleware(
    CORSMiddleware,
    allow_origins=allowed_origins,
    allow_credentials=False, # 임시 해결 조치
    allow_methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"],
    allow_headers=["Content-Type", "Authorization", "Access-Control-Request-Method"],
)
# app/routes/deps.py

# 서버단 ORIGIN 필터
def verify_origin(request: Request):
    settings = get_settings()
    allowed = set(parse_origins(getattr(settings, "client_origin", "")))
    
	# 생략...
    
    if "*" in allowed:
        if origin:   # 브라우저 요청
            return
# .env
# 프론트엔드 연동 설정
CLIENT_ORIGIN="*"

실제 해결 방법

# .env
CLIENT_ORIGIN="http://localhost:5173, 프론트엔드_도메인"

fastapi_to_react_cors_error5.png

# main.py

# CORS 미들웨어 등록
app.add_middleware(
    CORSMiddleware,
    allow_origins=allowed_origins,
    allow_credentials=True, # 보안 필수
    allow_methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"],
    allow_headers=["Content-Type", "Authorization", "Access-Control-Request-Method"],
)
# app/routes/deps.py

# 서버단 ORIGIN 필터
def verify_origin(request: Request):
    settings = get_settings()
    allowed = set(parse_origins(getattr(settings, "client_origin", "")))
    
	# 생략...
    
    """
    아래 부분을 다시 제거
    if "*" in allowed:
        if origin:   # 브라우저 요청
            return
    """