概要
半永久的に保持してくれるCookieを作成しようとした時に、困ったことが起きた。
普通にCookieをセットしても、Safariだと1秒も保持せずにexpireされるという悲しき事態になっている。
原因は、Appleが発表したITP(Intelligent Tracking Prevention)というトラッキング防止機能のアップデートによるものだ。
現在、制限は厳しいのはSafariだけだが、他のブラウザでも近い将来同じ状況になる可能性が高いため、今のうちに対策をうっておく必要がある。
以下は、その対策である。
対策
① ❌3rd Party Cookie ◎1st Party Cookie
3rd Party Cookie の場合、即expireされる。
これに関しては、SafariだけでなくChrome(条件あり)とFirefoxでも即時消される。
したがって、1st Party Cookieで発行させる必要がある。
1st Party Cookieとは、cookieを発行するサーバーとcookieを埋め込まれるサーバーが同じである状態のcookieのことを指す。つまり、同じドメインである状態であるということだ。
逆にドメインが別の場合に発行されるcookieは、3rd Party Cookie と定義される。
② ❌jsからの発行 ◎サーバーサイドからの発行
①の対策を行うために、javascriptでcookieを発行する方法がある。
GTM(Google Tag Manager)や GA(Google Analytics)などはこの手法が使われる。
しかし、Safariだと1日もしくは7日間でexpireされる。
今回は半永久的に保持したいので、要件を満たすことができない。
そこで使用される方法は、サーバーサイドからCookieを発行する方法だ。
HTTPヘッダーには、Set-Cookieというサーバーサイド側からcookieを発行する手段がある。
サーバーサイド側からの発行の場合だと、ITPの制限はなく開発者側で自由に設定できる。
また、1st Party Cookieと定義されるためにSet-Cookieするサーバーが同ドメインにある必要がある。
2つのサーバーを同ドメインと判断させる方法は、サブドメイン化することだ。
もしブラウザを表示するドメインがcontents.comならば、www2.contents.comのようにレコード設定することで可能になる。
③ ❌CNAMEレコード ◎Aレコード
②でサブドメイン化する時のレコード設定の方法として、CNAMEレコードとAレコードがあげられる。
それぞれのレコードの意味を簡単に説明すると、
- CANAMEレコード:正規ホスト名に対する別名を定義するレコード
- Aレコード:IPv4でホスト名とIPアドレスの関連づけを定義するレコード
しかし、CNAMEレコードで設定すると、Safariでは7日間しかcookieを保持できない。
したがって、Aレコードを使ってサブドメイン化をする必要がある。
まとめ
ITP2.3までによると、以下を守るとcookieは開発者側で自由に設定できるため、結果的に半永久的の保持が可能である。
- 1st Party Cookie で定義されるように発行すること
- サーバーサイド側からcookieを発行すること
- Aレコードでサブドメイン化すること