CORSの設定
クロスオリジンリソースシェアリング (CORS) ↗ は、ドメインXがドメインYのリソースにアクセスするのを防ぐ標準化された方法です。これは、ドメインYからのHTTPレスポンスに特別なヘッダーを使用することで行われ、ブラウザがドメインYがドメインXにこれらのリソースへのアクセスを許可していることを確認できるようにします。
CORSは悪意のあるウェブサイトからデータを保護するのに役立ちますが、CORSはバケット内のオブジェクトと対話し、バケットのポリシーを設定するためにも使用されます。
CORSはウェブブラウザからバケットと対話する際に使用され、2つのオプションがあります。
バケットを公開に設定する: このオプションは、バケットをインターネット上で読み取り専用としてアクセス可能にします。つまり、誰でもブラウザや他の場所からバケット内のオブジェクトをリクエストして読み込むことができます。このオプションは、バケットに公開ブログで使用される画像が含まれている場合に理想的です。
プレサインドURL: ユニークなURLにアクセスできる誰でも、バケット内で特定のアクションを実行できるようにします。
CORSを設定する前に、次のものが必要です。
- 少なくとも1つのオブジェクトを持つR2バケット。バケットを作成する必要がある場合は、公開バケットの作成を参照してください。
- オブジェクトにアクセスするために使用できるドメイン。これも
localhostである可能性があります。 - (オプション)アクセスキー。プレサインドURLを作成する際にのみアクセスキーが必要です。
公開バケットでCORSを使用するには、バケットが公開アクセスを許可するように設定されていることを確認してください。
次に、CORSポリシーを追加して、ファイルを共有できるようにします。
プレサインドURLは、GetObjectやPutObjectなどのS3アクションの詳細をエンコードする特別な署名を含むS3の概念です。プレサインドURLは認証のためにのみ使用されるため、一般的に秘密を明らかにすることなく公開配布するのは安全です。
プレサインドURLを生成する際に使用するS3互換の資格情報のペアが必要です。
以下の例は、JavaScriptの@aws-sdk/client-s3 ↗パッケージを使用してプレサインドPutObjectURLを生成する方法を示しています。
import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3";import { getSignedUrl } from "@aws-sdk/s3-request-presigner";const S3 = new S3Client({ endpoint: "https://4893d737c0b9e484dfc37ec392b5fa8a.r2.cloudflarestorage.com", credentials: { accessKeyId: "7dc27c125a22ad808cd01df8ec309d41", secretAccessKey: "1aa5c5b0c43defdb88f567487c071d17e234126133444770a706ae09336c57a4", }, region: "auto",});const url = await getSignedUrl( S3, new PutObjectCommand({ Bucket: bucket, Key: object, }), { expiresIn: 60 * 60 * 24 * 7, // 7d },);console.log(url);cURLを使用してオブジェクトをアップロードすることで、プレサインドURLをテストします。以下の例では、123というテキストをContent-Typeがtext/plainのR2にアップロードします。
curl --request PUT <URL> --header "Content-Type: text/plain" --data "123"- CloudflareダッシュボードからR2を選択します。
- リストからバケットを見つけて選択します。
- バケットのページから設定を選択します。
- CORSポリシーの下で、CORSポリシーを追加を選択します。
- JSONタブから、ポリシーを手動で入力するか、コピー&ペーストしてテキストボックスに貼り付けます。
- 完了したら、保存を選択します。
ポリシーはバケットの設定ページに表示されます。
R2 CORSポリシーの以下のフィールドは、HTTPレスポンスヘッダーにマッピングされます。これらのレスポンスヘッダーは、受信したHTTPリクエストが有効なCORSリクエストである場合にのみ返されます。
| フィールド名 | 説明 | 例 |
|---|---|---|
AllowedOrigins | ブラウザからバケット内のオブジェクトをリクエストする際にR2が設定するAccess-Control-Allow-Originヘッダーの値を指定します。 | www.test.comのウェブサイトがstatic.example.comのカスタムドメイン上のリソース(例:フォント、スクリプト)にアクセスする必要がある場合、https://www.test.comをAllowedOriginとして設定します。 |
AllowedMethods | ブラウザからバケット内のオブジェクトをリクエストする際にR2が設定するAccess-Control-Allow-Methodsヘッダーの値を指定します。 | GET, POST, PUT |
AllowedHeaders | このバケットからブラウザにオブジェクトをリクエストする際にR2が設定するAccess-Control-Allow-Headersヘッダーの値を指定します。カスタムヘッダー(例:x-user-id)を含むクロスオリジンリクエストは、これらのヘッダーをAllowedHeadersとして指定する必要があります。 | x-requested-by, User-Agent |
ExposeHeaders | クロスオリジンリクエストを行うJavaScriptによってアクセスできるように、返されるヘッダーを指定します。Content-Encodingやcf-cache-statusなど、安全リストに載っているレスポンスヘッダー ↗を超えてヘッダーにアクセスする必要がある場合は、ここに指定する必要があります。 | Content-Encoding, cf-cache-status, Date |
MaxAgeSeconds | ブラウザがCORSプレフライトレスポンスをキャッシュできる時間(秒単位)を指定します。ブラウザは、最大値(86400)が指定されていても、これを2時間以下に制限する場合があります。 | 3600 |
この例は、フォントファイルであるRoboto-Light.ttfオブジェクトを含むバケットに追加されたCORSポリシーを示しています。
AllowedOriginsは使用されるウェブサーバーを指定し、localhost:3000はウェブサーバーが実行されているホスト名です。AllowedMethodsは、GETリクエストのみが許可され、バケット内のオブジェクトを読み取ることができることを指定します。
[ { "AllowedOrigins": ["http://localhost:3000"], "AllowedMethods": ["GET"] }]一般的に、正しいCORSルールが設定されていることを確認するための良い戦略は、ブラウザによってブロックされているネットワークリクエストを確認することです。
- ルールの
AllowedOriginsに、リクエストが行われているオリジンが含まれていることを確認します。(http://localhost:3000やhttps://yourdomain.comのように) - ルールの
AllowedMethodsに、ブロックされたリクエストのメソッドが含まれていることを確認します。 - ルールの
AllowedHeadersに、ブロックされたリクエストのヘッダーが含まれていることを確認します。
また、CORSルールの伝播には、まれに最大30秒かかることがあります。
- クロスオリジンリクエストのみがCORSレスポンスヘッダーを含みます。
- クロスオリジンリクエストは、
OriginHTTPリクエストヘッダーの存在によって識別され、Originの値はCORSポリシーのAllowedOriginsフィールドで定義された有効な許可されたオリジンを表します。 OriginHTTPリクエストヘッダーがないリクエストは、CORSレスポンスヘッダーを返しません。オリジンの値は正確に一致する必要があります。
- クロスオリジンリクエストは、
- CORSポリシーの
AllowedOriginsの値は、有効なHTTP Originヘッダー値 ↗でなければなりません。有効なOriginヘッダーは、パスコンポーネントを含まず、scheme://host[:port](ポートはオプション)で構成される必要があります。- 有効な
AllowedOriginsの値:https://static.example.com- スキームとホストを含みます。ポートはオプションで、スキームによって暗黙的に示されます。 - 無効な
AllowedOriginsの値:https://static.example.com/やhttps://static.example.com/fonts/Calibri.woff2- パスコンポーネントを不正に含んでいます。
- 有効な
- オリジンページのJavaScriptで特定のヘッダー値にアクセスする必要がある場合(例:ビデオプレーヤーを使用する場合)、
Access-Control-Expose-Headersを正しく設定し、JavaScriptがアクセスする必要のあるヘッダー(例:Content-Length)を含めるようにしてください。