cookie的生命周期
cookie的生命周期可以通过两种方式定义:
- 会话期cookie是最简单的cookie:浏览器关闭后会被自动删除。会话期cookie不需要指定过期时间(Expires)或者有效期(Max-Age)。需要注意的是,有些浏览器提供了会话恢复功能,这种情况即使关闭了浏览器,会话期cookie也会被保留下来,这会导致cookie的生命周期无限期延长
- 持久性cookie的生命周期取决于过期时间(Expires)或者有效期(Max-Age)指定的一段时间。
- 当Cookie的过期时间被设定时,设定的日期和时间只与客户端相关,而不是服务端。
限制访问Cookie
- Secure:标记为Secure的cookie通过被HTTPS协议加密过的请求发送给服务端。可以预防man-in-the-middle攻击。
- 从Chrome52和firefox 52开始,非Https的站点无法使用Cookie的Secure标记。
- HttpOnly:JavaScript
Document.cookie
API无法访问带有HttpOnly
属性的cookie,此类cookie仅作用于服务器。此属性有助于缓解跨站点脚本(XSS)
攻击。
Cookie的作用域
- Domain:指定了哪些主机可以接受cookie。如果不指定,默认为origin,不包含子域名。如果指定了Domain,一般包含子域名。
- 当前大多数浏览器遵循 RFC 6265,设置 Domain 时 不需要加前导点。浏览器不遵循该规范,则需要加前导点,例如:
Domain=.mozilla.org
- 当前大多数浏览器遵循 RFC 6265,设置 Domain 时 不需要加前导点。浏览器不遵循该规范,则需要加前导点,例如:
- Path:指定了主机下的哪些路径可以接受cookie。以"/"作为路径分隔符,子路径也会被匹配。
- SameSite:允许服务器要求某个cookie在跨站请求时不会被发送,其中Site由可注册域定义,从而可以组织跨站请求伪造攻击(CSRF)。取值如下:
- None:浏览器会在同站请求、跨站请求下继续发送cookies,不区分大小写。
- Strict:浏览器只在访问相同站点时发送cookie。
- Lax:与Strict类似,但用户从外部站点导航至URL时(例如通过链接)除外。在新版本浏览器中,为默认选项为默认选项,Same-site cookies 将会为一些跨站子请求保留,如图片加载或者 frames 的调用,但只有当用户从外部站点导航到URL时才会发送。如 link 链接。
- 以前,SameSite如果没有设置,默认行为等同于None,cookies会被包含在任何请求中,包括跨站请求。
- 大多数主流浏览器正在将SameSite的默认值迁移到Lax,如果要指定cookie在同站、跨站请求都被发送,需要明确指定SameSite为None。
Cookie prefixes
__Host-
:如果cookie名称具有此前缀,仅当它也用Secure
属性标记,是从安全源发送的,不包含Domain
属性,并将Path
属性设置为/
时,它才在Set-Cookie
header中接受。这些cookie可以被视为"domain-locked"。__Secure-
:如果cookie明白包含此前缀,则仅当它也用Secure
属性标记,是从安全源发送的,它才在Set-Cookie
header中接受。此前缀限制弱于__Host-
前缀。- 带有这些前缀的cookie,如果不符合其限制的会被浏览器拒绝。
参考:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies
关联cookie知识点:Cookie的HttpOnly、secure、domain属性