浏览器发送请求在什么情况下会携带 Cookie
Cookie 是 Web 开发中用于状态管理的重要机制,但浏览器并不是在所有请求中都会携带 Cookie。
Cookie 携带的必要条件
浏览器在发送请求时携带 Cookie 必须满足以下所有条件:
1. Cookie 必须是有效的
未过期
Cookie 的 Expires 或 Max-Age 属性必须还没有到期。
Expires: 指定具体的过期时间(GMT格式)Max-Age: 指定从现在开始的存活时间(秒数)- 如果两个属性都设置,
Max-Age优先级更高
未被删除
Cookie 没有被用户、服务器或浏览器策略删除。
- 用户可以通过浏览器设置手动删除
- 服务器可以通过设置过期时间删除
- 浏览器会根据存储限制自动清理旧
Cookie
2. Cookie 的作用域必须匹配
域名(Domain)匹配
请求的域名必须与 Cookie 的 Domain 属性相匹配,或者是它的子域名。
- 如果
Domain属性没有设置,默认为设置Cookie的域名(不包含子域名) - 设置
Domain=.example.com可以让Cookie在example.com和所有子域名生效 - 出于安全考虑,无法为其他域名设置
Cookie
路径(Path)匹配
请求的路径必须在 Cookie 的 Path 属性指定的路径下。
- 如果
Path属性没有设置,默认为设置Cookie页面的路径 Path=/admin意味着只有访问/admin及其子路径时才会发送该Cookie- 路径匹配遵循”最长前缀匹配”原则
3. Cookie 的安全属性必须满足
安全连接(Secure)
如果 Cookie 设置了 Secure 属性,浏览器只会在 HTTPS 协议下发送它。
- 这是防止中间人攻击的重要安全措施
- 对于敏感信息(如登录令牌),建议始终使用
Secure属性
HttpOnly 属性
虽然 HttpOnly 不影响 Cookie 是否被发送,但它是重要的安全属性。
- 设置了
HttpOnly的Cookie无法通过JavaScript访问 - 有效防止
XSS攻击获取敏感Cookie
同站规则(SameSite)
SameSite 属性控制跨站请求时的 Cookie 发送行为:
SameSite=Strict: 只在同站请求中发送Cookie,提供最严格的保护SameSite=Lax: 在同站请求中发送,并且在用户点击链接或GET表单等方式进行跨站导航时也会发送(默认值)SameSite=None: 在同站和跨站请求中都发送,但必须同时设置Secure属性
Cookie 值的来源
绝大多数情况下,Cookie 的所有字段都是由服务器在 HTTP 响应的 Set-Cookie 头部设置。
1 | 200 OK |