logo
GeekFormat

Set-Cookie 解析器

Set-Cookie 解析

按行粘贴 Set-Cookie 响应头,查看属性、潜在风险和 SameSite / Secure 组合是否合理。

Cookie 属性卡片

2 条 Set-Cookie
#1sessionabc123
path/
httponly(标记)
secure(标记)
samesiteLax
未发现明显属性组合问题
#2preview1
max-age600 (10m 0s)

setCookieParser.attr.maxAgeHint

samesiteNone
secure(标记)
setCookieParser.warn.missingHttpOnlysetCookieParser.warn.missingPath

JSON 预览

[
  {
    "index": 0,
    "raw": "session=abc123; Path=/; HttpOnly; Secure; SameSite=Lax",
    "name": "session",
    "value": "abc123",
    "decodedValue": "abc123",
    "attributes": [
      {
        "key": "path",
        "value": "/"
      },
      {
        "key": "httponly",
        "value": null
      },
      {
        "key": "secure",
        "value": null
      },
      {
        "key": "samesite",
        "value": "Lax"
      }
    ],
    "attributeMap": {
      "path": "/",
      "httponly": true,
      "secure": true,
      "samesite": "Lax"
    },
    "warnings": []
  },
  {
    "index": 1,
    "raw": "preview=1; Max-Age=600; SameSite=None; Secure",
    "name": "preview",
    "value": "1",
    "decodedValue": "1",
    "attributes": [
      {
        "key": "max-age",
        "value": "600"
      },
      {
        "key": "samesite",
        "value": "None"
      },
      {
        "key": "secure",
        "value": null
      }
    ],
    "attributeMap": {
      "max-age": "600",
      "samesite": "None",
      "secure": true
    },
    "warnings": [
      "warn.missingHttpOnly",
      "warn.missingPath"
    ]
  }
]

粘贴Set-Cookie头,浏览器为什么不收Cookie立刻有答案。

相关推荐

适用场景

  • 浏览器拒绝写入Cookie时,快速定位是SameSite策略问题、缺Secure标志,还是Path/Domain不匹配导致
  • 第三方登录/SSO/嵌入iframe场景下Cookie被浏览器拦截,检测SameSite=None是否正确搭配Secure
  • 安全审计时批量检查接口返回的Cookie是否全部设置HttpOnly防止XSS窃取,是否设置Secure防止HTTP明文传输
  • 使用__Host-/__Secure-前缀Cookie时验证是否满足RFC 6265bis的强制要求,避免被浏览器静默丢弃
  • 调试CHIPS(Partitioned Cookie)三方Cookie分区方案时,确认Partitioned与Secure同时声明
  • 服务端设置Max-Age/Expires时确认数值有效,避免因时钟偏差或Max-Age=0导致Cookie立即过期
  • 对比不同环境(开发/测试/生产)的Set-Cookie头差异,排查开发环境正常生产环境Cookie丢失的诡异问题
  • 从DevTools或curl响应中整段复制响应头,无需手动去除Set-Cookie:前缀,工具自动识别剥离
  • 写接口文档或WASM/WebWorker请求相关Bug时,把解析后的JSON结果直接贴到文档中说明Cookie结构

功能特点

  • 多Cookie独立解析:每行Set-Cookie独立成卡片,编号展示名称、值与URL解码值,一眼分清哪个Cookie有问题
  • 14种属性安全检测:自动识别SameSite=None缺Secure、SameSite值非法、Partitioned缺Secure、缺HttpOnly、缺Path、缺SameSite、__Host-前缀违规、__Secure-前缀缺Secure、Max-Age无效/为0、Domain点号开头、Expires未配Max-Age等常见错误
  • 全属性完整拆解:SameSite、Secure、HttpOnly、Path、Domain、Expires、Max-Age、Partitioned逐项列出,flag型属性与带值属性一目了然
  • Max-Age自动换算:将秒数自动换算为天/小时/分钟/秒的人类可读时间,例如Max-Age=2592000会显示为30d
  • URL解码值自动显示:Cookie值含%XX编码时自动展示解码后原文(如sessionID%3Dabc→sessionID=abc),绿色箭头标识
  • RFC 6265bis前缀检测:严格校验__Host-和__Secure-前缀Cookie的合规要求,包括Path=/、禁Domain、必设Secure
  • 原始头一键复制:所有解析的Cookie原始行汇总复制,方便粘贴到邮件、Issue、文档同步给团队
  • JSON结构化预览:解析结果支持JSON格式输出,包含name/value/decodedValue/attributes/attributeMap/warnings完整字段,可直接用于脚本和测试用例
  • 全本地处理:Set-Cookie内容在浏览器本地解析,不上传任何服务器,避免泄露敏感Session、Token等信息
  • 智能警告徽章:每种问题用橙色警告徽章标出具体原因,无需对照RFC逐条查文档
  • 多行批量输入:一次粘贴整段响应头(如从Chrome DevTools Network面板复制),自动剥离Set-Cookie:前缀逐行解析
  • 支持带引号和分号的值:正确处理RFC规范中带双引号的Cookie值和Expires日期中的分号,不会错误拆分

使用方法

  1. 打开浏览器DevTools的Network面板,找到目标请求,在Response Headers区域复制Set-Cookie的内容(支持多行,一次复制所有Cookie)
  2. 将复制的Set-Cookie响应头粘贴到输入区,每行一条Cookie(无需手动删除Set-Cookie:前缀,工具会自动剥离)
  3. 工具实时解析,顶部显示识别到的Set-Cookie条数,下方每个Cookie独立为一张属性卡片
  4. 卡片头部显示编号、Cookie名、原始值,若值包含URL编码会在绿色箭头后显示解码后的值
  5. 卡片主体按SameSite、Secure、HttpOnly、Path、Domain、Max-Age、Expires、Partitioned等逐项展示属性,Max-Age会自动附括号换算易读时间
  6. 卡片底部显示检查结果:橙色警告徽章标注具体问题(每条问题都有明确中文说明),绿色徽章表示未发现明显问题
  7. 需要对照服务端配置时点击「复制原始头」把全部原始Set-Cookie行复制出来;需要程序化处理时查看「JSON预览」

常见问题

为什么 Set-Cookie 头设置成功了但浏览器没有保存我的Cookie?

这是最常见的问题,浏览器不会主动报错,而是静默丢弃不合规的Cookie。常见原因有:SameSite=None缺少Secure、Secure Cookie在HTTP页面设置(localhost例外)、__Host-/__Secure-前缀不满足约束、Domain/Path不匹配、超过4KB大小限制、Max-Age为0或负数。建议先把Set-Cookie粘贴到本工具,查看警告徽章定位具体原因,再打开Chrome DevTools → Application → Cookies,在对应域名下查看是否有黄色警告三角形,悬停可看到具体拒绝原因。

SameSite 的 Strict、Lax、None 到底什么区别?什么时候用哪个?

Strict完全不允许跨站发送,最安全但用户从外站链接点进来会显示未登录,适合支付/改密等敏感操作Cookie。Lax是Chrome 80+的默认值,允许顶级GET导航跳转时携带(点击外站链接跳回你网站),但iframe/img/script/XHR/POST表单等子资源不携带,是大部分场景的推荐值。None允许所有跨站场景发送(用于SSO单点登录、三方嵌入iframe、跨站API调用),但必须同时设置Secure,否则浏览器直接拒绝。

为什么 SameSite=None 必须配 Secure?

这是Chrome从80版本(2020年2月)开始强制执行的规则,Firefox、Edge、Safari也都跟进了。因为SameSite=None明确允许跨站发送Cookie,攻击者更容易在跨站场景发起CSRF或窃听,必须配合Secure(HTTPS加密传输)来降低风险。如果你的SameSite=None Cookie在HTTP下设置,浏览器会直接丢弃而不存储。本工具会检测SameSite=None缺Secure的组合并标红警告。

Max-Age 和 Expires 用哪个?有什么区别?

优先用Max-Age。Max-Age是相对时间(多少秒后过期),不依赖客户端时钟,浏览器收到后开始倒计时;Expires是绝对时间点,依赖用户电脑本地时间(用户把时钟改到1970年Cookie就立即过期)。当两者同时存在时Max-Age优先级更高(RFC 6265明确规定)。如果都不设置,Cookie变成「会话Cookie」,浏览器关闭即失效。本工具会对设置了Expires但没设Max-Age的情况给出提示,建议补Max-Age。注意Max-Age单位是秒不是毫秒。

Path=/ 和不设置 Path 有什么区别?

Path决定了浏览器在哪些URL路径的请求中会携带这个Cookie。不设置Path时,浏览器默认使用「响应URL去掉最后一段后的路径」,比如从/api/user/login设置Cookie,默认Path是/api/user/,那么/路径和/order/下的请求不会带这个Cookie。显式设置Path=/可以让Cookie对整个站点生效。注意Path匹配是前缀匹配,Path=/api也会匹配/api/、/api/user、/api/v2/abc等。__Host-前缀Cookie强制要求Path=/。

Domain 开头带点(比如 .example.com)和不带点有什么区别?

在现代浏览器(Chrome、Firefox、Edge、Safari近期版本)中两者已经等价,都会让Cookie对example.com及其所有子域(a.example.com、b.c.example.com)生效。点号开头是RFC 2109时代的旧写法,RFC 6265已经明确忽略前导点。不过为了可读性推荐写不带点的形式。本工具会对Domain带前导点的情况给出提示(不是错误,但属于历史遗留写法)。注意:不设置Domain时Cookie仅对当前主机生效(子域不会带),设置Domain后会对子域生效。

__Host- 和 __Secure- 前缀是什么?不写前缀可以吗?

这是RFC 6265bis引入的Cookie名安全前缀,用来给高安全Cookie加硬约束:浏览器看到Cookie名以__Host-开头时,会强制要求必须同时设置Secure、Path=/、不能设置Domain,任一条件不满足就直接拒绝存储;__Secure-前缀要求必须设置Secure,其他属性可配。不写前缀也可以工作(大部分Cookie都不用前缀),但对于会话标识、授权Token等高安全Cookie强烈推荐使用__Host-前缀,因为它能防止子域/路径级别的Cookie注入攻击。本工具会自动检测两种前缀的合规性。

HttpOnly Cookie 真的安全吗?防止XSS和CSRF吗?

HttpOnly能防止JavaScript通过document.cookie读取Cookie值,是<strong>缓解XSS窃取会话</strong>的重要防线,但不是万能的:XSS攻击者仍然可以在用户浏览器中发起请求(请求自动带Cookie)执行操作(这是CSRF范畴);HttpOnly也不能防御CSRF攻击(需要SameSite或CSRF Token配合)。HttpOnly+Secure+SameSite=Lax/Strict三件套同时使用才能达到基础安全水位。敏感Cookie(session、JWT、access_token)必须HttpOnly,非必要不要给前端JS读。本工具对缺少HttpOnly的Cookie会标警告。

Partitioned(CHIPS)Cookie 是什么?什么时候需要用?

Partitioned是Chrome为应对第三方Cookie淘汰推出的新属性,全称为Cookies Having Independent Partitioned State(CHIPS)。传统三方Cookie(比如广告/嵌入服务在多个站点设置的Cookie)是全局共享的,会被用来跨站跟踪用户。加了Partitioned后,浏览器会按顶级站点分别存储该三方Cookie:用户在A站看到的三方Cookie和B站看到的完全独立,不能跨站共享身份。使用场景:嵌入式视频/地图/支付组件、三方客服插件、跨站SSO嵌入iframe。使用Partitioned必须同时设置Secure,推荐配合__Host-前缀使用。

一个Cookie最大能存多少?每个域名能放多少个?

根据RFC 6265,浏览器至少支持每个Cookie 4096字节(包含名称、值和属性),主流浏览器(Chrome/Firefox/Safari/Edge)都按这个上限执行,超出部分会被静默截断或丢弃。数量限制因浏览器而异:Chrome每个域名约180个,Firefox约150个,Safari约600个(且受ITP七天清理策略影响),超出后浏览器会按LRU策略淘汰最旧的Cookie。建议Cookie存储会话标识即可,不要把大段业务数据放Cookie里(业务数据放localStorage或服务端Session)。

支持从Chrome DevTools直接复制Set-Cookie来解析吗?需要手动去前缀吗?

完全支持,无需手动处理。你可以在Chrome DevTools → Network面板点击目标请求,在Response Headers区域右键Set-Cookie的值直接复制(多行时Ctrl/⌘+点击多选或整段复制),粘贴到本工具输入区即可。工具会自动剥离每行开头的Set-Cookie:前缀(不区分大小写),自动处理行首行尾空白,正确处理Expires日期中包含的逗号、分号等特殊字符,也能正确处理带双引号的Cookie值。

Cookie 值中的中文或特殊字符为什么会变成 %XX 形式?

RFC 6265要求Cookie值只能使用ASCII字符集中的一个安全子集,不能直接包含中文、空格、逗号、分号等。很多服务端框架在设置Cookie时会自动对非ASCII字符做URL编码(encodeURIComponent/Percent-encoding),例如「你好」会编码为%E4%BD%A0%E5%A5%BD。浏览器回传时也保持编码形式。本工具检测到值含%XX编码时,会在原始值旁用绿色箭头自动展示decodeURIComponent解码后的原文,方便你查看真实内容。

Set-Cookie 和 Cookie 请求头有什么区别?

两者是完全不同方向的头:Set-Cookie是响应头(服务器→浏览器),只在响应中出现,可以出现多次,每次设置一个Cookie,包含完整属性(Secure/HttpOnly/Path/Domain等);Cookie是请求头(浏览器→服务器),每次请求只会出现一次,里面是当前匹配作用域的所有Cookie的扁平name=value对(name1=v1; name2=v2),完全不包含属性信息。也就是说服务器从请求中无法知道某个Cookie是否设了HttpOnly或Secure,属性信息只有浏览器在本地存储时才保留。解析Cookie请求头请使用配套的<a href='/network/http-cookie-parser/'>Cookie请求头解析器</a>。

为什么Safari中我的Cookie过几天就消失了?

这是Safari的智能跟踪预防(ITP: Intelligent Tracking Prevention)机制在起作用。从ITP 2.1开始,如果用户7天内没有直接与该域名交互(即没有直接访问过该域名站点),Safari会清理该域名下的所有Cookie和网站数据,不管Max-Age/Expires设多长。这对第三方嵌入服务影响最大,对主站Cookie在用户持续访问下不受影响。此外Safari对第三方Cookie的限制也比Chrome严格。解决办法包括:使用Partitioned属性、通过Storage Access API请求权限、或在用户访问主站时重新刷新Cookie。本工具的故障排查章节中有更详细的Safari调试指引。

工具支持批量解析多个Set-Cookie吗?会上传Cookie内容到服务器吗?

支持批量解析。输入区支持粘贴任意多行Set-Cookie(比如一次粘贴整段响应头),每个Set-Cookie会独立编号解析,多张属性卡片分别展示各自的属性和警告。所有解析过程完全在你的浏览器本地完成(纯前端JavaScript处理),Cookie内容不会上传到任何服务器,也不会发网络请求,你粘贴的Session/Token等敏感信息不会离开你的电脑,可以放心使用。

术语表

Set-Cookie
HTTP响应头,服务器通过它指示浏览器存储Cookie,可在一个响应中出现多次。
Cookie(请求头)
HTTP请求头,浏览器自动附加的符合作用域要求的Cookie名值对列表,不含属性。
HttpOnly
Cookie属性标志。设置后JavaScript无法通过document.cookie读取该Cookie,主要防御XSS会话窃取。
Secure
Cookie属性标志。设置后浏览器仅在HTTPS(或localhost)加密连接中发送该Cookie。
SameSite
Cookie属性,控制跨站请求是否携带Cookie,取值为Strict/Lax/None。Chrome 80+默认Lax。
Max-Age
Cookie属性,指定Cookie存活秒数,优先级高于Expires,推荐使用。=0表示立即删除。
Expires
Cookie属性,指定Cookie过期的具体时间点(HTTP-date),依赖客户端时钟。
Path
Cookie属性,限定Cookie生效的URL路径前缀,默认取响应URL的目录部分。
Domain
Cookie属性,限定Cookie生效的域名。不设置时仅限当前主机,设置后对子域生效。
Partitioned(CHIPS)
Cookie属性标志,启用三方Cookie分区存储,是Chrome淘汰三方Cookie后的替代方案,须搭配Secure。
__Host-前缀
Cookie名前缀安全约束。要求必须Secure、Path=/、不得设置Domain,违反则浏览器拒绝存储。
__Secure-前缀
Cookie名前缀安全约束。要求必须设置Secure,违反则浏览器拒绝存储。
会话Cookie(Session Cookie)
不设置Max-Age和Expires的Cookie,浏览器关闭后自动删除。
第三方Cookie(Third-party Cookie)
在当前访问页面域名之外的域名下设置的Cookie,通常由广告、埋点、嵌入iframe等三方服务设置,各浏览器正在逐步限制。

SameSite 三种策略对比速查表

Set-Cookie 属性完整参考表(RFC 6265bis)

常见浏览器Set-Cookie大小与数量限制

Troubleshooting