Cookie 属性决定边界
服务端通过 Set-Cookie 响应头下发 Cookie,属性决定它活多久、在哪些路径与子域生效、能不能被脚本读取以及跨站请求时会不会被带上。Expires 与 Max-Age 管生命周期,Domain 与 Path 管作用范围,Secure 与 HttpOnly 管传输与读取,SameSite 管跨站携带。会话类 Cookie 一旦漏配 Secure 或 HttpOnly,就等于把会话凭证暴露在明文链路或脚本里。
属性速查
| 属性 | 作用 | 建议 |
|---|---|---|
| Expires | 绝对过期时间 | 与 Max-Age 二选一,优先用 Max-Age |
| Max-Age | 相对存活秒数,设为 0 即删除 | 会话态可省略,关闭浏览器即失效 |
| Domain | 允许生效的子域范围 | 能省则省,默认只作用于当前域 |
| Path | 路径前缀匹配 | 默认按目录,切得太细容易产生同名冲突 |
| Secure | 只在 HTTPS 连接中发送 | 会话 Cookie 必须配置 |
| HttpOnly | 禁止脚本通过 document.cookie 读取 | 会话 Cookie 必须配置 |
| SameSite | 跨站携带策略:Strict 与 Lax 与 None | 默认按 Lax 理解;用 None 时必须配 Secure |
设置与删除
设置与删除
curl -si https://app.example.com/login | grep -i set-cookie # 观察服务端下发的属性
# 推荐的会话 Cookie 形态:
# Set-Cookie: sid=abc123; Path=/; Max-Age=3600; Secure; HttpOnly; SameSite=Lax
# 删除时必须与创建时的 Path 和 Domain 完全一致,否则删不掉:
# Set-Cookie: sid=; Path=/; Max-Age=0; Secure; HttpOnly典型使用场景
- 登录会话保持:会话标识放 HttpOnly 加 Secure 的 Cookie,避免被脚本读取
- 跨站嵌入场景:第三方页面需要携带 Cookie 时必须用 SameSite=None 并配 Secure
- 多子域共享登录态:需要显式设置 Domain,但要接受所有子域共享的风险
- A 与 B 测试分流:用 Cookie 标记分组,注意 Path 与 Domain 要与站点结构匹配
- 退出登录:按创建时的属性组合删除,否则浏览器会保留旧值
常见组合
| 场景 | 推荐属性 | 原因 |
|---|---|---|
| 会话 Cookie | HttpOnly 加 Secure 加 SameSite=Lax | 同时防脚本读取、明文传输与大部分跨站请求 |
| 跨站嵌入 | SameSite=None 加 Secure | 跨站携带必须显式声明,且只能走 HTTPS |
| 长期偏好设置 | Max-Age 设置较长时间,Domain 收紧 | 减少子域之间的相互影响 |
| 临时校验状态 | 不设 Max-Age,保持会话级 | 关闭浏览器后自动清理 |
| 敏感信息 | 不要放进 Cookie | Cookie 会随请求反复上传,也容易被中间设备记录 |
删除 Cookie 必须与创建时使用完全相同的 Path 与 Domain,否则浏览器会认为这是另一个 Cookie,用户会看到「点了退出登录但仍是已登录状态」。