浏览器发送请求在什么情况下会携带 Cookie

CookieWeb 开发中用于状态管理的重要机制,但浏览器并不是在所有请求中都会携带 Cookie

浏览器在发送请求时携带 Cookie 必须满足以下所有条件:

未过期

CookieExpiresMax-Age 属性必须还没有到期。

  • Expires: 指定具体的过期时间(GMT 格式)
  • Max-Age: 指定从现在开始的存活时间(秒数)
  • 如果两个属性都设置,Max-Age 优先级更高

未被删除

Cookie 没有被用户、服务器或浏览器策略删除。

  • 用户可以通过浏览器设置手动删除
  • 服务器可以通过设置过期时间删除
  • 浏览器会根据存储限制自动清理旧 Cookie

域名(Domain)匹配

请求的域名必须与 CookieDomain 属性相匹配,或者是它的子域名。

  • 如果 Domain 属性没有设置,默认为设置 Cookie 的域名(不包含子域名)
  • 设置 Domain=.example.com 可以让 Cookieexample.com 和所有子域名生效
  • 出于安全考虑,无法为其他域名设置 Cookie

路径(Path)匹配

请求的路径必须在 CookiePath 属性指定的路径下。

  • 如果 Path 属性没有设置,默认为设置 Cookie 页面的路径
  • Path=/admin 意味着只有访问 /admin 及其子路径时才会发送该 Cookie
  • 路径匹配遵循”最长前缀匹配”原则

安全连接(Secure)

如果 Cookie 设置了 Secure 属性,浏览器只会在 HTTPS 协议下发送它。

  • 这是防止中间人攻击的重要安全措施
  • 对于敏感信息(如登录令牌),建议始终使用 Secure 属性

HttpOnly 属性

虽然 HttpOnly 不影响 Cookie 是否被发送,但它是重要的安全属性。

  • 设置了 HttpOnlyCookie 无法通过 JavaScript 访问
  • 有效防止 XSS 攻击获取敏感 Cookie

同站规则(SameSite

SameSite 属性控制跨站请求时的 Cookie 发送行为:

  • SameSite=Strict: 只在同站请求中发送 Cookie,提供最严格的保护
  • SameSite=Lax: 在同站请求中发送,并且在用户点击链接或 GET 表单等方式进行跨站导航时也会发送(默认值)
  • SameSite=None: 在同站和跨站请求中都发送,但必须同时设置 Secure 属性

绝大多数情况下,Cookie 的所有字段都是由服务器在 HTTP 响应的 Set-Cookie 头部设置。

1
2
3
HTTP/1.1 200 OK
Set-Cookie: sessionId=abc123xyz; Max-Age=3600; Path=/; HttpOnly; Secure; SameSite=Lax
Content-Type: text/html