ブラウザは、同一オリジンポリシーにより、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ヘッダーが存在し、かつその値がページのオリジンと一致する場合にのみ、ブラウザはリクエストの続行を許可します。それ以外の場合、リクエストは失敗します。
プリフライトリクエストでは、単純リクエストのフローの前に次の手順が追加されます。成功した場合、単純リクエストと同じプロセスで処理が続行されます:
-
ブラウザは、想定しているメインリクエストのメソッド (
Access-Control-Request-Method) とヘッダー (Access-Control-Request-Headers) を含むOPTIONSリクエストを送信します。 -
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 エラーがないことを確認します。
フロントエンドからの直接ファイルアップロード
Web ページ https://app.example.com 上のユーザーが、アバターやドキュメントなどのファイルを 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 コンソールにログインします。宛先バケットで、[コンテンツセキュリティ] > [CORS] ページに移動し、次のようにルールを作成します。
|
パラメーター |
値 |
説明 |
|
オリジン |
|
認証情報を含むリクエストの場合、オリジンは信頼できる正確なドメインである必要があります。 |
|
許可されたメソッド |
|
非公開リソースの読み取り、更新、削除をサポートします。 |
|
許可されたヘッダー |
|
|
|
公開されるヘッダー |
|
操作の成功を示す検証識別子と、トラブルシューティング用の ID を提供します。 |
|
キャッシュのタイムアウト (秒) |
600 |
短いキャッシュ (10 分) により、セキュリティポリシーの変更を迅速に反映できます。 |
|
Vary: Origin |
選択 |
CDN がオリジンごとにレスポンスを個別にキャッシュするようにします。 |
ステップ 2:設定の確認
https://api.example.com ページから Authorization ヘッダーを含むリクエストを開始し、保護された OSS リソースにアクセスできることを確認します。
本番環境に適用
セキュリティのベストプラクティス
最小権限の原則に従います。
-
[オリジン (AllowedOrigin)]を正確に設定するため、バケットが完全に公開されている場合を除き、Sourcesに*を設定するのではなく、https://www.example.comなどの正確なドメインを指定してください。 -
[許可されたメソッド]の制限: アプリケーションで必要な HTTP メソッドのみを公開します。 読み取り専用サイトの場合は、GETとHEADのみを設定します。 -
[許可ヘッダー]を明示的に指定します。認証リクエスト (Authorizationヘッダーを含む) の場合、*は使用せず、必要なすべてのリクエストヘッダーを明示的に列挙してください。
パフォーマンスのベストプラクティス
-
プリフライトキャッシュの最適化:
86400秒 (24 時間) のような適切なMaxAgeSeconds値は、プリフライトリクエストを大幅に削減し、レイテンシーとコストを低減します。 -
Vary: Originの影響を評価してください。Vary: Originを有効にすると、キャッシュポイズニングの問題は解決されますが、CDN のキャッシュの複雑性が増大します。これにより、キャッシュヒット率が低下し、オリジンへのトラフィック (追加のコストとレイテンシー) が増加する可能性があります。お客様のトラフィックパターンを評価した後にのみ有効にしてください。
CDN による高速化
バケットが Alibaba Cloud CDN によって高速化され、CDN ドメイン経由でアクセスされる場合、クロスオリジンリクエストは最初に CDN の POP (Point of Presence) に到達します。この場合、CORS ルールは OSS コンソールではなく、CDN コンソールで設定する必要があります。OSS の CORS 設定は、OSS オリジンドメインに直接行われるリクエストにのみ適用されます。詳細については、「クロスオリジンリソース共有 (CORS) の設定」をご参照ください。
CORS ルールのパラメーター
各バケットには、最大 20 個の CORS ルールを設定できます。OSS はルールを上から下に順次評価し、リクエストに一致する最初のルールを適用します。一致が見つかると、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 ヘッダーが含まれます。長距離アクセス (例: 中国 (香港) から中国本土) の場合は、転送アクセラレーション エンドポイントを使用してネットワークパスを最適化してください。
転送アクセラレーションは、ネットワークパスを最適化し、グローバルなデータ転送速度を向上させます。