Cookie教程-expires/max-age属性

707 阅读4分钟
HTTP Cookies
## expires的含义 `expires`定义了一个Cookie什么时候过期失效。 `expires`属性名大小写不敏感,任何字母大写或者小写都有效。 `expires`的值按照标准中的说明是区分大小写的,但是目前的主流浏览器均不区分大小写。 举例:`11 Nov 2022 06:05:33 GMT` ## expires的格式 `expires`的格式和Javascript的`Date.prototype.toUTCString()`函数返回的值格式一致,是UTC+0(经度0度位置)的时间。 格式如下: `Www, dd Mmm yyyy hh:mm:ss GMT` 各个字母分别代表如下含义:
格式字符串解释
Www星期几,首字母大写,三个字母的简写形式:Mon、Tue等
dd当月的日期,两位数字,如果是个位数,前面要加0
Mmm月份,首字母大写,三个字母的简写形式:Jan、Feb
yyyy四位数年份,超过四位数一些浏览器会不兼容
hh当前小时数,两位数,如果是个位数则前面加0
mm当前分钟数,两位数,如果是个位数则前面加0
ss当前秒数,两位数,如果是个位数则前面加0
GMTGMT在这里代表UTC+0

我们可以看到格式里既有“星期几”,又有日期,其实有了日期,“星期几”就是多余的,但是它确实真真切切的被写在了标准里:www.rfc-editor.org/rfc/rfc2616…。 其实我们去掉“星期几”,各大主流浏览器 一般都还是能正确解析出时间的,但是我们最好还是按照标准来做,老老实实的把它加上。

expires的有效范围

虽然expires可以设置任意时间,但是如果你想设置一个足够长的时间,想确保Cookie长期存在浏览器中,这正在变得越来越困难。 Chrome 104版已经根据IETF rfc6265bis-10的草案实现了新的expires规则,即Cookie的最长有效时间不超过400天,如果你将expires设置超过了400天,浏览器会将其改成400天。而且草案中还规定,浏览器不可以允许设置超过400天,只可以比400天少。

而Safari则更为严格,根据Safari的ITP2.1(intelligent-tracking-prevention)的规则,通过Javascript的document.cookie设置的Cookie其最长有效期是七天,如果你设置的时间超过七天,它将自动调整到七天。不过通过Http的Set-Cookie设置的Cookie没有此限制,只要年份不超过9999年,都是可以的。这里说的Http是指浏览器地址栏的URL请求,这种Cookie叫做第一方Cookie。如果是第三方Cookie,则会有种种限制。关于第三方Cookie和Safari的ITP规则,我们将另开一篇文章讲解。

总体来看,Cookie的有效时间正在变得越来越短,这将不可免的影响到我们的业务。

expires的默认值

如果不设置expires,且也没有设置max-age(后面会讲),Cookie会被认为是Session Cookie,所谓Session就是一次会话,浏览器关闭后该Cookie便会失效,下次打开浏览器后不会再有该Cookie。

expires用于删除Cookie

指定一个比当前时间早的时间就可以删除目标Cookie。一定记得加上和目标Cookie相同的domainpath属性。 这里放出Javascript的示例:

document.cookie = 'xyz=aaa; domain=itthink.tech; path=/; expires=' + new Date(Date.now() - 1).toUTCString();

expires解释到此结束。

max-age的含义

max-age定义了一个Cookie在浏览器端保存的秒数,注意是秒,不是毫秒。 该属性名不区分大小写。 和expires不同的是,max-age定义了一个时间段,而expires定义的是一个时间点。 如果max-ageexpires同时出现,max-age的优先级高于expiresmax-age的值会被浏览器采纳,expires的值被丢弃。 例如,如果希望Cookie保存一年,可以这样设置:max-age=3153600031536000是一年的秒数。

max-age的格式

max-age的值必须是一个整数,当是负数或者0时代表删除目标Cookie。

max-age的兼容性问题

IE6、IE7、IE8都不支持max-age,所以如果产品的用户群中有这些浏览器的用户,则要考虑是否使用该属性,毕竟expires可以达到一样的效果。 expires的缺点是,它依赖用户端的时间,如果用户端的时间非常不准确的话,可能会导致和我们的预期不一致。

用max-age删除Cookie

当设置成负数或者0时,可以立即删除目标Cookie。

max-age就是这些了。