Choorai
CORS 사전 요청 실패

CORS Preflight 405 해결하기

실제 API 호출 전에 보내는 OPTIONS 요청이 405 Method Not Allowed로 실패하면 본요청도 실패합니다.

TL;DR (핵심 요약)

1) Network 탭에서 OPTIONS 응답코드 확인 2) CORS 미들웨어 순서를 라우터 앞에 배치 3) Access-Control-Allow-Methods/Headers 검증

주의

Response to preflight request doesn't pass access control check: It does not have HTTP ok status

원인

브라우저 preflight OPTIONS 요청이 405 또는 4xx로 차단되어 CORS 검증에 실패했습니다.

해결책
  1. 서버에서 OPTIONS 메서드 허용
  2. CORS 미들웨어를 라우팅보다 먼저 적용
  3. 허용 메서드/헤더/오리진 명시
  4. 프록시/WAF가 OPTIONS를 막지 않는지 확인

설정 예시

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

app = FastAPI()

app.add_middleware(
  CORSMiddleware,
  allow_origins=["https://app.example.com"],
  allow_credentials=True,
  allow_methods=["*"],
  allow_headers=["*"],
)
Express
import express from 'express';
import cors from 'cors';

const app = express();

app.use(cors({
  origin: 'https://app.example.com',
  credentials: true,
  methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
}));

주의

allow_origins=['*']allow_credentials=true 조합은 함께 사용할 수 없습니다.

Prerequisites

  • 브라우저 Network 탭에서 OPTIONS 요청과 응답 코드를 확인할 수 있어야 합니다.
  • 서버 라우팅/미들웨어 설정을 수정할 수 있어야 합니다.
  • API 게이트웨이 또는 프록시에서 메서드 허용 설정을 확인할 수 있어야 합니다.

Validation

  1. OPTIONS preflight가 200 또는 204로 응답합니다.
  2. Access-Control-Allow-Methods에 실제 요청 메서드가 포함됩니다.
  3. 실제 본요청(PUT/DELETE/PATCH 등)이 정상 처리됩니다.

Troubleshooting

  • 라우터에서 OPTIONS 메서드를 별도 핸들링하거나 CORS 미들웨어 순서를 앞에 두세요.
  • 프록시/WAF가 OPTIONS를 차단하지 않는지 확인하세요.
  • 허용 헤더(Authorization, Content-Type 등)를 명시적으로 추가하세요.

References

관련 문서

마지막 업데이트: 2026년 2월 22일 · 버전: v0.0.1

피드백 보내기

입력한 내용으로 새 이슈 페이지를 엽니다.

GitHub 이슈로 보내기