Cookie 有哪些常用属性(如 HttpOnly、Secure、SameSite、Max-Age、Expires)?各自的作用是什么?

从“购物小票”到“保险柜”:Cookie 安全属性终极指南
1. 引言:超市购物小票的“秘密”
想象你去超市购物,结账后收银员递给你一张购物小票(Cookie)。这张小票上印着:商品清单、价格、会员积分,还有一行小字——“仅限本店使用,撕毁无效”。如果小票上还写着你的银行卡密码,你肯定不放心;如果这张小票谁都能随便复印、篡改,那你的积分和优惠券早就被人冒领了。
在 Web 世界中,Cookie 就像这张购物小票,它记录着你和网站之间的“交易信息”。但小票上的信息该写什么?谁能看?能用多久?在什么条件下能用?这些规则就由 Cookie 的属性来定义。正确设置这些属性,相当于给小票加上了“防伪水印”“加密信封”和“有效期”。如果设置不当,你的网站就会像一张到处乱扔的、写着密码的小票,随时可能被黑客利用。
本文将从最基础的“Cookie 是什么”讲起,深入剖析 HttpOnly、Secure、SameSite、Max-Age 等核心属性的作用,并给出生产环境的最佳实践配置。
2. 前置知识:Cookie 的“出厂设置”
在了解属性之前,我们先理解一个关键问题:Cookie 是怎么来的?
当你访问一个网站时,服务器可以在 HTTP 响应头中添加一个 Set-Cookie 字段,告诉浏览器:“请帮我记住以下信息,并在下次访问时带回来”。浏览器收到后,就会按照这些“指令”存储 Cookie。
// 服务器告诉浏览器:存一个名为 sessionId 的 Cookie,值为 abc123
Set-Cookie: sessionId=abc123
默认情况下,这个 Cookie 的生命周期是“会话级”(关闭浏览器即失效),作用域是当前域名和路径,并且可以被 JavaScript 读取、可以通过普通 HTTP 传输。这种“出厂设置”存在安全隐患,所以我们需要用属性来“加固”它。
3. Cookie 核心属性详解
3.1 安全三件套:HttpOnly、Secure、SameSite
这三个属性是防御 XSS、CSRF 和中间人攻击的基石,适用于所有承载敏感信息(如 Session ID)的 Cookie。
3.1.1 HttpOnly:给 Cookie 加一把“锁”
- 是什么:禁止 JavaScript 通过
document.cookie访问 Cookie。 - 为什么需要它:如果网站存在 XSS(跨站脚本)漏洞,攻击者可以注入恶意脚本,通过
document.cookie窃取用户的 Session ID,从而冒充用户登录。HttpOnly让 JavaScript 无法读取 Cookie,即使存在 XSS 漏洞,攻击者也无法盗取。 - 怎么工作:服务器设置
HttpOnly后,浏览器会“锁住”这个 Cookie,JavaScript 读取document.cookie时返回空字符串。 - 注意事项:
HttpOnly只能由服务器通过Set-Cookie设置,前端 JavaScript 无法添加此属性。
Set-Cookie: sessionId=abc123; HttpOnly
3.1.2 Secure:只走“安全通道”
- 是什么:标记 Cookie 仅能通过 HTTPS 协议传输。
- 为什么需要它:HTTP 是明文传输,攻击者可以在网络路径上截获 Cookie(中间人攻击)。
Secure强制 Cookie 只在加密的 HTTPS 连接中发送,防止明文泄露。 - 注意事项:本地开发时
localhost不受此限制;生产环境必须设置。如果设置Secure但网站使用 HTTP,该 Cookie 不会被发送。
Set-Cookie: sessionId=abc123; Secure
3.1.3 SameSite:限制“跨站携带”
- 是什么:控制跨站点请求时是否携带 Cookie。有三个可选值:
Strict:最严格,任何跨站请求都不携带 Cookie(包括从其他网站点击链接跳转)。Lax:现代浏览器的默认值,允许部分安全跨站请求(如从其他网站点击<a>链接跳转),但禁止 POST、iframe 等跨站请求。None:允许所有跨站请求携带 Cookie,但必须同时设置Secure。
- 为什么需要它:主要为了防御 CSRF(跨站请求伪造) 攻击。攻击者可以构造恶意网站,诱使用户点击,利用用户已登录的身份向目标网站发送请求。
SameSite限制了这种跨站携带行为,使 CSRF 攻击难以实施。 - 注意:若设置
SameSite=None,必须同时设置Secure。
// 允许跨站链接跳转时携带,但禁止表单提交等跨站请求
Set-Cookie: sessionId=abc123; SameSite=Lax
// 允许所有跨站请求携带(必须配合 HTTPS)
Set-Cookie: sessionId=abc123; SameSite=None; Secure
3.2 生命周期控制:Max-Age 与 Expires
- 是什么:决定 Cookie 能存活多久。
Max-Age:相对过期时间,单位秒(如Max-Age=3600表示 1 小时后过期)。优先级高于Expires。Expires:绝对过期时间,格式为 HTTP-date(如Expires=Wed, 21 Oct 2025 07:28:00 GMT)。- 若两者都未设置,Cookie 为会话级,关闭浏览器即失效。
- 为什么需要它:持久化 Cookie 可以实现“记住我”功能;限制生命周期可降低 Cookie 泄露后的风险。
- 最佳实践:登录态 Cookie 的生命周期不宜过长(如 7-30 天);敏感操作(如支付)的 Cookie 应更短。
// 设置 7 天后过期
Set-Cookie: sessionId=abc123; Max-Age=604800; HttpOnly; Secure
// 设置具体过期时间点
Set-Cookie: sessionId=abc123; Expires=Wed, 21 Oct 2025 07:28:00 GMT; HttpOnly; Secure
3.3 作用域控制:Domain 与 Path
- Domain:指定 Cookie 可被哪些域名访问。设置为
.example.com时,a.example.com和b.example.com均可访问;不设置则仅当前域名(不含子域)。 - Path:指定 Cookie 可被哪些路径访问。
Path=/docs匹配/docs、/docs/Web/等,但不匹配/doc或/。 - 为什么需要它们:精细控制 Cookie 的可见范围,遵循“最小权限原则”,防止非必要模块访问敏感 Cookie。
- 注意:Domain 不能设置为
.com等顶级域,否则会造成严重安全风险;Path 不是安全措施,仅用于功能隔离。
// 仅 a.example.com 的 /admin 路径下才能访问
Set-Cookie: adminToken=xyz; Domain=a.example.com; Path=/admin; HttpOnly; Secure
4. 常用组合与最佳实践
4.1 安全三件套(适用于所有敏感 Cookie)
Set-Cookie: sessionId=<value>; HttpOnly; Secure; SameSite=Lax
这是现代 Web 应用的黄金标配:
HttpOnly:防御 XSSSecure:防御中间人SameSite=Lax:防御 CSRF(同时不影响正常链接跳转体验)
4.2 跨域场景(如嵌入第三方服务)
如果你的 Cookie 需要在第三方网站(如嵌入的 iframe)中被携带,必须设置:
Set-Cookie: widget_session=<value>; SameSite=None; Secure; HttpOnly
注意:SameSite=None 必须配合 Secure,且网站必须支持 HTTPS。
4.3 持久化登录(“记住我”功能)
Set-Cookie: remember_token=<value>; Max-Age=2592000; HttpOnly; Secure; SameSite=Lax
设置合理的过期时间(如 30 天),同时保留安全属性。
4.4 属性速查表
| 属性 | 作用 | 推荐设置 |
|---|---|---|
| HttpOnly | 防 XSS 窃取 | 必须(敏感 Cookie) |
| Secure | 防中间人截获 | 必须(生产环境) |
| SameSite | 防 CSRF | Lax(默认),跨站用 None |
| Max-Age | 控制生命周期 | 按业务需求设置(如 7 天、30 天) |
| Domain | 控制域名范围 | 默认不设,需要跨子域时设为 .example.com |
| Path | 控制路径范围 | 默认 /,需隔离时设为具体路径 |
5. 常见误区与避坑指南
| 误区 | 正解 |
|---|---|
“设置了 Secure 就安全了” |
Secure 只保证传输加密,无法防止 XSS 或客户端读取,必须配合 HttpOnly。 |
“SameSite=None 随便用” |
SameSite=None 必须配合 Secure 和 HTTPS,否则浏览器会拒绝。 |
“HttpOnly 能防止 CSRF” |
HttpOnly 不防 CSRF,防 CSRF 靠 SameSite 或 Token 机制。 |
“Domain 可以设为 .com” |
严禁! 这样会导致 Cookie 被所有 .com 网站访问,灾难性风险。 |
“Path 能隔离敏感数据” |
Path 是功能隔离,不是安全边界。同一域名下的其他路径仍可能通过其他方式访问 Cookie。 |
6. 总结:构建安全的 Cookie 防线
| 维度 | 关键属性 | 作用 |
|---|---|---|
| 安全性 | HttpOnly + Secure + SameSite |
防御 XSS、CSRF、中间人攻击 |
| 生命周期 | Max-Age / Expires |
控制 Cookie 存活时间,降低泄露风险 |
| 作用域 | Domain + Path |
遵循最小权限原则,限制访问范围 |
最终建议:
- ✅ 所有敏感 Cookie(如 Session ID)必须设置
HttpOnly; Secure; SameSite=Lax - ✅ 跨站场景使用
SameSite=None; Secure - ✅ 合理设置生命周期,避免过长或过短
- ✅ 严格限制 Domain 和 Path,遵循最小权限原则
- ✅ 定期审计 Cookie 属性配置,确保符合最新安全标准
Cookie 是 Web 应用状态管理的基石,但它的安全性完全取决于你如何配置这些属性。希望本文能帮你构建起一道坚固的 Cookie 安全防线。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)