[AWS]CloudFront 署名付きCookie 概要


## 1. 概要
- CloudFront 経由で配信されるプライベートコンテンツへのアクセスを制限するための機能。
- リクエストに対して暗号的に署名されたポリシー情報を利用して、特定のユーザーや条件に基づいてコンテンツ配信を制御する。
- 署名付き Cookie は、複数のオブジェクト（例：会員専用ページ全体、動画の各セグメントなど）に対して一括してアクセス制御を行いたい場合に有用で、URL を変更せずに認証情報を保持できるのが特徴。

## 2. 用途
- **複数オブジェクトの一括制御**  
    ・会員専用コンテンツやストリーミング動画など、個別に URL を発行するのではなく、まとめて制限したい場合に利用
- **URL の変更を避けたい場合**  
    ・ユーザーに発行する URL を固定のままで、内部的に Cookie でアクセス制御を実現するため
- **ブラウザなど、Cookie が利用可能なクライアント向け**  
    ・署名付き Cookie はクライアント側で自動的に送信されるため、Web ブラウザ向けに適している
    
## 3. 署名付きURLと署名付きCookieの比較

| 項目             | 署名付き URL                                           | 署名付き Cookie                                            | 補足・選択のポイント                                       |
| -------------- | -------------------------------------------------- | ------------------------------------------------------ | ------------------------------------------------ |
| **対象コンテンツ数**   | ・1つのオブジェクト（個別のファイル）に対して発行                          | ・複数のオブジェクト（ディレクトリ全体や複数ファイル）に対して有効                      | 多数のファイルをまとめて制御する場合は署名付き Cookie が有効               |
| **URL の変化**    | ・URL に署名パラメータ（Expires、Signature、Key-Pair-Id）が付与される | ・Cookie に署名情報がセットされ、URL はそのまま（変更されない）                  | URL を固定したい場合は署名付き Cookie を選択                     |
| **実装の簡易さ**     | ・シンプルにURLに署名パラメータを付加するだけで生成可能                      | ・3種類の Cookie（Policy、Signature、Key-Pair-Id）を生成・管理する必要あり | 個別ファイルなら署名付き URL、複数コンテンツなら署名付き Cookie            |
| **クライアント要件**   | ・Cookie をサポートしていないクライアントでも利用可能                     | ・ブラウザなどCookieを保持できるクライアント向け                            | クライアントの仕様に合わせた選択が必要                              |
| **セキュリティ・柔軟性** | ・既定またはカスタムポリシーにより、アクセス有効期限などを指定可能                  | ・同様のポリシーに加え、複数オブジェクトに対して一括して適用可能                       | 複雑なアクセス制御やIP制限などを行いたい場合、カスタムポリシーで署名付き Cookie が有効 |

## 4. 仕組み

署名付き Cookie を利用する流れは以下のとおり。
1. **キーペアの作成**  
    ・秘密鍵と公開鍵のペアを作成し、公開鍵をCloudFront にアップロードする
2. **Cookie の生成**  
    ・アプリケーション側で、アクセス制限条件（有効期限、対象リソース、場合により IP 制限など）を含むポリシーを作成  
    ・秘密鍵を使い、このポリシーに対して署名を行い、3 つの Cookie（CloudFront-Policy、CloudFront-Signature、CloudFront-Key-Pair-Id）を生成し、ユーザーのブラウザへ送信
3. **リクエスト時の検証**  
    ・ユーザーのブラウザは、Cookie をリクエストヘッダーに含めて CloudFront へアクセスする  
    ・CloudFront は、設定されたキーグループのパブリックキーを用いて署名を検証し、ポリシーが有効かどうかを確認する  
    ・有効な場合、リクエストされたコンテンツを返す

```mermaid
sequenceDiagram
    participant U as ユーザーブラウザ
    participant A as アプリケーションサーバー
    participant CF as CloudFront
    participant O as オリジン（例：S3）

    U->>A: ログイン / 認証リクエスト
    A->>U: 署名付き Cookie（CloudFront-Policy, Signature, Key-Pair-Id）をセット
    U->>CF: 署名付き Cookie を含むコンテンツリクエスト
    CF->>CF: Cookie の署名・ポリシーを検証
    alt 検証成功
        CF->>O: オリジンからコンテンツを取得（キャッシュがない場合）
        O-->>CF: コンテンツを返す
        CF-->>U: コンテンツを配信
    else 検証失敗
        CF-->>U: アクセス拒否エラー（例：403 Forbidden）
    end
```

(署名付きURLの場合)

```mermaid
sequenceDiagram
    participant U as ユーザーブラウザ
    participant A as アプリケーションサーバー
    participant CF as CloudFront
    participant O as オリジン（S3など）

    U->>A: ログインしてリクエスト
    A->>U: 署名付き URL を返す
    U->>CF: 署名付き URL でオブジェクト要求
    CF->>CF: URL の署名を検証
    alt 署名が有効
        CF->>O: オリジンからコンテンツ取得
        O-->>CF: コンテンツを返す
        CF-->>U: コンテンツ配信
    else
        CF-->>U: エラー応答
    end
```


## 4. 参考文献
* [署名付き Cookie を使用する - Amazon CloudFront](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-cookies.html) 
* [カスタムポリシーを使用して署名付き Cookie を設定する - Amazon CloudFront](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html)