ある企業が、Amazon CloudFront を使って API レスポンスをキャッシュしている。ユーザーのログインセッションによってレスポンスが異なるため、Authorization ヘッダーを含むリクエストはキャッシュせず(または別々にキャッシュし)、Authorization ヘッダーがないリクエストのみをキャッシュしたい。最も適切な設定はどれか。
- A. CloudFront のキャッシュポリシーで Authorization ヘッダーをキャッシュキーに含める設定にする。Authorization ヘッダーの値が異なるリクエストは別々にキャッシュされ、ユーザーごとに適切なレスポンスが返される。
- B. CloudFront のオリジンリクエストポリシーで Authorization ヘッダーをオリジンに転送しないよう設定する。
- C. CloudFront ディストリビューションでキャッシュを完全に無効化する。
- D. Lambda@Edge でリクエストの Authorization ヘッダーを検証し、有効な場合はオリジンにリダイレクトする。
解答と解説を見る
正解: A
CloudFront のキャッシュポリシー(Cache Policy)でキャッシュキーとなるヘッダーを設定できる。Authorization ヘッダーをキャッシュキーに含めると、Authorization ヘッダーの値が異なるリクエストは別々のキャッシュエントリとして扱われる。Authorization のないリクエストは一つのキャッシュエントリ、各ユーザーのトークンが異なるリクエストはそれぞれ別キャッシュとなる。Authorization なし → キャッシュヒット(共有)、Authorization あり → ユーザー別に個別キャッシュ(実質的にオリジン転送)という動作になる。選択肢Cのキャッシュ完全無効化は、Authorization なしのリクエストのキャッシュの利点を失い、すべてのリクエストがオリジンに転送されてコストが増加する。選択肢Bのオリジンリクエストポリシーで Authorization ヘッダーを転送しないと、認証が必要なエンドポイントへのリクエストでユーザーの認証情報が伝わらず、正しいレスポンスが返らない。選択肢DのLambda@Edge での検証は可能だが、キャッシュポリシーの設定のみで実現できることに対して複雑な実装が必要になる。
📚 関連サービスの解説: Amazon CloudFront