关于 cookie-debugging
借助 Chrome DevTools MCP 工具检查浏览器 Cookie,并诊断身份验证与同意状态。区分 HttpOnly Cookie 和 JavaScript 可访问的 Cookie,并提供隔离会话测试流程。
主要功能
- 01检查请求与响应中的 Cookie
- 02读取客户端可访问的 Cookie
- 03在隔离浏览器上下文中测试
- 04追踪身份验证失败
- 05审计同意状态与 Cookie 安全
适用场景
- 01调查 401 或 403 响应
- 02验证 Cookie 同意行为
- 03检查 Cookie 属性和浏览器问题
- 04测试未登录会话
MCP 相关
使用 `list_network_requests`、`get_network_request`、`evaluate_script` 和 `new_page` 等 Chrome DevTools MCP 工具检查并测试浏览器 Cookie。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ chromedevtools/ chrome-devtools-mcp --skill cookie-debugging安装后在 Claude Code 中输入/cookie-debugging确认已加载。
详细介绍
核心概念
页面定位:页面级工具(list_network_requests、get_network_request、list_console_messages、evaluate_script、navigate_page、take_snapshot、click、lighthouse_audit、close_page 等)需要 pageId 参数。使用 list_pages 或从 new_page 获取可用的页面 ID。
HttpOnly 与客户端存储
标记为 HttpOnly 的 Cookie 无法被客户端 JavaScript(cookieStore 或 document.cookie)访问或修改。但是,浏览器会自动将有效的 HttpOnly Cookie 附加到传出的 HTTP 请求头(Cookie)中。
- 检查当前
HttpOnly值:通过get_network_request查看任意传出 HTTP 请求的Cookie请求头。 - 检查 Cookie 是如何创建或配置的:查看登录/认证响应的
Set-Cookie响应头。 - 检查非
HttpOnlyCookie:使用evaluate_script配合现代的cookieStoreAPI(async () => await cookieStore.getAll())。
会话策略:活动标签页与隔离上下文
选择合适的会话环境,避免状态污染(例如残留的分析数据或认证令牌):
| 策略 | 使用场景 | 设置 / 清理 |
|---|---|---|
| 活动标签页(活动页面) | 诊断活动用户会话、实时 401/403 错误或当前状态。 | 在用户现有页面上操作;从 list_pages 获取其 pageId。 |
干净状态(isolatedContext) | 测试 Cookie 同意横幅、首次访问或零 Cookie 保证。 | 使用唯一的 isolatedContext(例如 "consent-audit-1")调用 new_page。完成后调用 close_page。 |
客户端能力与限制
| 操作 | 客户端 JavaScript(cookieStore / document.cookie) | DevTools 网络与上下文工具 |
|---|---|---|
| 读取非 HttpOnly | ✅ async () => await cookieStore.getAll() | ✅ get_network_request(请求 Cookie) |
| 读取 HttpOnly | ❌ 被浏览器安全策略阻止 | ✅ get_network_request(请求 Cookie) |
检查属性(Domain、Path、SameSite、Expires) | ✅ async () => await cookieStore.getAll() | ✅ get_network_request(响应 Set-Cookie) |
| 修改 / 删除非 HttpOnly | ✅ async () => await cookieStore.set(...) | 不适用 |
| 修改 / 删除 HttpOnly | ❌ 在 JavaScript 中静默失败 | ✅ 使用 new_page(isolatedContext: ...) 获得干净状态 |
警告
尝试通过 JavaScript(
cookieStore.delete或document.cookie = "...; max-age=0")清除HttpOnlyCookie 会静默失败。要在未认证或全新状态下测试,请始终使用new_page配合isolatedContext生成新的隔离上下文。
工作流模式
1. 诊断认证失败与重定向(401 / 403)
当已认证的页面请求失败、返回 401/403,或重定向到登录页时:
- 列出最近的请求:调用
list_network_requests,并设置includePreservedRequests: true。 - 找到目标请求:定位失败的请求(401/403)或重定向(302/307)。
- 检查发出的
Cookie请求头:使用reqid调用get_network_request。- 验证是否附带了
Cookie请求头,以及是否发送了所需的令牌(例如SESSION_ID、auth_token)。
- 验证是否附带了
- 触发主动检查(如果不存在最近的请求):
- 如果 cookie 是在之前的会话中设置的,且没有列出网络调用,请触发一个请求:
- 使用
navigate_page,并设置type: "reload",或 - 调用
evaluate_script,并传入() => fetch(window.location.href)
- 使用
- 然后对新请求调用
get_network_request,以检查当前生效的Cookie请求头。
- 如果 cookie 是在之前的会话中设置的,且没有列出网络调用,请触发一个请求:
- 追踪设置 cookie 的请求:如果 cookie 缺失或被拒绝:
- 检查更早的登录/握手响应中的
Set-Cookie指令:- Path 不匹配:例如请求的是
/,而 cookie 为Path=/api。 - Domain 不匹配:例如
Domain=api.example.com导致 cookie 无法用于sub.example.com。 - HTTP 上的 Secure 标志:
Securecookie 绝不会通过未加密的http://发送。 - SameSite 阻止:跨站导航时会省略
SameSite=Strictcookie。 - 过期:检查
Expires或Max-Age是否已过。
- Path 不匹配:例如请求的是
- 检查更早的登录/握手响应中的
2. Cookie 横幅与同意合规性测试
要验证在同意之前或拒绝时未设置任何非必要或跟踪 cookie:
- 从干净状态开始:使用专用名称打开一个全新的隔离上下文:
{"url": "<PAGE_URL>", "isolatedContext": "consent-test-1"} - 记录基线 Cookie:在与横幅交互之前,运行
evaluate_script,并传入async () => await cookieStore.getAll()。 - 检查过早的网络请求与问题:
- 调用
list_network_requests,确保在同意之前没有触发任何第三方跟踪信标。 - 调用
list_console_messages,并设置types: ["issue"],以检查跟踪警告。
- 调用
- 与同意横幅交互:
- 使用
take_snapshot捕获快照,以定位“拒绝”或“全部拒绝”按钮的uid。 - 使用
click点击该按钮。
- 使用
- 验证 Cookie 差异:
- 点击后运行
evaluate_script,并传入async () => await cookieStore.getAll(),以断言仅存在严格必要的 cookie 或同意状态 cookie。
- 点击后运行
- 测试同意撤回(生命周期审计):
- 在审计同意撤回或偏好更改时:
- 定位并点击“Cookie 设置”、“管理偏好”或页脚隐私触发器(
take_snapshot$\rightarrow$click)。 - 取消选择非必要类别,或点击“全部撤回”/“保存偏好”。
- 重新查询
cookieStore.getAll(),以验证之前已接受的非必要 cookie 已被清除或过期。 - 对后续操作调用
list_network_requests,以确保跟踪信标不再触发。
- 定位并点击“Cookie 设置”、“管理偏好”或页脚隐私触发器(
- 在审计同意撤回或偏好更改时:
- 拆除上下文:审计完成后调用
close_page,以防止残留 cookie 影响后续任务。
3. 审计 Cookie 安全性、SameSite 和 CHIPS(分区 Cookie)
- 快速检查:原生 DevTools 问题(推荐):
- 调用
list_console_messages,并传入:{ "pageId": 1, "types": ["issue"], "includePreservedMessages": true } - 检查
CookieIssue条目,例如:SameSiteNoneInsecure:SameSite=None未设置Secure。ThirdPartyCookiePhaseout:第三方 Cookie 被拦截或受到限制。SchemefulSameSite:跨 Scheme 的 Cookie 问题。PartitionedCookies:CHIPS 分区属性无效。
- 调用
- 深度审计:Lighthouse 第三方 Cookie:
- 运行
lighthouse_audit,并设置mode: "navigation"(省略outputDirPath以使用默认临时文件,或指定工作区内的目录)。 - 从返回的
report.json路径中提取具体的 Cookie 审计结果,而不将完整报告加载到上下文中:node -e "const r=require('<path/to/report.json>'); const a=r.audits['third-party-cookies']; console.log(JSON.stringify({score: a?.score, displayValue: a?.displayValue, items: a?.details?.items}))"
- 运行
4. 客户端 Cookie 检查与操作
对于客户端可访问的非 HttpOnly Cookie(例如 UI 偏好设置、非敏感功能标志):
- 读取 Cookie 和属性:
- 使用现代异步 Cookie Store API:
async () => await cookieStore.getAll(); - 不安全 HTTP 来源的回退方式:
() => document.cookie。
- 使用现代异步 Cookie Store API:
- 设置 / 修改 Cookie:
- 通过
cookieStore设置客户端 Cookie:async () => await cookieStore.set({ name: 'theme', value: 'dark', expires: Date.now() + 86400000, sameSite: 'lax', });
- 通过
- 删除 Cookie:
- 清除客户端 Cookie:
async () => await cookieStore.delete('theme');
- 清除客户端 Cookie:
故障排除
cookieStore未定义:cookieStore需要安全上下文(https://、localhost或127.0.0.1)。对于非安全 HTTP 来源,请使用() => document.cookie,或通过 HTTPS 进行测试。evaluate_script返回空结果 / 未解析的 Promise:cookieStore方法是异步的。始终使用async () => await cookieStore.getAll()包装调用。- JavaScript 中看不到 Cookie:该 Cookie 标记为
HttpOnly。触发网络请求,并调用get_network_request查看Cookie请求头。 - 通过 JavaScript 删除 Cookie 未成功:该 Cookie 为
HttpOnly,或需要匹配Path和Domain参数。使用new_page创建一个新的isolatedContext,以获得干净的环境。 - 响应中设置了 Cookie,但请求未发送该 Cookie:
- 确认页面是否使用
http://,而 Cookie 是否指定了Secure。 - 检查
Domain是否限制了子域名。 - 检查
list_console_messages(types: ["issue"]),查看浏览器拒绝 Cookie 的原因。
- 确认页面是否使用
- 残留 Cookie 污染审计结果:运行合规测试时,始终使用带有唯一
isolatedContext的new_page,并在完成后调用close_page。