クロスオリジン リソース シェアリング(CORS)

同一生成元ポリシーは、生成元が異なるリソース間でやり取りが行われないようにクライアント側のウェブ アプリケーション(ウェブブラウザなど)に適用されるセキュリティ ポリシーです。不正行為の防止には役立ちますが、このセキュリティを適用すると既知の生成元の間での有効で正当なやり取りも行えなくなります。たとえば、example.appspot.com の App Engine からホストされているページのスクリプトで、example.storage.googleapis.com の Cloud Storage バケットに保存されているリソースを使用する必要があるとします。ただし、ブラウザから見ると 2 つの異なる生成元があるため、ブラウザは example.appspot.com からのスクリプトが example.storage.googleapis.com からリソースを取得することを許可しません。

この制限の回避策としてクロスオリジン リソース シェアリング(CORS)仕様が World Wide Web Consortium(W3C)で開発されました。Cloud Storage では、CORS をサポートするようにバケットを設定することを許可してこの仕様をサポートしています。上記の例を続けると、ブラウザが自分のリソースを example.appspot.com からのスクリプトと共有することができるように example.storage.googleapis.com バケットを設定することができます。

CORS のしくみ

CORS リクエストには、シンプルとプリフライトの 2 種類があります。シンプル リクエストは直接開始することができます。プリフライトされたリクエストは、メイン リクエストを続行する前に、サーバーに予備の「プリフライト」リクエストを送信して権限を取得する必要があります。次のいずれかの状況が当てはまる場合、リクエストはプリフライトされます。

  • GETHEAD または POST 以外のメソッドを使用する。
  • text/plainapplication/x-www-form-urlencodedmultipart/form-data 以外の、Content-TypePOST メソッドを使用する。
  • カスタム ヘッダーを設定する。

ブラウザが Cloud Storage に簡単なリクエストを行うと、次のプロセスが発生します。

  1. ブラウザは、リクエストに Origin ヘッダーを追加します。Origin ヘッダーには、たとえば Origin:http://www.example.appspot.com など、他のドメインのリソースを共有しようとするリソースの生成元が含まれています。

  2. Cloud Storage は、リクエストの HTTP メソッドと Origin ヘッダーの値をターゲット バケットの CORS 構成内のメソッドおよび生成元情報と比較し、一致するものがあるかどうかを確認します。存在する場合、Cloud Storage はレスポンスに Access-Control-Allow-Origin ヘッダーを含めます。Access-Control-Allow-Origin ヘッダーには、初期リクエストの Origin ヘッダーの値が含まれます。

  3. ブラウザはレスポンスを受け取り、Access-Control-Allow-Origin 値が元のリクエストで指定されたドメインと一致しているかどうかを確認します。一致する場合、リクエストは成功します。一致しない場合、または Access-Control-Allow-Origin ヘッダーがレスポンスに存在しない場合には、リクエストが失敗します。

プリフライトされたリクエストは、まず次の手順に従います。成功した場合、シンプル リクエストと同じ処理を行います。

  1. ブラウザは、メイン リクエストの Requested MethodRequested Headers を含む OPTIONS リクエストを送信します。

  2. サーバーは、ターゲット リソースで許可されている HTTP メソッドとヘッダーの値で応答します。プリフライト リクエスト内のメソッドまたはヘッダーの値のいずれかが、ターゲット リソースによって許可されたメソッドとヘッダーのセットに存在しない場合、リクエストが失敗し、メイン リクエストは送信されません。

これは CORS の非常に簡単な説明です。詳細な説明については、クロスオリジン リソース シェアリングの仕様をご覧ください。

Cloud Storage CORS のサポート

Cloud Storage では、CORS 構成はバケットレベルでのみ設定できます。gsutil コマンドライン ツール、XML APIJSON API を使用してバケットの CORS 構成を設定できます。バケット上の CORS 構成の設定の詳細については、クロスオリジン リソース シェアリング(CORS)の構成をご覧ください。CORS 構成の要素の詳細については、バケットの CORS を設定するをご覧ください。

次のいずれかの XML API リクエスト URL を使用して、CORS ヘッダーを含む Cloud Storage からのレスポンスを取得できます。

storage.googleapis.com/[BUCKET_NAME]
[BUCKET_NAME].storage.googleapis.com

XML API リクエスト URL の詳細については、リクエスト エンドポイントをご覧ください。

クライアント側の CORS サポート

ほとんどのブラウザは XMLHttpRequest オブジェクトを使用してクロスドメイン リクエストを作成します。XMLHttpRequest が、適切なヘッダーの挿入やサーバーとの CORS のやり取りの処理の作業をすべて担当します。Cloud Storage バケットで CORS サポートを利用するために、新しいコードを追加する必要はありません。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Storage ドキュメント