DevTools Cookie 调试
按 Set-Cookie → 浏览器存储 → 下一次请求 Cookie 三段证据排查 Cookie 登录态异常,并结合 Domain、Path、Secure、SameSite、Expires/Max-Age 与跨源凭证策略定位根因。
#debug
#growing
#frontend
#browser
#chrome-devtools
[!info] related notes
- 所属 MOC: DevTools Application MOC
- 前置概念: Cookie、Session、Token, HttpOnly Cookie, SameSite
- 请求证据: 请求与响应检查
- 上位排障: 登录态异常排查路线
DevTools Cookie 调试
症状
- 登录接口返回成功,但刷新后变成未登录;
- Application 里有 Cookie,但请求没带;
- Response 有 Set-Cookie,但 Application 里没有;
- 本机正常、跨域环境失败;
- 某些浏览器/HTTPS 环境下 Cookie 行为不同。
证据链
不要只看一处。按三段检查:
Response Set-Cookie
→ Browser 是否接受并存储
→ 下一次 Request 是否携带 Cookie
第一步:服务端有没有下发
在 Network 响应里检查 Set-Cookie。
如果根本没有:
- 登录逻辑可能没设置;
- 反向代理可能改写;
- 代码走到了不同 response path。
这时先别查浏览器存储。
第二步:浏览器有没有接受
到 Application → Cookies 检查:
- Name / Value;
- Domain;
- Path;
- Expires / Max-Age;
- Secure;
- HttpOnly;
- SameSite。
如果 Response 有 Set-Cookie 但没存下来,优先看 DevTools 的 blocked reason / Issues 提示,以及属性是否与当前 scheme/site 场景匹配。
第三步:请求为什么没带
Cookie 存在也不等于一定发送。
继续检查下一次 Network Request Headers,并逐项判断:
- request host 是否匹配 Domain;
- path 是否匹配;
- 是否已过期;
- Secure Cookie 是否在 HTTPS;
- SameSite 是否允许当前跨站上下文;
- 跨源 fetch 是否正确启用 credentials;
- CORS 是否允许 credentialed response。
HttpOnly 的边界
HttpOnly 会阻止页面 JavaScript 通过 document.cookie 读取,但 DevTools 仍可以观察 Cookie。
所以:
document.cookie 看不到
≠ Cookie 不存在
典型根因矩阵
| 证据 | 优先怀疑 |
|---|---|
| 无 Set-Cookie | 服务端/代理没有下发 |
| 有 Set-Cookie 但没存 | 属性被浏览器拒绝 |
| 已存但请求不带 | Domain/Path/Secure/SameSite/credentials |
| 请求带了但仍 401 | Session/Token authority 或服务器验证 |
| 跨源环境失败 | SameSite + credentials + CORS 组合 |
修复原则
修复真正的 Cookie contract,不要靠:
- 让用户清全部 Cookie;
- 把 SameSite 一律改宽松;
- 关闭 Secure;
- 前端自己伪造 Cookie Header。
迁移检查
给一个场景:登录接口 200,Response 有 Set-Cookie,但刷新后 /me 仍 401。
闭卷完成:
- 先证明 Cookie 是否存下;
- 再证明
/me是否携带; - 分别列出“没存”和“没带”的不同根因;
- 如果 Cookie 已携带但仍 401,说明下一层该查什么;
- 解释为什么 Application 里有 Cookie 不能直接证明登录态正确。