iOS/iPadOSやSafariでは、クライアントサイドで書かれるデータの有効期限は7日間に制限されているらしい。
大槻さんはiPhoneユーザーなのだが、一部のサイトでCookie同意のダイアログがやたらと出てくることがある。なんでだ、と思っていたのだが、どうやらクライアントサイドで書いたCookie(や、場合によってやLocal Storageのデータも)には、Intelligent Tracking Preventionによって有効期限に7日間というキャップがかけられるらしい。
まだちゃんと読んでいないので詳細は分かっていないし、そのCookie同意が何度も出るサイトを作っているのは僕じゃないし、僕が作るサイトはCookie使わないし、なのでそもそもちゃんと調べる気もないのだが、とりあえずWebKit Blogから該当箇所だけメモしておく。
まずはITP 2.1導入時の紹介記事から。
Client-Side Cookies Capped to 7 Days of Storage
Cookies can either be set in HTTP responses or through the document.cookie API, the latter sometimes referred to as client-side cookies. With ITP 2.1, all persistent client-side cookies, i.e. persistent cookies created through document.cookie, are capped to a seven day expiry.
とのこと。
英語が読めない?AIでもなんでも使ってくれ。今どきどのブラウザでも右クリック一発で出せるだろ。プライバシー?Firefoxならローカル完結の翻訳機能付いてるぞ。
んで、ITP 2.3の記事
website.example will be marked for non-cookie website data deletion if the user is navigated from a domain classified with cross-site tracking capabilities to a final URL with a query string and/or a fragment identifier, such as website.example?clickID=0123456789. After seven days of Safari use without the user interacting with a webpage on website.example, all of website.example’s non-cookie website data is deleted.
僕がCookie同意の画面を作る機会はたぶん永遠にないけど、そん時は普通にたぶんサーバサイド通してhttponly付けて焼くようにすりゃいいんだな。同意ダイアログの出し分けもサーバサイドでやるか、どうしてもクライアントサイドでやりたきゃ、サーバから<script nonce="some-scprn">const cookieConcent = 1;</script>みたいなの動的に埋め込んでクライアントサイドに伝えるか、Cookieに保存された同意状況を照会して返答するだけのAPIを立てる感じかな。だったらサーバサイドで出し分けやった方が手っ取り早いが、複数タブとかにも対応して、どっかのタブで同意操作したら開いてる全タブでダイアログ閉じて設定反映するならAPIでポーリングかねぇ……?メッセージ投げて処理するよりはそっちのが素直な気がするけど。でもタブ数多いと無駄なコネクションが多いか。Session Storageをメッセージバス代わりに使って同期を取る方がマシか……?まぁ作らないからどうでもいいんだけど。
うん、とりあえず頭回らんしもう寝る。おやすみ。校正する元気ないので変なところは許せ。