Open hysryt opened 5 years ago
同一生成元ポリシーとは、生成元(オリジン)が同一でないリソース同士の干渉を制限する、ブラウザのサンドボックスに用意された仕組みである。
あるオリジンから取得したリソースと、別のオリジンから取得したリソース同士の相互作用を制限する。 リソース同士の関係を分離することで、悪意あるリソースからの攻撃を防止する。
ここでいうリソースとは、JavaScriptやHTML、画像などを指す。 相互作用とは、HTMLからの画像の読み込み、CSSからのフォントの読み込み、JavaScriptからのXMLHttpRequestなど、広い範囲を指す。
リソースの生成元。源泉などということもある。 ホスト、スキーム、ポートの3つによって識別する。 これら3つが同じであれば「オリジンが同一」とみなす。
制限は以下の3つのカテゴリにわけられる。
書き込みは概して許可される。 書き込みとは、具体的には以下のようなものを指す。
埋め込みは概して許可される。 埋め込みとは、具体的には以下のようなものを指す。
<script src="..."></script>
を使った、HTMLへの別オリジンのJavaScriptの埋め込み<link rel="stylesheet" href="...">
を使った、HTMLへの別オリジンのCSSの埋め込み<img>
を使った、HTMLへの別オリジンの画像の埋め込み@font-face
を使った、CSSへの別オリジンのフォントの埋め込み
これはブラウザの種類によっては制限される場合がある読み込みは概して許可されない。 読み込みとは、具体的には以下のようなものを指す。
XMLHttpRequest
や Fetch API を使った、JavaScriptから別オリジンのリソースの読み込み(CORSで緩和可能)XMLHttpRequest
で別オリジンのリソースが読み込めないことを確認する。
origin1.test
、もう一方を origin2.test
に設定origin1.test
に JSON ファイルを設置origin2.test
に origin1.test
の JSON ファイルを取得する JavaScript ファイルと、それを動かす HTML ファイルを設置origin2.test
にアクセスし、JSONファイルを取得できるかを確認する。クロスオリジンリソースシェアリング。オリジン間リソース共有ともいう。
悪意を持ったサイトからログイン済みの正規のサイトのユーザー情報が取得できてしまう(CSRF)のを防ぐ仕組み。
この時 evil.example.com から bob.example.com への XMLHttpRequest が自由に投げられるとAliceの個人情報が evil.example.com に流出してしまう。(bob.example.comからはログイン済みのページが返ってくるため)
同一生成元ポリシーによる制限を緩和するための仕組み。 リソースを別オリジンに公開したい際に使用される。
CORS によって以下のような処理が緩和される。
XMLHttpRequest
や Fetch API による別オリジンのリソースの取得@font-family
による別オリジンのフォントの取得アクセスされる側のサーバーに、アクセスを許可するオリジンの情報を設定する。
アクセスする側のオリジンからのHTTPヘッダーに含める。 CORSでは新たな独自のHTTPヘッダーを使用する。
これらはブラウザによって指定されるため、XMLHttpRequest
を使用する場合でも手動で設定する必要はない。
アクセスする側のオリジンを指定する。
Origin: https://developer.mozilla.org
プリフライトリクエストに使用する。 実際にリクエストに使用するメソッドを指定する。
Access-Control-Request-Method: PUT
プリフライトリクエストに使用する。 実際にリクエストに使用するヘッダーを指定する。
Access-Control-Request-Headers: X-My-Custom-Header
アクセスされる側のオリジンからのHTTPヘッダーに含める。
アクセスを許可するオリジンを指定する。
すべてのオリジンに許可を与える場合は *
を指定する。
特定のオリジンを指定する場合は以下のようにする。
Access-Control-Allow-Origin: http://mozilla.org
*
以外を指定する場合は、キャッシュを防ぐため Vary
ヘッダーに Origin を追加する必要がある。
プリフライトリクエストの結果をキャッシュして良い時間を秒単位で指定する。
プリフライトリクエストに対するレスポンスに含める。 許可するHTTPメソッドを指定する。
Access-Control-Allow-Methods: PUT, OPTIONS
プリフライトリクエストに対するレスポンスに含める。 許可するHTTPヘッダーを指定する。
Access-Control-Allow-Headers: X-My-Custom-Header
レスポンスボディを公開できるかを指定する。
Access-Control-Allow-Credentials: true
アクセスする側による読み込みを許可するヘッダーを指定する。
CORSによって別オリジンからのリソース読み込みを許可できることを確認する。
origin1.test
、もう一方を origin2.test
に設定origin1.test
に JSON ファイルを設置origin2.test
に origin1.test
の JSON ファイルを取得する JavaScript ファイルと、それを動かす HTML ファイルを設置origin1.test
に、アクセスを許可するオリジンとして origin2.test
を設定する。origin2.test
にアクセスし、JSONファイルを取得できるかを確認する。