Cookie が上書きされる !?

こんにちは、中山です(写真は私ではありません)。
以下の記事で Parasite Cookie という造語を用いましたが

韻を踏んで Cuckoo Cookie なんてのも悪くないですね。
写真のようにカッコウが他の鳥の巣に托卵する様は、我ながら的を射た例えかと思います。

呼称はさておき Parasite Cookie の動作でふと気になったことがあります。
レアケースだとは思いますが、既に Cookie DB に保存されている [名前, 値] と同じ名前で Parasite Cookie が書き込まれた場合にはどうなるのでしょうか !?
値が上書きされてしまうとしたら本当に迷惑な Parasite Cookie ですよね。

そこで、今回は Cookie の上書きについて考察してみます。
なお調査に利用したブラウザは以下の通りです。
(iOS と Android の標準ブラウザについてはまたの機会に)

  • Firefox 55.0.3
  • Chrome 61.0.3163.79

RFC の確認

RFC 6265 の 5.3. Storage Model には以下の通り定義されています。

11. If the cookie store contains a cookie with the same name, domain, and path as the newly created cookie:

1. Let old-cookie be the existing cookie with the same name, domain, and path as the newly created cookie. (Notice that this algorithm maintains the invariant that there is at most one such cookie.)

2. If the newly created cookie was received from a "non-HTTP" API and the old-cookie's http-only-flag is set, abort these steps and ignore the newly created cookie entirely.

3. Update the creation-time of the newly created cookie to match the creation-time of the old-cookie.

4. Remove the old-cookie from the cookie store.

今回の調査での Parasite Cookie 書き込みは HTTP Set-Cookie で指定した domain, path 属性と同じ path, domain で実行します。
その際、ブラウザの実装が上記 2. の仕様通りなら httponly 指定の HTTP Set-Cookie の結果は Parasite Cookie で上書きされることはなさそうです。

Firefox の場合

行は Cookie の初期値の書き込み、列は Cookie の上書きの方法です。
後述する Chrome の場合と動作が同じ場合は青、異なる場合は赤でセルを着色しています。
Firefox のテスト結果を端的に述べると

  • 通常の HTTP Set-Cookie の結果は document.cookie で上書きされる
  • httponly 指定の HTTP Set-Cookie の結果は document.cookie で上書きされない(= RFC 通り)

つまり 1st-party Cookie を HTTP Set-Cookie で書き込んだ [名前, 値] に、トラッキング業者が Parasite Cookie で上書き可能です。
もし JavaScirpt 経由で読み書きする必要がなければ httponly を指定しましょう。

Chrome の場合

Chrome では同じ名前の Cookie が共存できるようです。
HTTP Set-Cookie の結果と document.cookie への書き込み結果は別々に管理されているようですね。
実際に 4 の(※)の HTTP Cookie Header は

また alert(document.cookie); の結果は

となりました。
アプリケーションが連想配列経由で Cookie を扱う場合、連想配列の作りかた次第で異なる結果となってしまいます。

まとめ

実験結果から Parasite Cookie による上書きはブラウザ依存の結果となることがわかりました。
実際には Parasite Cookie で名前が重複するケースは稀だと思いますが、同じ名前の Cookie を HTTP Header と JavaScript 双方で読み書きするようなアプリケーションは存在するかもしれません。
そのような場合、ブラウザの振る舞いの違いにご注意ください !!

Comments are closed, but you can leave a trackback: Trackback URL.