ブラウザは、同一オリジンポリシーにより、 Object Storage Service (OSS) へクロスオリジンリクエストをブロックする場合があります。このポリシーは、アクセスを同じプロトコル、ドメイン、ポートに制限します。たとえば、 https://www.example.com のページは、 https://example-bucket.oss-cn-hangzhou.aliyuncs.com/test.jpg からリソースをロードできません。
特定のウェブサイトから OSS リソースに直接アクセスできるようにするには、バケットに CORS ルールを設定してください。
仕組み
CORS リクエストには 2 種類あります:単純リクエスト (直接送信される) と、プリフライトリクエスト (実際のリクエストの前に認可チェックが要求される) です。
次のいずれかの条件を満たす場合、プリフライトリクエストが必要です:
-
リクエストで
GET、HEAD、POST以外のメソッドを使用する場合。 -
リクエストで
POSTメソッドを使用し、Content-Typeがtext/plain、application/x-www-form-urlencoded、multipart/form-data以外である場合。 -
x-oss-*などのカスタムヘッダーを含む場合。
ブラウザが OSS に単純リクエストを送信すると、次のプロセスが実行されます:
-
ブラウザはリクエストに
Originヘッダーを追加します。Originヘッダーは呼び出し元ページのオリジンを指定します。例:Origin: https://www.example.com -
OSS は、リクエストの HTTP メソッドと
Originヘッダーをバケットの CORS ルールと照合し、一致するルールを検索します。一致するルールが見つかった場合、OSS はレスポンスにAccess-Control-Allow-Originヘッダーを含めます。このヘッダーの値は、最初のリクエストのOriginヘッダーの値です。 -
ブラウザはレスポンスを受信します。
Access-Control-Allow-Originヘッダーが存在し、その値がページのオリジンと一致する場合にのみ、リクエストの続行を許可します。それ以外の場合、リクエストは失敗します。
プリフライトリクエストでは、単純リクエストのフローの前に次の手順が追加されます。成功した場合、その後は単純リクエストと同じプロセスで処理されます:
-
ブラウザは
OPTIONSリクエストを送信します。このリクエストには、実際のリクエストのメソッド (Access-Control-Request-Method) とヘッダー (Access-Control-Request-Headers) が含まれます。 -
OSS は CORS ルールに基づき、リクエスト内のメソッドとヘッダーが許可されているかを確認します。プリフライトリクエストに、ルールで許可されていないメソッドまたはヘッダーが含まれている場合、リクエストは失敗し、実際のリクエストは送信されません。
静的 Web サイトリソースのロード
https://www.example.com にある Web サイトは、OSS バケットに格納されている画像、CSS、および JS ファイルをロードする必要があります。
ステップ 1:CORS ルールの設定
OSS コンソールにログインします。送信先バケットの [コンテンツセキュリティ] > [CORS] ページに移動し、次のようにルールを作成します。
|
パラメーター |
値 |
説明 |
|
オリジン |
|
アクセス元をこの Web サイトに限定します。 |
|
許可されたメソッド |
|
|
|
許可されたヘッダー |
空欄 |
不要です — 単純リクエストはプリフライトをトリガーしません。 |
|
公開されるヘッダー |
|
|
|
キャッシュのタイムアウト (秒) |
86400 |
プリフライトの結果を 24 時間キャッシュします。 |
|
Vary: Origin |
未チェック |
単一のオリジンを指定する場合は不要です。 |
ステップ 2:設定の確認
https://www.example.com にアクセスし、画像などの OSS リソースが正しくロードされ、ブラウザコンソールに CORS エラーが表示されないことを確認します。
フロントエンドからのファイル直接アップロード
https://app.example.com の Web ページのユーザーが、アバターやドキュメントなどのファイルを OSS に直接アップロードします。
ステップ 1:CORS ルールの設定
OSS コンソールにログインします。送信先バケットの [コンテンツセキュリティ] > [CORS] ページに移動し、次のようにルールを作成します。
|
パラメーター |
値 |
説明 |
|
オリジン |
|
この認可されたアプリケーションからのアップロードに制限します。 |
|
許可されたメソッド |
|
アップロードには |
|
許可されたヘッダー |
|
直接アップロードでは、セキュリティのため固定の |
|
公開するヘッダー |
|
|
|
キャッシュのタイムアウト (秒) |
600 |
10 分間のキャッシュは、プリフライトの削減と設定更新の即時反映のバランスを取ります。 |
|
Vary: Origin |
チェック済み |
マルチドメインでのデプロイが想定される場合に、CDN のキャッシュ汚染を防止します。 |
ステップ 2:設定の確認
https://app.example.com ページでアップロード操作を実行し、ファイルが OSS に正常にアップロードされること、およびブラウザコンソールに CORS エラーが表示されないことを確認します。
複数環境のサポート
開発、テスト、本番環境で使用する dev.example.com や app.example.com などの複数のサブドメインから、同じ OSS リソースにアクセスする必要があります。
ステップ 1:CORS ルールを設定する
OSS コンソールにログインします。 宛先バケットの [コンテンツセキュリティ] > [CORS] ページに移動し、次のようにルールを作成します。
|
パラメーター |
値 |
説明 |
|
オリジン |
|
|
|
許可されたメソッド |
|
すべての環境での読み取りとアップロードをサポートします。 |
|
許可されたヘッダー |
|
|
|
公開されるヘッダー |
|
ダウンロードの検証とアップロード結果のフィードバックの両方をサポートします。 |
|
キャッシュの有効期限 (秒) |
3600 |
1 時間のキャッシュは、パフォーマンスとデバッグの柔軟性のバランスを取ります。 |
|
Vary: Origin |
チェック済み |
必須です。CDN に |
ステップ 2:設定を確認する
https://dev.example.com と https://app.example.com の両方でアクセステストまたはアップロードテストを実行し、すべての操作が成功することを確認します。
認証を伴う API 形式の呼び出し
https://api.example.com のフロントエンドアプリケーションは、Authorization などのカスタムヘッダーを指定して、保護された OSS リソースにアクセスする必要があります。
ステップ 1:CORS ルールの設定
OSS コンソールにログインします。対象のバケットで [Content Security] > [クロスドメイン (CORS)] ページに移動し、次のようにルールを作成します。
|
パラメーター |
値 |
説明 |
|
オリジン |
|
認証情報を含むリクエストの場合、オリジンは正確で信頼できるドメインである必要があります。 |
|
許可されたメソッド |
|
非公開リソースの読み取り、更新、削除に対応します。 |
|
許可されたヘッダー |
|
|
|
公開ヘッダー |
|
成功した操作を検証するための識別子と、トラブルシューティング用の ID を提供します。 |
|
キャッシュタイムアウト (秒) |
600 |
短いキャッシュ (10分) により、セキュリティポリシーの変更を迅速に反映できます。 |
|
Vary: Origin |
選択 |
CDN がオリジンごとにレスポンスを個別にキャッシュするようにします。 |
ステップ 2:設定の確認
https://api.example.com ページから Authorization ヘッダーを含むリクエストを送信し、保護された OSS リソースにアクセスできることを確認します。
本番環境に適用
セキュリティのベストプラクティス
最小権限の原則に従ってください。
-
[オリジン (AllowedOrigin)]を正確に設定します。バケットが完全に公開されている場合を除き、オリジンに*を設定しないでください。https://www.example.comのように、正確なドメインを指定します。 -
[許可されたメソッド]を制限します。アプリケーションに必要な HTTP メソッドのみを公開します。読み取り専用サイトの場合は、GETとHEADのみを設定します。 -
[許可されたヘッダー]を明示的に指定します。認証を伴うリクエスト (Authorizationヘッダーを含む) の場合、*を使用しないでください。必要なすべてのリクエストヘッダーを明示的にリストします。
パフォーマンスのベストプラクティス
-
プリフライトキャッシュを最適化します。
86400秒 (24 時間) などの適切なMaxAgeSeconds値により、プリフライトリクエストが大幅に削減され、レイテンシーとコストが低減されます。 -
Vary: Originの影響を評価します。Vary: Originを有効にすると、キャッシュポイズニングの問題は解決されますが、CDN キャッシュの複雑さが増加します。これにより、キャッシュヒット率が低下し、オリジントラフィックが増加する可能性があります (追加のコストとレイテンシー)。トラフィックパターンを評価した後にのみ有効にしてください。
CDN アクセラレーション
バケットが Alibaba Cloud CDN によって高速化され、CDN ドメイン経由でアクセスされる場合、オリジン間リクエストは最初に CDN ポイントオブプレゼンス (PoP) に到達します。OSS コンソールではなく、CDN コンソールで CORS ルールを設定する必要があります。OSS の CORS 設定は、OSS オリジンドメインに直接行われるリクエストにのみ適用されます。詳細については、「オリジン間リソース共有の設定」をご参照ください。
CORS ルールのパラメーター
バケットごとに最大 20 個の CORS ルールを設定できます。OSS は上から順にルールを評価し、リクエストに一致した最初のルールを適用します。一致するルールが見つかった時点で、以降のルールは確認しません。
|
パラメーター |
必須 |
説明 |
|
オリジン (AllowedOrigin) |
はい |
OSS リソースに対してクロスオリジンリクエストを実行できる Web サイト (オリジンドメイン) を指定します。
|
|
許可されるメソッド (AllowedMethod) |
はい |
許可される HTTP メソッドを指定します。
|
|
許可されるヘッダー (AllowedHeader) |
いいえ |
プリフライトリクエストに適用され、実際のリクエストに含めることができる HTTP ヘッダーを決定します。
|
|
公開されるヘッダー (ExposeHeader) |
いいえ |
クライアント側の JavaScript からアクセスできる OSS のレスポンスヘッダーを指定します。
|
|
キャッシュのタイムアウト (MaxAgeSeconds) |
いいえ |
ブラウザがプリフライト
|
|
Vary: Origin |
いいえ |
重要
このオプションを有効にすると、CDN キャッシュヒット率が低下する可能性があります。 |
よくある質問
エラー: No 'Access-Control-Allow-Origin' header is present on the requested resource.
このエラーは通常、ブラウザーが CORS ヘッダーを含まない古いレスポンスをキャッシュしているか、受信リクエストに一致する CORS ルールが存在しないことを示します。
ブラウザーのキャッシュをクリアして再テストしてください。エラーが解決しない場合は、CORS ルールを確認してください。
-
左側メニューで、[コンテンツセキュリティ] > [CORS] を選択します。
-
CORS ページで、[ルールの作成] をクリックします。
-
[CORS ルールの作成] パネルで、[オリジン] を
*に設定し、すべての [許可されたメソッド] を選択し、[許可されたヘッダー] を*に設定し、[公開ヘッダー] をETagおよびx-oss-request-idに設定し、[キャッシュの有効期間 (秒)] を 0 に設定し、[Vary: Origin] を選択して、[OK] をクリックします。 -
問題が解決しない場合は、任意のサーバーにログインし、次のコマンドを実行してクロスオリジンリクエストヘッダーを表示します。
curl -v -o output_file.txt -H 'Origin:[$URL2]' '[$URL1]'説明-
[URL1] は、リクエスト対象の OSS リソースの URL です。
-
[URL2] は、CORS ルールで設定したオリジンアドレスです。
次のような出力が表示されます。

-
レスポンスに一致する CORS ヘッダーが含まれている場合、問題はブラウザーまたはネットワークのキャッシュが原因である可能性があります。以前の非 CORS リクエストがローカルにキャッシュされ、後続のクロスオリジンリクエストがサーバーから新しいレスポンスを取得する代わりに、このキャッシュされたレスポンスを取得した可能性があります。次の解決策を試してください。
-
ブラウザーで Ctrl+F5 キーを押してキャッシュをクリアし、問題が解決するかどうかをテストしてください。
-
CORS ルールで [キャッシュの有効期間 (秒)] を 0 に設定してください。これにより、すべてのリクエストでサーバーから CORS 認可を再取得するようになります。
説明オブジェクトのアップロード時に、オブジェクトの
cache-controlをno-cacheに設定できます。すでにアップロードされているオブジェクトの場合は、ossutil を使用してこの設定を変更できます。詳細については、「set-meta (オブジェクトメタデータの管理)」をご参照ください。 -
CDN を使用して OSS を高速化し、CDN 経由で配信されるすべてのリクエストに CORS ヘッダーが含まれるようにしてください。
-
-
レスポンスに 2 つの CORS ヘッダーが含まれているか、OSS 設定と一致しないヘッダーが含まれている場合、問題は CDN を使用した OSS の高速化が原因である可能性があります。
-
CDN コンソールにログインし、ドメイン名の CDN アクセラレーションを一時的に無効にして、クロスオリジンの問題が解決することを確認してください。
-
確認後、特定のドメイン名をクリックし、[キャッシュ設定] > [ノード HTTP レスポンスヘッダー] に移動します。
-
必要に応じてカスタム HTTP レスポンスヘッダーを設定してください。
-
-
-
CORS の問題がまだ解決しない場合は、「OSS CORS の一般的なエラーと解決策」を参照してください。
エラー: The 'Access-Control-Allow-Origin' header has a value '...' that is not equal to the supplied origin.
サーバーは Access-Control-Allow-Origin ヘッダーを返しましたが、その値がリクエストの Origin と一致しません。これは多くの場合、キャッシュの問題です。ブラウザーまたは CDN が 1 つのドメインのレスポンスをキャッシュし、それを別のドメインに提供しています。
CORS ルールで Vary: Origin オプションを有効にして異なる Web サイト間のキャッシュの競合を防ぐか、再試行する前にブラウザーのキャッシュをクリアしてください。
エラー: Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.
このエラーは、フロントエンドが認証情報を含むリクエストを送信した (Access-Control-Allow-Credentials が True) ものの、Access-Control-Allow-Origin が * に設定されているために発生します。ブラウザーは、Cookie や Authorization トークンなどの機密データに任意のサイトがアクセスするのを防ぐため、この組み合わせを禁止しています。
-
認証情報が必要な場合は、
オリジンを*から特定のドメイン (例:https://example.com) に変更してください。 -
認証情報が不要な場合は、フロントエンドコードで
xhr.withCredentialsをfalseに設定し、サーバー側でAccess-Control-Allow-Credentialsがfalseであることを確認してください。
OSS からのクロスオリジン読み込み速度の改善
クロスオリジンの読み込み速度は、クライアントと OSS バケット間のネットワーク遅延に依存します。クロスオリジンリクエストには Origin ヘッダーが含まれます。長距離アクセス (例: China (Hong Kong) から中国本土) の場合は、転送アクセラレーション エンドポイントを使用してネットワークパスを最適化してください。
転送アクセラレーションは、ネットワークパスを最適化してグローバルなデータ転送速度を向上させます。