【どういつおりじんぽりしー】

同一オリジンポリシー とは?

最終更新:
💡 よそのサイトのデータは勝手に覗けません

Webブラウザに組み込まれたセキュリティの仕組みで、あるオリジン(スキーム+ホスト+ポート)から読み込まれたスクリプトが、別のオリジンのデータを読み取ることを制限する。

📌 このページのポイント
「同じ出所」なら読み取れるWebのオリジン=スキーム+ホスト+ポートページのJavaScriptブラウザが読み取りを判断同じ出所✓ 読取り可別の出所CORSで許可別の出所許可なし画像の表示やフォーム送信とは違う全ての攻撃を防ぐ、という意味ではない
Webページからデータを読み取る場合の例です。送信や埋め込み、ブラウザ外の通信とは制御が違います。
ひよこ ひよこ
同一オリジンポリシーって何なの?
ペンギン先生 ペンギン先生
Webブラウザに備わっている「セキュリティの門番」みたいなものだよ。あるサイトのJavaScriptが、別のサイトのデータを勝手に読み取れないように制限する仕組みなんだ。悪意のあるサイトのスクリプトが、裏で銀行サイトの画面の中身を読み取れたら怖いよね?このルールがあるから、別のオリジンのデータはそのままでは読めないんだよ。
ひよこ ひよこ
「オリジン」って具体的に何で決まるの?
ペンギン先生 ペンギン先生
3つの要素の組み合わせだよ。スキーム(httpかhttpsか)、ホスト(store.example.comなど)、ポート番号(80, 443など)。この3つが全て一致すれば「同一オリジン」。http://example.com と https://example.com はスキームが違うし、store.example.com と news.example.com もホストが違うから別オリジンだよ。
ひよこ ひよこ
でもAPIとか別のサーバーのデータを使いたいときはどうするの?
ペンギン先生 ペンギン先生
そこでCORSという仕組みを使うんだ。APIサーバー側が「このオリジンからの読み取りは許可するよ」とレスポンスヘッダーで宣言すれば、ブラウザがそれを確認してJavaScriptに結果を渡してくれる。同一オリジンポリシーの「例外許可証」みたいなものだね。
ひよこ ひよこ
画像やCSSは別サイトから読み込めるけど、あれはどうなっているの?
ペンギン先生 ペンギン先生
<img>タグや<link>タグでの読み込みは「埋め込み」として基本的に許可されているんだ。制限されるのはJavaScriptによる中身の読み取り。たとえば別オリジンの画像をCORSの許可なしでcanvasに描くと、そのcanvasからgetImageData()でピクセルを読み出そうとした時点でエラーになるよ。
ひよこ ひよこ
これがあればXSSやCSRFも防げるってこと?
ペンギン先生 ペンギン先生
そこは注意が必要だよ。XSSは攻撃スクリプトが対象サイトと同じオリジンで動いてしまう攻撃だから、同一オリジンポリシーでは止められない。CSRFもフォーム送信のような「書き込み」は別オリジンから基本的に送れるから、CSRFトークンやSameSite属性のCookieなど別の対策が必要なんだ。それに制御するのはブラウザだけで、curlやサーバー間の通信には適用されないよ。
もっと詳しく知りたい人へ

開発中にCORSエラーが出たら、フロントエンドのコードで直せる?

基本的には、データを返すサーバーのCORS設定を確認するよ。Cookieなどの資格情報を含めるなら、フロント側でもcredentialsなどの指定が必要。サーバーのAccess-Control-Allow-Originには*ではなく許可するオリジンを指定し、Access-Control-Allow-Credentials: trueも必要になる。Cookie自体の制限にも従うので、これだけで送信を保証するわけではない。詳しいエラーはブラウザのコンソールで確認しよう。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「同一オリジンポリシー」って出てきたら「ブラウザが、別のサイトのデータを勝手に読ませないためのルール」と思えばだいたいOK!
📖 おまけ:英語の意味
「Same-Origin Policy」 = 同一オリジンポリシー
💬 Origin(起源・出所)が同じかどうかで、スクリプトがデータを読めるかを決める仕組みだよ

参考資料

← 用語集にもどる