コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

2023年2月現在、Cookieの有効期限設定は未来すぎると意図違いの状態になるので気をつける

Cookieの有効期限設定、ドキュメントからわからない罠が多すぎるので雑にまとめる

前提としてCookieの維持に関して

MDNを転載すると以下の通り

Cookie の持続時間は 2 通りの方法で定義することができます。
・セッション Cookie は現在のセッションが終了すると削除されます。ブラウザーはいつ「現在のセッション」が終わったと見なすかを定義し、ブラウザーによっては再起動時にセッションの復元を使用することができます。そのため、結果的にセッション Cookie が無期限に持続することがあります。
・持続的 Cookie は、 Expires 属性で指定された時刻、または Max-Age で指定された期間が経過した後に削除されます。 - HTTP Cookie の使用 - HTTP | MDN

上記のようにExpires属性、あるいはMax−Age属性の設定した期間までは維持されるというのがベースの仕様となっている。

未来時刻を設定する際に気をつけないといけないこと

2038年1月18日以降を設定するとオーバーフローする

俗に言う2038年問題の一種で、2038年の1月18日の一定時間よりあとを指定すると、それ以降の時間を保持するビット数が足りず意図違いの値がセットされる。そのため無期限にしたいからと言って2038年以降を指定してはいけない。

Chrome104以降は400日以内に丸められる

When cookies are set with an explicit Expires or Max-Age attribute, the value will now be capped to no more than 400 days. - New in Chrome 104 - Chrome Developers

上記にある通り、Chromeは400日以内になるようになっている。

また、この仕様はHTTPワーキンググループでの以下の記述が元になっているのでブラウザ各社が追従する可能性がある。

The user agent MUST limit the maximum value of the Expires attribute. The limit SHOULD NOT be greater than 400 days (34560000 seconds) in the future. The RECOMMENDED limit is 400 days in the future, but the user agent MAY adjust the limit (see Section 7.2). Expires attributes that are greater than the limit MUST be reduced to the limit. - Cookies: HTTP State Management Mechanism - 4.1.2.1. The Expires Attribute

なお、この400日(約13ヶ月)が設定された背景はChrome Platform Statusの投稿いわく1年に1回だけ訪れるサイトなどもあるので、その点を配慮しての数値設定とのこと。

補足. SafariではITPの取り組みがあるので、設定次第ではかなり早く消える

SafariではSecure属性あるいてはhttp-only属性が付与されていないと、ITPの制約を受けるため短い期間の保持しかされない。詳しくは下記WebKitのブログを参照のこと。(2023年2月時点では24時間以内で消える)

Full Third-Party Cookie Blocking and More | WebKit

関連リンク