ローカル開発でCORSエラーが出る原因と3つの回避策
CORS フロントエンド エラー解決 開発
結論
ポート番号が違うだけで「別オリジン」になる。バックエンドでヘッダーを返すか、フロントのProxy機能で回避する。
なぜlocalhost同士でエラーになるのか
ブラウザの同一オリジンポリシーにより、プロトコル+ドメイン+ポート番号が全て一致しないと別オリジン扱いになります。
| フロントエンド | APIサーバー |
|---|---|
| http://localhost:3000 | http://localhost:8080 |
| ポート3000 | ポート8080 → 別オリジン |
よくある勘違い
PostmanやcurlではCORSエラーは出ません。CORSはブラウザ固有のセキュリティ制限です。
回避策1:バックエンドでCORSを許可する(王道)
// Express の例
const cors = require('cors');
app.use(cors({
origin: 'http://localhost:3000'
}));
回避策2:フロントのProxy機能を使う(バックエンドをいじれない時)
// vite.config.ts
export default defineConfig({
server: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
}
}
}
});
これで fetch('/api/users') のように相対パスでリクエストすればCORSを回避できます。
回避策3:ブラウザ拡張で一時的に無効化(非推奨)
検証時に限り、CORS無効化のブラウザ拡張を使う方法もあります。本番では絶対に使わないでください。
関連記事
この記事は セキュリティ テーマの一環です。あわせて読むと理解が深まる関連記事をまとめました。
| トピック | 記事 |
|---|---|
| XSS攻撃と防御の完全ガイド | XSS攻撃と防御の完全ガイド|反射型・蓄積型・DOM型の対策 |
| CSRF対策の実装ガイド | CSRF対策の実装ガイド|SameSite・Synchronizer Token・Laravel/Expressコード |
| Double Submit Cookie完全実装 | Double Submit Cookie完全実装|Synchronizer Token比較・SPA+JWT・サブドメイン攻撃 |
| Content Security Policy (CSP) 設定ガイド | Content Security Policy (CSP) 設定ガイド|XSS・クリックジャッキング対策 |
| CSP Report-Only 段階導入ガイド | CSP Report-Only 段階導入ガイド|本番を壊さずポリシーを検証する |
| セキュリティヘッダー一覧と設定ガイド | セキュリティヘッダー一覧と設定ガイド|CSP・HSTS・Referrer-Policy・Permissions-Policy |
| セキュアなCookie設定ガイド | セキュアなCookie設定ガイド|HttpOnly・Secure・SameSiteの使い分けとCSRF対策 |
| CORSエラーの対処法 | CORSエラーの対処法|「Access-Control-Allow-Origin」で解決する |
| CORSプリフライトリクエスト | CORSプリフライトリクエスト|OPTIONSが飛ぶ条件と正しい応答 |
| OAuth2 PKCE SPA実装ガイド | OAuth2 PKCE SPA実装ガイド|Authorization Code + S256 + BFFパターン |
| Passkeys・WebAuthn実装の基礎 | Passkeys・WebAuthn実装の基礎|FIDO2・Resident Key・@simplewebauthn/server |
| JWTのデバッグ方法 | JWTのデバッグ方法|トークンの中身を安全に確認する |
まとめ
CORSエラーはサーバー側の設定で解決するのが正攻法です。バックエンドを触れない場合はProxy機能を使いましょう。
🧪 JSON整形ツールでAPIレスポンスを確認
APIのレスポンスを整形して確認できます
試す