ヒビノログ

個人的なメモを淡々と記録していくブログ。最近はLaravelやスマートフォンの話題など。

ブラウザに保存できるCookieサイズがSafariだけとても小さい件

とあるスマホサイト開発のプロジェクトで嵌った問題。

要求としては、そのサイト内でユーザーが閲覧したページの履歴や、検索の履歴、サイトが提供する「チェック」機能を使ってユーザーがチェックしたページの情報、そのチェックに対して訪問者が入れたコメント、といった内容を、すべてブラウザのCookieに保存させたい、というものでした(そこまで使うならローカルストレージとか、会員登録制にして会員情報としてDBに突っ込めばいいのに、という議論はあるんですが)。

で、この要求についてAndroidの標準ブラウザでは特に問題なくクリアできたんですが、iPhoneSafariだと、あるCookieサイズを超えると保存ができなかったり、そのサイズまでCookieが保存されてる状態で、あるCookieを削除しようとしてもできなかったり、指定したCookieとは別のものが削除されたり、という現象が起きました。

RFC 2965で定義されているCookieのサイズや数に関する制限内容として、

(前略)一般使用のユーザエージェントは個別に以下の最小限の容量を提供すべきであるが、同時にすべてが必要と言うわけではない。 * 最低 300 のクッキー * 一つのクッキー毎に最低 4096 バイト * ユニークなホストあるいはドメイン名毎に最低 20 のクッキー 特定の目的あるいは容量が制限されたデバイスのために作られたユーザエージェントは、ユーザがセッションに基づいたオリジンサーバと相互作用する事を保証するために、最低 4096 バイトの 20 のクッキーを提供すべきである。(後略)

とあり、今回の要件は上記の範囲内なんですが、Safariに関してはクッキーの数こそ20以上登録できるものの1つのドメインのクッキー容量の合計が4096バイトを超えて登録できない! つまり上記のRFCの2つめと3つめを同時に満たしてないんです。

で、Appleの開発者フォーラムで調べたところ同じ問題を指摘してる人が。 https://discussions.apple.com/message/18820657#18820657

PC版のSafariも同じらしい。。。

開発の方はCookieに保存する内容を見直して、さらに要件を変更してもらって切り抜けましたが、iPhoneiPadはPCサイトも普通に見られるので、いろいろCookieに突っ込んで保存しておく系のサイトを作ってる場合はこのあたりも確認しておく必要がありそう。