この記事で解決すること
ブラウザの開発者ツールにこんなエラーが出た。
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技術をもっと学びたい方へ:
リンク