09 December 2013

ドメインあたりのクッキー数上限と上限に達した場合の挙動

BrowserStack にてそれぞれデフォルト設定のブラウザで調査。IE 中心に調べたので他のブラウザは網羅的ではない。あとから補完して別途公開したい。

サマリー

最も一般的な挙動は、追加日時 (おそらく最終更新日時) が古いものを一件削除し、新しいクッキーを受け入れるという、LRU 的なアルゴリズム。ここからブラウザやバージョンによってバリエーションがある。

  • Chrome は一件ではなく一度に三十件削除する
    • その代わり受け入れるクッキー数は多め
    • バックエンドを Chromium (Blink) に切り替えてからの Opera も同様
  • 古い Opera は、追加しようとしたクッキーを受け入れ、その次に新しいもの一件を削除する。
  • Safari は単に追加順ではなく独自のソート順でクッキーを管理。その降順または昇順で一件を削除する。
    • バージョンによって動きがばらばらなので、詳しく調査したい。

IE

OSBrowserMax cookie per domainBehavior
WinXPIE620追加されたのが最も古いクッキー一件を削除
WinXPIE750追加されたのが最も古いクッキー一件を削除
WinXPIE850追加されたのが最も古いクッキー一件を削除
Win7IE850追加されたのが最も古いクッキー一件を削除
Win7IE950追加されたのが最も古いクッキー一件を削除
Win7IE1050追加されたのが最も古いクッキー一件を削除
Win7IE1150追加されたのが最も古いクッキー一件を削除
Win8IE10.050追加されたのが最も古いクッキー一件を削除
Win8IE10.0 Desktop50追加されたのが最も古いクッキー一件を削除
Win8.1IE11.050追加されたのが最も古いクッキー一件を削除
Win8.1IE11.0 Desktop50追加されたのが最も古いクッキー一件を削除

Firefox

OSBrowserMax cookie per domainBehavior
Win8Firefox 16.0150追加されたのが最も古いクッキー一件を削除
WinXPFirefox 25.0150追加されたのが最も古いクッキー一件を削除
Mac OSX MavericksFirefox 27.0150追加されたのが最も古いクッキー一件を削除

Chrome

OSBrowserMax cookie per domainBehavior
Win8Chrome 22.0180古いものから30件を削除
WinXPChrome 31.0180古いものから30件を削除
Mac OSX MavericksChrome 33.0180古いものから30件を削除

Opera

OSBrowserMax cookie per domainBehavior
Mac OSX MavericksOpera 11.060追加されたのが新しいクッキー一件を削除 (set しようとしたクッキーは受け入れ、その次に新しいものを削除する)
Win8Opera 12.060追加されたのが新しいクッキー一件を削除 (set しようとしたクッキーは受け入れ、その次に新しいものを削除する)
WinXPOpera 17.0180古いものから30件を削除
Mac OSX MavericksOpera 19.0180古いものから30件を削除
  • opera は Version 12 を最後にレンダリングエンジンを Presto から Blink に切り替えている。

Safari

OSBrowserMax cookie per domainBehavior
Mac OSX Snow LeopardSafari 4.0なし (容量制限のみ)追加されたのが最も古いクッキー一件を削除
Mac OSX Snow LeopardSafari 5.0なし (容量制限のみ)追加されたのが最も古いクッキー一件を削除
Mac OSX LionSafari 5.1なし (容量制限のみ)保持しているクッキーの並び順で若い方から一件を削除
Mac OSX LionSafari 6.0なし (容量制限のみ)保持しているクッキーの並び順で若い方から一件を削除
Mac OSX MavericksSafari 7.0なし (容量制限のみ)保持しているクッキーの並び順で遅い方から一件を削除
  • Safari 4.0 のクッキーは追加日時の降順 (新しいものが先頭、古いものが後方) にならぶ。他のブラウザは昇順だった。
  • Safari 5.1〜6.0 のクッキーは単に追加順ではなく、一定の法則でソートし保存されている。削除はこのソート順に行われるようだ。ソートの方法は短時間に cookie が set された場合、そのうちいくつかをまとめて辞書順に登録しているように見える。サーバサイドからの Set-Cookie ヘッダをどう処理しているかはこの調査からはわからないので、別途。
  • Safari 7.0 は逆にソートの降順に一件削除している。

Safari の動きは不可解なので、より詳細に調査したい。

スクリプト

検証に使ったスクリプトはこちら

おおまかな動きは次のようなシンプルなもの

  • js で document.cookie に一件ずつクッキーを書き込み
    • 容量制限に引っかからないよう、キーは二文字、値は "1" という一文字にする
    • expire はランダムな未来の日付
  • "書き込み試行回数 != document.cookie に入っているクッキー数" になった時点で、処理を終了
    • 書き込み試行回数、現在のクッキー数、document.cookie の中身を表示