CloudFront でのクッキーの扱いについて

  • 1
    いいね
  • 0
    コメント

ドキュメント

デフォルト

デフォルトでは、CloudFront はクッキーを考慮しない。

リクエストの Cookie: ヘッダは、オリジンに転送されない。
レスポンスの Set-Cookie: ヘッダはビューアに転送されない。

設定

ビヘイビアで、以下のいずれかを選べる。

  • None (デフォルト)
  • Whitelist
  • All

20170705161229.png

この設定は、以下の3つの挙動に影響する。

  • オリジンに Cookie: を転送するかどうか
  • キャッシュのキーに Cookie: を使うかどうか
  • オリジンが返した Set-Cookie: をビューアに転送するかどうか

ドキュメントを読んでもいまいち正確にわからなかったので、実際に設定して挙動を確認した。

Cookie: をオリジンに転送 キャッシュのキーに Cookie: Set-Cookie: をビューアーに
None しない 使わない 返さない
Whitelist 一部する 一部使う 全て返す
All 全てする 全て使う 全て返す

基本的に想像通りなのだが、Whitelist の Set-Cookie の扱いだけ例外的で、ホワイトリストに関わらず全てのクッキーをビューアに返す。

なので、Whitelist で制限しているつもりでも、例えばセッションIDがキャッシュで配信されてしまうことに注意が必要。場合によっては、とても危険な状態になり得る。

ドキュメントは以下のように書かれている。

ホワイトリストにない Cookie がオリジンからの応答に含まれている場合、CloudFront はその Cookie もビューアに返します。

一方で、以下の説明もあり、矛盾しているように思えるのだけれども、

オリジンがホワイトリストに登録された Cookie と登録されていない Cookie の両方を返した場合、CloudFront はホワイトリストに登録された Cookie のみをキャッシュします

これは、Cookie: をキャッシュのキーに使うかどうかの話が混ざっているのではないかと思う。

自分が試した限りでは、CloudFront は Set-Cookie: ヘッダをキャッシュする。X-Cache: Hit from cloudfront のレスポンスに、ホワイトリストに載っているかどうかに関わらず、Set-Cookie: ヘッダが設定される。

こちらのドキュメントにも、

Set-Cookie – Cookie を転送するように CloudFront を構成している場合、Set-Cookie ヘッダーフィールドがクライアントに転送されます。

とあり、ホワイトリストで制限されるとは書かれていない。

実験

以下 x_* をホワイトリストに設定したビヘイビアのレスポンス。

$ curl -b 'x_1=1; a=1' -vvv 'https://...'

< HTTP/1.1 200 OK
< Content-Type: text/html
< Content-Length: 52
< Connection: keep-alive
< Date: Wed, 05 Jul 2017 07:35:49 GMT
< Server: nginx
< Set-Cookie: a=5; path=/
< Set-Cookie: b=6; path=/
< Age: 30
< X-Cache: Hit from cloudfront
< Via: 1.1 xxxxxxxxxxxxxxxx.cloudfront.net (CloudFront)
< X-Amz-Cf-Id: xxxxxxxxxxxxxxxxx

1499240149 array(1) {
  ["x_1"]=>
  string(1) "1"
}

ビューアは x_1a の2つのクッキーを送信しており、オリジンには x_1 だけが届いている。

オリジンはホワイトリストに含まれない ab の2つのクッキーを返しており、X-Cache: Hit from cloudfront のレスポンスに Set-Cookie が含まれている。

オリジンに置いた PHP ソース。

<?php
setcookie('a', '5', 0, '/');
setcookie('b', '6', 0, '/');

echo time();
echo ' ';
var_dump($_COOKIE);