🦔

今更ながら Cookie の有効期限に上限があることを知った

に公開

きっかけ

ある日の開発中、明示的に削除するまでは Cookie にほぼ永遠に保持しておきたい値 がありました。

「じゃあ MaxAge をめちゃくちゃ長くすればいいよね」ということで、
30 年分の MaxAge を指定して Set-Cookie ヘッダを返すコードを書きました。

cookie := &http.Cookie{
		Path:     "/",
		Name:     "example_cookie",
		Value:    "example_value",
		MaxAge:   30 * 365 * 24 * 60 * 60,
		HttpOnly: true,
		Secure:   true,
		SameSite: http.SameSiteLaxMode,
	}
http.SetCookie(w, cookie)

そして、ブラウザの DevTools で Cookie を確認してみると……

有効期限は 2027年2月24日 まで。
あれ?今が 2026年1月20日 だから……
有効期限が「1年と35日後」になっている?

Cookie の有効期限は 400日が上限らしい

どうやら Google Chrome は2022年8月のリリース以降、Cookie の有効期限を 400日以上先に設定できない ようになっていました。

https://developer.chrome.com/blog/cookie-max-age-expires?hl=ja

Max-Age や Expires にどれだけ未来の日付を指定しても、ブラウザ側で400日に丸められるという挙動になります。

なぜ今まで気づかなかったのか

これまでの経験上、Cookie に保存する値は

  • ログインセッション

  • 一時的な状態管理

といった、短期間で失効するものがほとんどでした。

そのため、
「Cookie に数年〜数十年単位の有効期限を設定する」
というユースケース自体がなく、2022年8月からの3年半以上この仕様を知らずに過ごしていました。

400日以上保持したい場合は?

「じゃあ 400 日以上保持したい場合はどうすればいいの?」というと、
現実的にはこの方法を取るしかなさそうです。

👉 毎回同じ名前で Set-Cookie ヘッダを返す

こうすることで、

  • Cookie の値はそのまま

  • 有効期限だけが毎回更新される

という形になり、実質的に半永久的に Cookie を保持できます!

おわりに

Cookie に有効期限の上限があるのは、普段セッション系しか扱っていないと意外と気づきにくい仕様でした。

同じところでハマる人が減れば嬉しいです🦜

Discussion