ポイントまとめ
CORS(Cross-Origin Resource Sharing)は「異なるオリジン(ドメイン・ポート・プロトコル)の間で安全にリソースを共有する仕組み」です。ブラウザの fetch では mode:'cors' を指定することで、サーバーが許可していればクロスオリジン通信が可能になります Qiita Scrapbox Qiita。
まず理解すべきこと
- 同一オリジンポリシー: ブラウザはセキュリティのため「同じオリジン」以外へのアクセスを制限します。
- オリジン = プロトコル + ドメイン + ポート
- 例:
https://example.com:443とhttp://example.com:80は別オリジン。
- CORS: サーバーが特定のオリジンからのアクセスを許可する仕組み。HTTPレスポンスに
Access-Control-Allow-Originヘッダが必要。
fetch の mode 設定
| モード | 説明 | 例 |
|---|---|---|
same-origin | 同一オリジンのみ許可。他オリジンはエラーになる。 | fetch('/api', { mode: 'same-origin' }) |
cors | サーバーが CORS ヘッダを返せばクロスオリジン通信可能。 | fetch('https://api.example.com', { mode: 'cors' }) |
no-cors | 制限付きでリクエスト可能だがレスポンスは「opaque(中身が見えない)」になる。 | fetch('https://api.example.com', { mode: 'no-cors' }) |
基本のコード例
// クロスオリジン通信(サーバーがCORS対応している必要あり)
fetch("https://api.example.com/data", {
method: "GET",
mode: "cors"
})
.then(res => res.json())
.then(data => console.log("取得成功:", data))
.catch(err => console.error("エラー:", err));
JavaScriptよく使うテンプレート集
JSON API にアクセス
fetch("https://api.example.com/users", {
method: "POST",
mode: "cors",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name: "Aki" })
});
JavaScriptCookie を含める場合
fetch("https://api.example.com/secure", {
method: "GET",
mode: "cors",
credentials: "include" // Cookie送信を許可
});
JavaScript例題: ローカル開発での CORS エラー
// フロント: http://localhost:3000
fetch("http://localhost:8080/api/users", { mode: "cors" });
JavaScript- サーバーが
Access-Control-Allow-Origin: http://localhost:3000を返さないとエラーになる。 - 解決方法: サーバー側で CORS 設定を追加する必要がある。
💡 実務でのコツ
- ブラウザ側は設定だけ: 実際に許可するかどうかはサーバー次第。
no-corsはほぼ使わない: レスポンスが読めないので実用性が低い。- 開発時の典型的なエラー: 「No ‘Access-Control-Allow-Origin’ header is present」→ サーバー側設定不足。
直感的な指針
- 同一オリジンポリシーが基本。
- CORS はサーバーが許可して初めて動く。
- ブラウザ側では
mode:'cors'を指定するだけ。 - Cookie を送るなら
credentials:'include'も忘れずに。
これを覚えれば「なぜクロスオリジンでエラーが出るのか」「どう設定すれば通信できるのか」が理解でき、初心者でも CORS の仕組みを安心して扱えるようになります。
