満期

Expires 属性 (Cookie)

[5] CookieExpires 属性 (attribute) は、 設定する名前の組の有効期限を指定します。

仕様書

意味

[7] Expires 属性クッキーの最大寿命 (lifetime) を、 クッキーが期限切れとなる日時として示します。 >>25, >>6

[26] この時刻を過ぎるとその Cookie は保存・送信されなくなります。 >>6 ただし利用者エージェントはこの時刻まで必ずクッキーを保持し続けなければならないわけではありません >>25

[8] Expires 属性が指定されない場合、 利用者セッションが終了次第有効期限に達したとみなします。 >>6

[9] セッションの終了のタイミングは規定されておらず、 Webブラウザの実装に依りますが、 ブラウザを閉じた時などにセッションが終了したとみなすのが普通です。

構文

[10] Expires 属性の値はCookieの日付形式の文字列です。

[24] RFC 6265 における Expires 属性の構文
 expires-av        = "Expires=" sane-cookie-date
 sane-cookie-date  = <rfc1123-date, defined in [RFC2616], Section 3.3.1>
                       ; In practice, both expires-av and max-age-av
                       ; are limited to dates representable by the
                       ; user agent.

過去

[15] Cookie を削除するには (DomainPath を揃えた上で) 同じ名前の Cookie を過去の Expires 属性の値で設定することになっています。 >>6

[16] 過去の時刻でなく現在の時刻を指定することもありますが、過去にした方が安全です。

無限大

[12] 有効期限を無期限とすることはできないため、十分将来の値を設定することで事実上の無期限としていることがあります。それを有効な技法として紹介している解説サイトもあります。

[2]

無期限という指定はできないようです。2038年以降の日付をうまく扱えないシステムもあるので、2030年頃の日付を指定しておきましょう。

[13] しかし、このような実装になっていると2030年になると使えなくなることに注意が必要です。 Web サイトが予想以上に長く使われたり、コードがコピペで転用されていつまでも使いまわされるのはよくあることなので、 危険です。

[14] 本当に無期限にしたいときは、現在時刻より数年先としておく方が無難でしょう。

[42] は任意の日時を設定できますが、実際には利用者エージェントはそれに無条件に従って何十年もクッキーを保持し続けるとは限りません。 ですから、は無闇に先の日時を指定するのではなく、用途に照らして妥当な期間を指定するべきです >>32

[43] 例えばセッションの識別のためのクッキーなら普通は2週間程度で良いでしょう >>32

構文解析

[4] 属性値Cookieの日時形式として構文解析しなければなりません。 失敗した場合には属性を無視しなければなりません。 結果が利用者エージェントの扱える最小または最大の日時の外側を表しているなら、 最小または最大に読み替えて構いません。 >>3

処理モデル

[28] クッキーの持続フラグと満期時刻は、構文解析結果を使って次のように決定しなければなりません >>27

  1. [35] Max-Age 属性があれば、
    1. [36] クッキーの持続フラグを設定します。
    2. [37] クッキーの満期時刻を最後の Max-Age 属性の構文解析結果に設定します。
  2. [38] そうでなく、 Expires 属性があれば、
    1. [39] クッキーの持続フラグを設定します。
    2. [40] クッキーの満期時刻を最後の Expires 属性の構文解析結果に設定します。
  3. [41] そうでなければ、
    1. [45] クッキーの持続フラグは設定しません。
    2. [46] クッキーの満期時刻を表現可能な最後の日付とします。
  4. [33] セッションを越えてクッキーを保存しないと設定されているなら、 クッキーの持続フラグを未設定とします。 >>42

[29] つまり Max-Age 属性Expires 属性があれば、それによって満期時刻が設定され、 セッションを越えて保存されます。両方あれば、 Max-Age 属性が優先されます。どちらもなければ、満期時刻は無限大となりますが、 セッションを越えて保存されません。
[34] セッションも参照。

満期

[30] クッキーは満期時刻が過去となったとき、満期 (expired) となります >>27

[31] 利用者エージェントは、保存しているクッキー満期となった時、 これを削除しなければなりません >>27

[20] 利用者エージェントは、有効期限に達していなくても、Cookieのサイズ制限などの理由で Cookie を削除して構いません。 >>6

歴史

関連

[17] HTTP 頭部には Expires: 頭欄を指定することができますが、 こちらは実体の有効期限を示すものなので、Set-Cookie: 欄で使う Expires 属性とは関係ありません。

[18] IETF 版の Cookie 仕様には Expires 属性に代わり Max-Age 属性が定義されています。後にこれは一般的な利用者エージェントでも実装されるようになり、 IETF 独自の Cookie 仕様が破棄された後の RFC 6265Cookie 仕様にも ExpiresMax-Age の両方が残っています。

メモ

[19] 属性の値に空白が含まれるので、本来なら値を " で括るのが MIMEHTTP の仕様的に美しい方法ではあるのですが、 Cookie では逆に括ってはいけません。

[44] 1160368 - Treat cookies set over non-secure HTTP as session cookies (if pref "network.cookie.thirdparty.nonsecureSessionOnly" is true) () https://bugzilla.mozilla.org/show_bug.cgi?id=1160368

[47] draft-thomson-http-omnomnom-00 - Expiring Aggressively Those HTTP Cookies (, ) https://tools.ietf.org/html/draft-thomson-http-omnomnom-00