この記事で解決すること

ブラウザの開発者ツールにこんなエラーが出た。

Access to fetch at 'https://api.example.com' from origin 'http://localhost:3000'
has been blocked by CORS policy

「CORS」って何?なぜブロックされるの?

CORSとは

CORSは「Cross-Origin Resource Sharing(クロスオリジンリソースシェアリング)」の略です。

簡単に言うと、ブラウザのセキュリティ機能です。「別のサイトのデータを勝手に取りに行くのを防ぐ」仕組みです。

なぜ必要なのか

もしCORSがなかったら、悪意のあるサイトがあなたのブラウザを使って、銀行のサイトやメールのデータを勝手に取得できてしまいます。それを防ぐために、ブラウザが「このリクエストは許可されていません」とブロックしています。

なぜ開発中に出るのか

開発中は http://localhost:3000 でサイトを動かして、https://api.example.com にデータを取りに行くことが多いです。

この2つは「別のオリジン(出所)」なので、ブラウザがブロックします。

オリジンとは「プロトコル + ドメイン + ポート番号」の組み合わせです。

http://localhost:3000  ← オリジンA
https://api.example.com ← オリジンB(別のオリジン)

解決方法

方法1:サーバー側でCORSを許可する(正攻法)

APIサーバー側で、特定のオリジンからのアクセスを許可する設定を追加します。

Node.js(Express)の場合:

const cors = require('cors');
app.use(cors({
  origin: 'http://localhost:3000'
}));

Pythonの場合:

from flask_cors import CORS
CORS(app, origins=['http://localhost:3000'])

方法2:プロキシを使う(フロントエンド側で対処)

自分のサーバーを経由してAPIにアクセスする方法です。ブラウザから見ると同じオリジンなので、CORSエラーが出ません。

方法3:開発中だけブラウザの制限を無効にする

Chrome拡張「Allow CORS」を使うと、開発中だけCORSを無効にできます。ただし本番環境では使えないので、あくまで一時的な対処です。

やってはいけないこと

// NG:すべてのオリジンを許可
app.use(cors({ origin: '*' }));

本番環境で *(すべて許可)にすると、セキュリティリスクになります。許可するオリジンは具体的に指定してください。

まとめ

  • CORSはブラウザのセキュリティ機能
  • 別のオリジンへのリクエストがブロックされる
  • サーバー側で許可設定を追加するのが正攻法
  • 本番環境では * を使わない

あわせて読みたい

関連リソース

Web技術をもっと学びたい方へ: