开发与安全

看 JWT 内容前,哪些信息不能发到公开聊天里?

排查 JWT 问题时,不要把完整令牌贴进群聊、工单或公开页面;先用合成测试令牌查看结构,再只记录完成诊断所需的最少字段。

撰文: 3sec 编辑部 资料核对日期: 4 分钟阅读 1985 字

完整 JWT、Authorization: Bearer ... 请求头、Cookie 值和含真实身份信息的声明,都不应发到公开聊天、共享文档或普通工单。排查时应优先使用测试环境的合成令牌,并把可分享内容缩减为字段名、数据类型、预期值类别和错误现象。

先把“诊断需要什么”与“令牌里有什么”分开

大多数问题不需要别人拿到原始令牌。先写一张最小诊断卡,只保留环境、接口、错误码、发生时间,以及预期和实际不一致的字段类别。

例如测试接口返回 401,真正有用的信息可能是:测试环境、资源路径、服务端错误码、iss 是否来自预期发行方、aud 是否包含当前服务、exp 是否早于测试时间,以及签名验证发生在哪个组件。无需把完整 payload、用户邮箱、角色列表、租户编号和签名段一起复制到群聊。

字段值也要最小化。可以写“aud 为数组,但服务端预期字符串”,不要贴出真实租户和内部服务名;可以写“exp 已过期 12 分钟”,不要附带仍可使用的令牌。若必须复现声明结构,应由发行系统在测试环境生成短时效、合成身份的样例,不能拿生产凭证删掉几位字符后继续使用。

解码可读内容,不等于证明令牌可信

RFC 7519说明 JWT 的声明集合是 JSON,可放在签名或加密结构中。常见的签名 JWT 可以读取 header 与 payload,但签名只用于完整性和来源验证,并不会自动把声明内容隐藏起来;规范也明确提醒 JWT 可能含有需要避免向无关人员披露的信息。

打开 JWT 解码器时,当前页面要求输入恰好三段以句点分隔的紧凑文本。它会对前两段进行 base64url 解码并解析 JSON,显示第三段签名文字,还会把数字形式的 iat、exp 换算成本地时间。

这些只是查看动作。工具不会验证签名、密钥或允许的算法,也不检查 iss、aud、sub、nbf、令牌类型、撤销状态和业务授权。页面显示“有效”时,只能理解为结构可解析,而且存在数字 exp 时当前页面时钟尚未超过它;这不是密码学验证结果,也不是接口会接受该令牌的承诺。

不要把浏览器本地处理误解成无限制使用许可

当前组件的解码逻辑在页面 JavaScript 中完成,代码里没有把粘贴内容发送到站点的请求。这减少了一条传输路径,但不能控制浏览器扩展、剪贴板历史、截图工具、设备管理软件或组织的凭证政策。

因此,生产令牌仍不适合作为演示素材。使用受管设备和获准的浏览器配置,也应以发行方正式来源和团队处理流程为准。若政策要求只能在本地命令行或专用调试环境检查,就不要因为网页工具方便而绕过该要求。

相关的 Base64 编解码工具也不能验证 JWT。Base64 及 base64url 是编码方式,不是加密,更不会确认签名、发行方或受众。能把一段文字解出来,只能说明编码可解析。

分享一份“声明摘要”,而不是经过涂改的令牌

可分享的摘要应让接手者定位问题,同时无法直接拿来调用接口。把观察结果重新写成普通文字,不要复制三段令牌后用星号替换局部字符。

  • 记录 header 中相关字段的名称和类型,例如 alg: string,不附带完整签名段。
  • 记录必要声明的名称、类型与“符合/不符合预期”,真实用户值改用合成值。
  • 把时间声明换算为测试时间线,注明页面时区,不复制原始凭证。
  • 单独记录服务端验证结果,例如“签名失败”或“audience 不匹配”,不要把解码器截图当成验证证据。
  • 发送前搜索消息、附件、日志和截图,确认没有 Bearer 、Cookie、完整三段令牌或可回推身份的值。

个人信息遮蔽工具可以在一份普通文本副本中识别部分姓名、电话、身份证、邮箱和地址格式,但它不能识别所有自定义声明,也不能发现、吊销或安全清洗任意访问令牌。不要把完整 JWT 粘进去,期待遮蔽后就可以公开;最终内容仍要逐行人工确认。

已经发出真实令牌时先按事件处理

如果完整令牌已经进入群聊、工单、日志或截图,编辑原消息不代表所有副本都消失了。立即联系令牌发行方或系统负责人,按正式流程判断是否需要撤销、轮换、缩短会话、检查访问日志和通知相关人员。

不要只等待 exp 到期。服务端可能有刷新令牌、会话 Cookie、缓存或其他关联凭证,处置方式由发行系统决定。本文和通用解码器都不能给出某个系统的撤销命令。

后续验证必须回到拥有该令牌的应用。RFC 8725 的 JWT 最佳实践要求限制允许算法、验证全部密码学操作,并按场景检查发行方、受众及其他声明。只有发行方支持的库、密钥与策略才能做出接受或拒绝决定。

用发行系统完成最后一次核对

结束排查前,把合成测试令牌交给实际测试服务或获准验证器,分别记录“解码结果”和“服务端验证结果”。前者说明看到了什么结构,后者才说明该应用是否接受它。

如果页面能解析但服务端拒绝,应依次核对允许算法、密钥选择、发行方、受众、令牌类型、时间窗口、环境与撤销状态。如果页面无法解析,先确认输入是否真的是三段紧凑 JWS;加密 JWE 可能有不同段数,某些 access token 也可能只是不可读的 opaque token。

常见问题

只发 JWT 的 payload,不发签名段可以吗?

仍不建议直接发送真实 payload,其中可能有用户、租户、权限和内部系统信息。请重新写成最小字段摘要,并使用合成值。

解码器显示“有效”就代表接口会接受吗?

不代表。该显示没有验证签名、发行方、受众、撤销状态与应用策略,真正结果要以发行系统的正式验证路径为准。

把令牌中间几位改成星号后能分享吗?

不要这样处理。局部替换容易留下敏感声明,也不能得到可验证的复现样例。更安全的做法是创建合成令牌,或只分享字段名、类型和错误现象。

浏览器本地解码就没有泄露风险吗?

不能这样推断。本地处理不等于扩展、剪贴板、截图、设备策略都安全,生产凭证仍应留在获准环境中。

已经把真实令牌贴进工单怎么办?

立即按发行方的事件流程报告并评估撤销或轮换,同时检查日志与权限范围。删除可见文字只能减少后续暴露,不能证明此前没有副本。

参考资料