HTTP Cookie 是服务器发送给客户端并保存在本地的一小块数据,下次请求会带上 Cookie 给服务器方便判断张三还是李四在使用。
因为 HTTP 是无状态的,所以说 Cookie 能提供保持用户登录状态、购物车等记录等功能。
如果有多个 Cookie 值,服务器会在响应头加上多个「Set-Cookie」,用户请求时则是用「;」隔开。
Cookie 根据生命周期可分为会话期 Cookie 和持久性 Cookie。
-
会话期 Cookie: 浏览器关闭后就会自动删除 Cookie 数据,不过主流浏览器都支持会话恢复功能,这样就能延长 Cookie 的生命周期。
-
持久性 Cookie: 通过属性 Expires、Max-Age 控制有效时间。
作用
-
用户状态:保持登录状态,浏览历史、购物车、游戏分数等信息记录。
-
广告投放:广告商会通过 Cookie 分析你的数据后推送符合你胃口的广告。
-
用户自定义设置、换主题等。
有效期控制
-
Expires: 表示为绝对时间,可以说是截止时间,到那个时间就会过期。
-
Max-Age: 表示是相对时间,单位为秒,浏览器收到报文后才开始倒计时 Max-Age 设置的秒数。
如果同时设置了这两个属性,Max-Age 优先级大于 Expires,浏览器会优先使用它。
作用域控制
Domain 和 Path 指定了 Cookie 的域名和路径。通常我们会在 Path 看到的是「/」,它意思是域名下的任何路径都允许使用。
安全性
安全无论什么时候都很重要,Cookie 有 3 个属性预防一些安全问题:HttpOnly, SameSite, Secure。
-
HttpOnly:限制浏览器只能通过 HTTP 传输数据,这样就能禁止 document.cookie 等相关的 API 使用,从而一定程度上避免脚本攻击。
-
SameSite:能防范 XSRF 攻击(跨站请求伪造),这有两个值可以设置。
- ameSite=Strict:限制 Cookie 不能跨站传输。
- ameSite=Lax:禁止 POST 跨站传输,但 GET/HEAD 等安全方法就可以。
-
Secure:限制只能 HTTPS 协议传输,也就是说数据会以密文形式传输。