Cloud CDN では、次の 3 つの方法でキャッシュに保存されたコンテンツへのアクセスを制御できます。
- 署名付きリクエストを使用すると、リクエストの承認が必要な場合でも、Google Cloud のグローバル分散キャッシュからレスポンスを提供できます。署名付き URL を知っているユーザーは誰でも一定期間リソースにアクセスできます
- また、署名付き Cookie でも一定期間リソースにアクセスできます。これは、ユーザーごとに数十から数百の URL に署名する必要がある場合に役立ちます。
- 非公開送信元の認証を使用すると、Amazon Simple Storage Service(Amazon S3)バケットや他の互換性のあるオブジェクト ストアへの接続を制限し、ユーザーの直接アクセスを防ぐことができます。
署名付き URL
署名付き URL は、リクエスト時における制限付きの権限と有効期限が設定された URL です。
ユースケース
シナリオ: Google アカウントがなくてもユーザーに Cloud CDN コンテンツへのアクセスを許可すると同時に、アプリケーション固有のロジックを使ってアクセスを制御したい場合があります。
このような場合の標準的な対処法は、ユーザーに署名付き URL を提供することです。署名付き URL によって、該当するリソースに対する期間限定の読み取りアクセス権がユーザーに付与されます。署名付き URL を作成するときに、有効期限を指定します。URL が期限切れになるまで、または URL の署名に使われた鍵がローテーションされるまで、その URL を知っていれば誰でもそのリソースにアクセスできます。
署名付き URL は、次の場合に使用します。
インストール用ファイルのダウンロードなど、個々のファイルへのアクセスを制限する場合。
ユーザーが、Cookie をサポートしていないクライアント アプリケーションを使用している場合。
署名付き URL の仕組み
署名付き URL を使用すると、限定公開リソースへの一時的なアクセス権を、追加の承認なしでクライアントに付与できます。そのためには、強いランダム性を持つ鍵を生成し、その鍵でリクエストの特定の要素をハッシュして暗号署名を付加します。
提供した署名付き URL がリクエストで使用されると、そのリクエストは、要求対象のコンテンツを取得することが承認されていると見なされます。有効なサービス向けの不適切な署名を持つリクエストが Cloud CDN で受信されると、そのリクエストは拒否され、それがバックエンドに渡されて処理されることはありません。
一般的に、署名付き URL は入手した人が誰でも使用できます。ただし通常は、署名付き URL はそれを渡されたクライアントのみが使用するように意図されています。その URL が別のクライアントで使われるというリスクを軽減する目的で、署名付き URL は指定の時間が経過すると無効になります。署名付き URL が共有されるリスクを最小限に抑えるには、URL がすぐに無効になるように有効期限を設定します。
URL に署名を付加する方法
URL に署名を付加できるようにするには、暗号鍵をバックエンド サービスやバックエンド バケットに対して作成します。次に、Google Cloud CLI または独自のコードを使用して URL に署名を付加し、暗号的にハッシュします。
署名付き URL の処理
バックエンドで署名付き URL を処理できる場合、署名付き URL を含むリクエストに対し、Cloud CDN は特別な処理を行います。具体的には、Signature
クエリ パラメータを含むリクエストは署名付きと見なされます。このようなリクエストを受信すると、Cloud CDN は次のことを検証します。
- HTTP メソッドが
GET
、HEAD
、OPTIONS
、またはTRACE
であること。 Expires
パラメータが将来の時刻に設定されていること。- リクエストの署名が、指定された鍵を使って計算された署名と一致すること。
これらの検査のいずれかが失敗すると、403 Forbidden
レスポンスが返されます。それ以外の場合は、リクエストがバックエンドに転送されるか、キャッシュからコンテンツが返されます。OPTIONS
リクエストと TRACE
リクエストは常にバックエンドに直接プロキシされ、キャッシュからは配信されません。同じベース URL(Expires
パラメータの前の部分)に関するすべての有効な署名付きリクエストに、同じキャッシュ エントリが使用されます。署名付きリクエストと署名なしのリクエストの両方のレスポンスに同じキャッシュ エントリが使用されることはありません。キャッシュに保存されたレスポンスは、ユーザーが設定した有効期限を経過するまでキャッシュから提供されます。
署名付きリクエストを必要とするコンテンツが、Cache-Control
ヘッダーでキャッシュ不可と指定される場合がよくあります。このようなオブジェクトを、バックエンドを変更せずに Cloud CDN で処理できるようにする目的で、Cloud CDN は有効な署名付き URL を含むリクエストに対するレスポンスで、Cache-Control
ヘッダーを無視します。そのコンテンツはキャッシュ可能として扱われ、Cloud CDN の構成で指定された max-age
パラメータが使われます。返されるレスポンスでは、バックエンドで生成された Cache-Control
ヘッダーが維持されます。
必要に応じて、gcloud CLI から返された URL、またはカスタムコードによって生成された URL を配布できます。HTTPS URL だけに署名することをおすすめします。HTTPS は、セキュリティに優れたトランスポート手段であり、署名付き URL の署名部分が傍受されるのを防止できるからです。同様に、署名付き URL を配布するときは、TLS / HTTPS などのセキュアなトランスポート プロトコルを使用してください。
Cloud CDN で署名付き URL を使用する手順については、署名付き URL を使用するをご覧ください。
署名済み Cookie
署名付き Cookie とは、制限付きの権限と期間で一連のファイルをリクエストできるようにするための Cookie です。
ユースケース
署名付き Cookie は、次の場合に使用します。
複数の制限付きファイルへのアクセス権を付与する。
現在の URL が変更されないようにする。
コンテンツへのアクセス承認を更新するたびに URL を更新しなくても済むようにする。
HLS と DASH を使用したメディア ストリーミング
HTTP Live Streaming(HLS)プロトコルまたは Dynamic Adaptive Streaming over HTTP(DASH)プロトコルを使用して動画と音声のコンテンツを配信する場合、通常は、動画セグメントへの URL と音声セグメントへの URL が一覧表示されたマニフェストを生成します。クライアントに複数の異なるエンコード(コーデック、ビットレート、解像度)を提供する目的で、各セグメントの複数のインスタンスを用意することがあります。
Cloud CDN の署名付き URL を使用して、それぞれの URL に署名を付加し、アクセスを承認することもできますが、ユーザーごとに考えられるすべての組み合わせを動的に生成するのはかなりの負担です。また、送信元への負荷を増し、アプリケーションを複雑化させることにもなります。
署名付き Cookie は、この問題に対処するように意図されています。ポリシー(URL 接頭辞と有効期限日)に一致するあらゆるコンテンツへのアクセスを許可する署名付き Cookie をユーザーに提供すれば、メディア マニフェストを個別に生成または署名付けする必要がなくなります。また、組み込みのアプリケーションのページ ナビゲーションに対する JavaScript fetch()
API や他のバックグラウンド メカニズムによって、ユーザー アクセスを定期的に更新できます。ユーザー アクセスを更新できるので、有効期間を短くして、保護されたコンテンツを複数ユーザー間で共有しにくくすることもできます。
さまざまなブラウザ クライアントや他の HTTP 対応クライアント(Google の ExoPlayer や iOS の AVPlayer など)で、ユーザーにこれらの Cookie を発行できます。
バイナリ ダウンロード(ゲーム)
メディア ストリーミングと同じように、ゲーム クライアントにダウンロードを提供する場合は、ギガバイト規模のパッチやゲームデータを小さなチャンクに分割して、きめ細かいキャッシュ、無効化、同時実行をサポートできます。
これらのチャンクは通常、マニフェストに一覧表示されます。署名付き Cookie を使用すると、マニフェストに変更を加えることなく、こうしたダウンロードへのアクセスを認証済みユーザーに許可できます。さらに、(署名付き URL の場合と同じく)Cloud CDN のキャッシュの利点を活用できます。
署名付き Cookie の仕組み
署名付き Cookie を構成して発行するには、3 つの手順が必要です。
- 所定のバックエンド サービスの署名鍵を作成します。
- 許可対象の URL 接頭辞、有効期限、鍵名、暗号署名からなる Cookie 値を作成します。
- その Cookie をアプリケーション コード内で発行します。
リクエストに署名付き Cookie が含まれている場合、Cloud CDN はその Cookie を検証します。
Cloud Storage バケットを使用する場合、署名付き Cookie 制御をユーザーが回避することを防止できます。それには、allUsers
ロールを削除し、バケットに対する読み取りアクセス権を Cloud CDN サービス アカウントに付与して、基礎となるバケットへのアクセスを制約します。
同様に、仮想マシン(VM)インスタンスでも、処理する署名付きリクエストごとに署名を検証する必要があります。
Cloud CDN で署名付き Cookie を使用する手順については、署名付き Cookie を使用するをご覧ください。
非公開送信元の認証
非公開送信元の認証を使用すると、Cloud CDN は限定公開 Amazon S3 バケットまたは互換性のあるオブジェクト ストアに長期間アクセスできます。Cloud CDN は、公開読み取りアクセス権がなくても、これらの送信元からのコンテンツを提供できます。
非公開送信元の認証は送信元向けであり、署名付き URL と署名付き Cookie はクライアント向けです。同じコンテンツに対して両方を有効にできます。非公開送信元の認証では、送信元とコンテンツに対する CDN 以外のアクセスを制限します。署名付き URL と Cookie は、Cloud CDN にアクセスできるユーザーを制御します。
非公開送信元の認証は、グローバル外部アプリケーション ロードバランサまたは従来のアプリケーション ロードバランサを使用する Cloud CDN でサポートされています。
Cloud CDN で非公開送信元の認証を使用する手順については、非公開送信元の認証を構成するをご覧ください。
注意点と制限事項
署名付き Cookie に必要な同意とプライバシーのコンプライアンスについては、お客様が単独で責任を負うものとします。署名付き Cookie は、Google ではなくお客様が発行して管理します。
署名付き URL と署名付き Cookie の両方を使って同じ一連のファイルへのアクセスを制御する場合、閲覧者が署名付き URL を使用してファイルをリクエストすると、Cloud CDN は署名付き URL だけに基づいて、閲覧者にファイルを返すかどうかを判断します。URL に署名が付いてない場合にのみ、Cloud CDN は署名付き Cookie を考慮します。
署名付きリクエストに対応するようサービスを構成した場合、URL にクエリ パラメータとして
Signature
が含まれていると、Cloud CDN はその URL を署名付き URL として解釈しようとします。署名付き URL として意図されていない URL を Cloud CDN が署名付き URL として扱おうとすると、おそらくその URL は有効な署名付き URL ではなく、Cloud CDN に拒否されます。ブラウザやその他のクライアントは通常、RFC 6265 に従って、Cookie にサイズ(Cookie あたり 4 KB)と合計数(ドメインあたり 50)の上限を適用します。それぞれのドメインから送信される Cookie の合計ペイロードを考慮してください。
Cloud CDN の上限と制約事項(たとえばバックエンドごとに最大 3 つの署名付きリクエスト鍵の上限)が適用されます。
署名付きリクエストには、既存の Cloud CDN リクエストとは別途料金が発生することはありません。ただし、有効期限切れや無効な署名が原因で失敗した(拒否された)リクエストにも、キャッシュの検索料金が請求されます。
次のステップ
- その他のベスト プラクティスについては、ウェブ セキュリティのベスト プラクティスをご覧ください。