署名付き URLってなんだろ?

6 min read読了の目安(約5600字

CloudFrontの署名付きURLについて調べてみました。

署名付き URL と署名付き Cookie を使用したプライベートコンテンツの提供 - Amazon CloudFront

概要

  • 署名付き URL と署名付き Cookie は基本的には同じ機能で、- コンテンツにアクセスできるユーザーを制御する
  • 署名付き URL
    • 個別のファイル (アプリケーションのインストールダウンロード) へのアクセスを制限
    • ユーザーが Cookie をサポートしていないクライアント (カスタム HTTP クライアントなど) を使用している
  • 署名付き Cookie
    • 複数の制限されたファイル (HLS 形式の動画のすべてのファイルやウェブサイトの購読者の領域にあるすべてのファイルなど) へのアクセスを提供する
    • 現在の URL を変更したくない
  • 使用できないパターン
    • 署名付き URL を使用していない場合で、署名なし URL に次のクエリ文字列パラメータ含まれる場合
      • Expires
      • Policy
      • Signature
      • Key-Pair-Id
    • これらのクエリ文字列パラメータを含む URL が署名付き URL であると見なされ、署名付き Cookie の確認は行われない
  • 署名付き URL と署名付き Cookie の両方の使用
    • 署名付き URL は署名付き Cookie よりも優先される
    • 署名付き URL のみに基づいてビューワーにファイルを返すかどうかを決定する

ポイント

・基本的には同じ機能
・個別のファイル制限には署名付きURL、複数ファイルの制限には署名付きCookie
・カスタムHTTPクライアントでは署名付きURL
・URLを変更したくない場合は署名付きCookie
・両方使用した場合は署名付きURLが優先される

署名付き URL

概要

  • 有効期限切れ日時など、追加の情報も含まれており、コンテンツへのアクセスをより詳細に制御
  • 追加情報は、既定ポリシーまたはカスタムポリシーで決定
    • 既定ポリシー
      • ユーザーがコンテンツにアクセスできなくなる日時を指定できる
    • カスタムポリシー
      • Resource オブジェクトでワイルドカード文字を使用
      • ユーザーがコンテンツへのアクセスを開始できる日時を指定できる
      • ユーザーがコンテンツにアクセスできなくなる日時を指定できる
      • コンテンツにアクセスできるユーザーの IP アドレスまたは IP アドレス範囲を指定できる
      • 署名付き URL にポリシーの base64 エンコードされたバージョンが含まれているため、URL が長くなる

仕組み

  • CloudFront ディストリビューションで、1 つ以上の信頼されたキーグループを指定
  • アプリを開発して、ユーザーがコンテンツへのアクセス許可を持つかどうかを決定
  • アプリでアクセスを制限するファイルまたは部分用に署名付き URL を作成するかを決定
  • 署名付き URL を必要とするファイルをユーザーが要求
  • アプリは、ファイルにアクセスするための資格がユーザーにあることを検証
    • ログインしている
    • 有料会員であるなど
  • アプリは署名付き URL を作成してエンドユーザーに返す
  • 名付き URL を使用して、ユーザーはコンテンツのダウンロードやストリーミングを実行
  • CloudFront はパブリックキーを使用して署名を検証

有効期間の選択

  • 短期間(数分)
    • 映画レンタルや音楽ダウンロードをカスタマーにオンデマンドで配信する場合
  • 長期間(数年)
    • 事業計画を投資家に配信したり、教育資料を従業員に配信したりする場合

有効期限切れ日時を確認するタイミング

  • HTTP リクエスト時に署名付き URL の有効期限切れ日時を確認
  • 期限切れ前にダウンロードを開始して期限を過ぎた場合はダウンロード継続

既定ポリシー例

UTC の 2013 年 1 月 1 日午前 10 時 00 分までファイル http://d111111abcdef8.cloudfront.net/horizon.jpg にアクセス可能

    "Statement": [
        {
            "Resource": "http://d111111abcdef8.cloudfront.net/horizon.jpg?size=large&license=yes",
            "Condition": {
                "DateLessThan": {
                    "AWS:EpochTime": 1357034400
                }
            }
        }
    ]
}

カスタムポリシー例

UTC の 2013 年 1 月 1 日午前 10 時 00 分まで、範囲 192.0.2.0/24 の IP アドレスから、ユーザーがファイル http://d111111abcdef8.cloudfront.net/game_download.zip にアクセス可能

{
    "Statement": [
        {
            "Resource": "http://d111111abcdef8.cloudfront.net/game_download.zip",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1357034400
                }
            }
        }
    ]
}

ポイント

  • アクセス制御には追加情報を使用する
  • 追加情報には既定ポリシーとカスタムポリシーがある
  • 既定ポリシーでは期限切れ日時を指定できる
  • カスタムポリシーでは期限開始~期限切れまでの指定やIP制限が可能
  • アプリで署名付きURLを発行し、CloudFrontのキーで検証
  • HTTPリクエスト時有効期限切れ日時を確認

概要

  • 現在の URL を変更したくない場合に使用
  • 複数の制限付きファイル へのアクセスを提供する場合に、誰がコンテンツにアクセスできるかを制御
  • 署名付きURLと同内容の既定ポリシーとカスタムポリシーがある

仕組み

  • CloudFront ディストリビューションで、1 つ以上の信頼されたキーグループを指定
  • ユーザーがコンテンツにアクセスできるかどうかを判断し、アクセスできる場合は、3 つの Set-Cookie ヘッダーをビューワーに送信するアプリケーションを開発
  • ユーザーがウェブサイトにサインインし、コンテンツに対して支払いをするか、またはその他のアクセスの要件を満たす
  • アプリは、レスポンスで Set-Cookie ヘッダーを返し、ビューワーは名前と値のペアを格納
  • ユーザーがファイルをリクエスト
    • ユーザーのブラウザまたはその他のビューワーは名前と値のペアを取得し、リクエストの Cookie ヘッダーに追加します。これが署名付き Cookie
  • CloudFront はパブリックキーを使用して、署名付き Cookie の署名を検証

悪用の防止

  • Expires ヘッダーでセッション Cookie が作成されるように、Max-Age および Set-Cookie Cookie 属性を除外
    • セッション Cookie は、ユーザーがブラウザを閉じたときに自動的に削除されるため、ユーザーがコンテンツに不正アクセスする可能性が低くなる
  • ビューワーがリクエストに Cookie を含める場合に Cookie が暗号化されるように、Secure 属性を含める
  • 可能な場合、カスタムポリシーを使用してビューワーの IP アドレスを含める
  • CloudFront-Expires 属性では、ユーザーがコンテンツにアクセスできるようにする期間に基づいて、最短で適切な有効期限の時刻を指定

有効期限切れ日時を確認するタイミング

署名付きURLと同様

既定ポリシー例

UTC の 2015 年 3 月 16 日午前 10 時 00 分までファイル http://d111111abcdef8.cloudfront.net/horizon.jpg にアクセスできる

{
    "Statement": [
        {
            "Resource": "http://d111111abcdef8.cloudfront.net/horizon.jpg?size=large&license=yes",
            "Condition": {
                "DateLessThan": {
                    "AWS:EpochTime": 1426500000
                }
            }
        }
    ]
}

カスタムポリシー例

UTC の 2013 年 1 月 1 日午前 10 時 00 分まで、範囲 192.0.2.0/24 の IP アドレスから、ユーザーがファイル http://d111111abcdef8.cloudfront.net/game_download.zip にアクセスできることを指定

{
    "Statement": [
        {
            "Resource": "http://d111111abcdef8.cloudfront.net/game_download.zip",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1357034400
                }
            }
        }
    ]
}

ポイント

・現在のURLを変更したくない場合に使用
・複数の制限付きファイルへのアクセス制御
・アプリが特定ユーザーにSet-Cookieヘッダーを返す
・ビューワー(ブラウザ)は名前と値のペアを格納し、ファイルリクエスト時にブラウザがペアをリクエストのCookieヘッダーに追加
・CloudFrontがキーで検証

実際の設定方法の参考

【初心者向け】CloudFrontで署名付きURLを発行する【やってみた】 | DevelopersIO
【AWSリバイバル】CloudFrontの署名付きURLで「3分で見れなくなってしまう秘密のページ」をつくってみよう! - サーバーワークスエンジニアブログ

コンソール

この部分で設定するようです。

まとめ

今回はCloudFrontの署名付きURLについて調べてみました。
以下がポイントでした。

  • 基本的には同じ機能
  • 個別のファイル制限には署名付きURL、複数ファイルの制限には署名付きCookie
  • URLを変更したくない場合は署名付きCookie
  • 両方使用した場合は署名付きURLが優先される
  • 既定ポリシーとカスタムポリシーで期限やIP制限を決める
  • アプリで署名付きURLを発行し、CloudFrontのキーで検証
  • アプリがSet-Cookieヘッダーを返し、リクエスト時にブラウザがペアをリクエストのCookieヘッダーに追加
  • CloudFrontがキーで検証

参考になれば幸いです。