localhostのcookieをブラウザの機能を使わずにクリアしたくてRFC 6265を勉強したけど無理だった
課題
localhost で開発するので localhost の cookie が(少なくとも開発者ツール上では)たくさんあって邪魔くさい。なんかサクッと削除する方法はないか? できれば手作業でなく自動でなんとかしたい。
結論
ダメでした。
- サーバサイドのコードではブラウザから送信されてこない cookie については感知する方法がない
- expired な cookie はサーバには送られてこない(少なくとも最近のブラウザでは)
- ブラウザ上の JavaScript でも expired な cookie にはタッチできなかった(とりあえず Firefox 48 では)
ついでにRFC 6265をちょっと勉強した
RFC 6265 は今回まったく主目的ではないんだけど。
- document.cookie - Web API インターフェイス | MDN
- RFC 6265 — HTTP State Management Mechanism (日本語訳)
- RFC 6265 - HTTP State Management Mechanism
Cookie には伝統的な問題がいくつもあり、RFC 6265 により互換性とこれらの問題の解決を図る。以下、雑なメモ。
- Cookie は request ヘッダに1つだけ。複数送信してはならない。
- expired cookie はいつでも削除しなければならない(タイミングは決まっていない。容量や数の制限を超える場合は優先的に削除される)
- Cookie は cookie-string で定義される文字列 key=value; key=value の並び(デリミタは"; ")
- 妥当な UTF-8 であるとは限らない。
expire については日本語では読みにくく、英語の方が分かりやすい。
A cookie is "expired" if the cookie has an expiry date in the past.
The user agent MUST evict all expired cookies from the cookie store if, at any time, an expired cookie exists in the cookie store.
At any time, the user agent MAY "remove excess cookies" from the cookie store if the number of cookies sharing a domain field exceeds some implementation-defined upper bound (such as 50 cookies).
この MUST evict と MAY remove の違い。
感想
RFC 6265 互換でオブジェクト指向で書けるライブラリを利用すると捗りそう。
js-cookie/js-cookie: A simple, lightweight JavaScript API for handling browser cookies
とか。
expire 周りは実際にはどうも expired cookie はただちに削除はされないが Cookie ヘッダには乗らない、という動作になるようだ。サーバ的には送られてこない Cookie は存在しないも同じなのでそれでよいのか。JavaScript 的にも expired な cookie は取得できないようだ。(Firefox 48で確認)
ただし、人間が目視で開発者ツールで確認を行う際には実際には削除はされていないので、目視的にはノイズになる。これがやっかい。結局は Cookie の確認方法をマスターするのと同時に削除の方法もちゃんと身につけましょう、ということらしい。
ちょっとつらい結論になってしまったが仕方ないかー。