【入門編】 CORS(Cross-Origin Resource Sharing)のプリフライトリクエスト – Web APIアーキテクチャ・データ連携実践ガイド

ブラウザの「用心深い門番」:CORSプリフライトリクエストの仕組みを紐解く

こんにちは!ネットワークの世界にどっぷり浸かっているインフラエンジニアです。

皆さんはWebサイトを開発していて、APIを叩いた瞬間にブラウザのコンソール画面で「CORS error」という真っ赤なエラーに絶望したことはありませんか?「ちゃんとAPIは動いているはずなのに、なぜブラウザが怒っているの?」と、夜も眠れなくなるような経験、一度はありますよね。

今日は、その「CORS」という仕組み、特に初学者が一番ハマりやすい「プリフライトリクエスト(OPTIONSメソッド)」について、郵便配達のストーリーに例えて、その裏側を優しく解説していきます。

—

1. そもそもCORSって何?「用心深い門番」の話

Webの世界では、セキュリティのために「違うドメイン(住所)へのアクセスは原則禁止」という同一生成元ポリシー(Same-Origin Policy)というルールがあります。

これを現実世界で例えるなら、「自分の家の郵便受けに、見知らぬ人からの勝手な手紙を入れさせない」というルールです。

しかし、時には外部のサービス(例えば、地図APIや決済APIなど)と連携したいこともありますよね。そこで登場するのがCORS(Cross-Origin Resource Sharing)です。これは、「あらかじめ許可を得た相手なら、手紙のやり取りを認めるよ」という「事前承認リスト」の仕組みのことなんです。

—

2. プリフライトリクエスト:いきなり本番へ行かない理由

ここからが本題の「プリフライトリクエスト」です。

本来なら、JavaScriptで fetch() を使ってAPIを叩けば、すぐにデータが返ってくるはずですよね。でも、ブラウザは非常に用心深いです。いきなり大きな荷物(例えば、データベースを書き換えるような重要なデータ)を送って、もし相手が「え、何それ?」と困惑したら大変ですよね。

そこでブラウザは、いきなり本番のリクエストを送る前に、「OPTIONSメソッド」という「確認用パケット」を先に投げます。これをプリフライト(事前飛行)リクエストと呼びます。

郵便配達の例え

1. プリフライト(確認): 「今から『更新用』の荷物を送りますが、受け取れますか? また、私のような外部の者が送っても大丈夫ですか?」と先に手紙を出す。
2. サーバーの回答: 「OKです。ただし、特定の条件(特定のヘッダーやメソッドなど)に限りますよ」と返事をする。
3. 本番リクエスト: ブラウザが「よし、許可が出た!」と確認して初めて、本来のデータを送る。

この2段階の手順こそが、Webセキュリティを守るための大切なステップなんです。

—

3. サーバー側でやるべきこと:Access-Control-Allow-Origin

では、サーバー側ではどう設定すればいいのでしょうか。答えは簡単で、HTTPレスポンスヘッダーに「このドメインからのアクセスを許可するよ」という印を付けるだけです。

例えば、Webサーバーの設定で以下のようなヘッダーを返すようにします。

# 許可するドメインを指定(* は全許可ですが、本番では推奨されません)
Access-Control-Allow-Origin: https://your-frontend-site.com

# 許可するメソッドを指定
Access-Control-Allow-Methods: GET, POST, OPTIONS

# 許可するヘッダーを指定
Access-Control-Allow-Headers: Content-Type, Authorization

このように、サーバーが「この相手ならOKだよ!」と明示することで、ブラウザは安心して通信を許可してくれます。

—

4. 現場で役立つチェックリスト

もし皆さんの開発環境でエラーが出たら、まずは以下の3点をチェックしてみてください。

  • OPTIONSメソッドへの応答: サーバーが OPTIONS メソッドのリクエストを受け取ったとき、200番台のOKレスポンスを返しているか?(たまに404や405で拒否されていることがあります)
  • ヘッダーの付与: レスポンスの中に Access-Control-Allow-Origin が含まれているか?
  • 開発者ツールのNetworkタブ: ブラウザの開発者ツールを開いて、リクエストが「赤」になっているか確認してください。そこに表示される「Status Code」や「Response Header」を見ると、何が足りないのかが一目瞭然です。

—

最後に:ネットワークを俯瞰する視点を持つ

CORSエラーは、一見すると「開発の邪魔者」に見えます。しかし、これはブラウザが私たちのWebアプリケーションを、悪意あるスクリプトから守ってくれている「頼もしい門番」の働きなんです。

仕組みさえ分かってしまえば、もう怖くありません。「あ、今ブラウザが事前に確認しているんだな」と、パケットの流れを想像できるようになれば、あなたはもうインフラの入り口に立っています。

一歩ずつ、確実に理解を深めていきましょうね。また次回の記事でお会いしましょう!

コメント

タイトルとURLをコピーしました