主题
Cookie
概述
- Cookie 是浏览器在客户端以小型键值对形式保存并随请求发送到服务器的机制。常用于会话管理、个性化和统计追踪。
- Cookie 存储在浏览器中,可以由服务端通过
Set-Cookie头设置,也可以由前端通过document.cookie读写(受 HttpOnly 限制)。
Set-Cookie 语法
http
Set-Cookie: <name>=<value>; Domain=<domain>; Path=<path>; Expires=<date>; Max-Age=<非负整数>; Secure; HttpOnly; SameSite=<Lax|Strict|None>示例:
http
Set-Cookie: sessionId=abc123; Domain=.example.com; Path=/; Max-Age=3600; Secure; HttpOnly; SameSite=Lax关键概念与要点
- 名称/值(Name=Value):键值对,值建议使用
encodeURIComponent编码,读取时用decodeURIComponent。 - 域(Domain):决定哪些主机会携带该 Cookie。将
Domain设为.example.com可在www.example.com与api.example.com共享;尽量不要设得比需要的更宽以降低风险。 - 路径(Path):URL 前缀匹配时发送,默认是设置 Cookie 的请求路径。例如
Path=/account只会在匹配该前缀的请求中发送。 - 过期(Expires / Max-Age):Expires 为绝对时间字符串,Max-Age 为相对秒数;Max-Age 优先于 Expires。无过期属性的 Cookie 为会话 Cookie(浏览器或标签页关闭后清除)。
- Secure:仅在 HTTPS 下发送。注意:现代浏览器要求
SameSite=None的 Cookie 必须同时设置Secure。 - HttpOnly:禁止通过 JavaScript(
document.cookie)访问,能减少 XSS 导致的 Cookie 泄露,但也意味着客户端脚本无法读取该值。 - SameSite:控制跨站请求时是否携带 Cookie:
Strict:最严格,跨站导航与请求通常不携带 Cookie,适合高敏感性 session。Lax:折衷选项,跨站顶级导航(如从外部站点的链接进入)会携带,但一般的跨站 POST/子资源请求不携带。None:允许跨站携带,但必须配合Secure使用。
Cookie 操作
前端 JS 操作
- 读取所有可见 Cookie(注意 HttpOnly 则不可读):
js
console.log(document.cookie) // "a=1; b=2"- 设置 Cookie(简单示例):
js
document.cookie = `theme=dark; Path=/; Max-Age=${60 * 60 * 24 * 30}` // 30 天- 删除 Cookie(通过设置过期时间):
js
document.cookie = `theme=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT`注意:使用 document.cookie 写入时无法设置 HttpOnly(只能由服务端设置)。
服务端设置示例(Node/Express)
js
// Express 示例
res.cookie('sessionId', token, {
httpOnly: true,
secure: true,
sameSite: 'lax',
maxAge: 3600 * 1000,
domain: '.example.com',
path: '/',
})或者直接设置响应头:
http
Set-Cookie: sessionId=abc; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=3600浏览器限制与兼容性
- 单个 Cookie 大小限制通常约 4KB(包含 name、value 及属性),不同浏览器略有差异。
- 每域 Cookie 数量与总大小有限制(例如每域 50 个左右)。
- 第三方 Cookie(第三方上下文)可能被浏览器阻止或用户禁用。
- 隐私/无痕模式下 Cookie 行为可能被隔离或在会话结束后清除。
安全建议
- 不在 Cookie 中存放明文敏感信息(如密码、信用卡);使用短 token 或服务端 session 标识,并在服务端保存敏感数据。
- 对于认证/会话 Cookie,设置 HttpOnly、Secure、并合理使用 SameSite(默认推荐 Lax 或 Strict,必要时 None + Secure)。
- 限定 Domain 与 Path 范围,最小权限原则。
- 对重要 Cookie 使用签名/校验(HMAC)以防篡改。
- 使用 HTTPS 全站,避免中间人窃取 Cookie。
