从日志里批量做 JWT 去重:令牌去重与会话审计实操
讲清楚怎么把日志里反复出现的 JWT 令牌做去重统计,数出独立会话数,清理审计样本,而且全程在浏览器本地处理,不把敏感令牌发出去。
从日志里批量做 JWT 去重,数清独立会话
排查一次接口异常时,我从网关日志里 grep 出了几万行带 Authorization 头的记录。问题是同一个用户的同一个令牌在一分钟内被重放了几十次,日志里全是它。我想知道的不是请求总数,而是真正发生了多少次独立登录。这种时候,把 JWT 令牌做一次去重,比任何监控面板都直接。
为什么日志里的 JWT 需要先去重
应用日志、网关访问日志、客服工单转发的报错截图,这些来源里 JWT 令牌会以惊人的密度重复出现。一个长轮询客户端可能每三秒带着同一个令牌打一次接口,八小时下来就是上万条相同记录。如果你直接拿原始行数当指标,得到的会是请求量,而不是会话量。
去重的判定规则要先说清楚:这里算重复的标准是完整令牌字符串完全相同。JWT 由三段 base64url 拼成,只要 header.payload.signature 三段一字不差,就折叠成同一条。哪怕只差一个字符,签名段末尾多一位,都会被当成两条不同的令牌保留。这种严格匹配避免了把两个真实不同的会话错误地合并掉。
一个真实的去重统计例子
回到那次排查。我把 grep 出来的令牌列贴进 JWT Token去重工具,原始 18420 行。去重之后,规范化输出只剩 213 条唯一令牌,每条后面带着重复次数和首次出现的行号。
最吵的那条令牌单独重复了 1106 次,对应一个忘了设退避的脚本客户端。把它和另外几条高频项排除后,真正的独立会话其实只有两百出头。这个 213 这个数,就是我要写进事故复盘里的"受影响独立会话数"。如果不去重,我会以为有近两万个会话受影响,结论完全跑偏。
带行号这一点在审计里很关键。每条唯一令牌都记着它第一次出现在第几行,我要回原始日志核对上下文时,直接跳过去就行,不用再全文搜一遍。
清理审计样本,把无效项单独留住
日志清洗常遇到坏数据:截断的令牌、只剩两段的残缺串、复制网页时混进来的隐藏空白。这个工具不会悄悄把它们扔掉,而是把无法安全比对的无效项单独列在报告里,标上原因。
这点对审计意义不小。一份提交给安全团队的样本,如果你把解析不了的行直接丢弃,数字就对不上账了:输入一千条,输出八百条,中间两百条去哪了说不清。保留无效项,意味着总数始终可追溯,坏数据是被显式标记的,而不是凭空消失的。需要交接时,把带行号的 CSV 或 Markdown 下载下来,而不是只复制最终那串列表,审计线索才完整。
令牌敏感,处理必须留在本地
JWT 不是普通文本。它的 payload 段里常带着用户 ID、租户标识、权限范围,签名段更是直接关系到能不能伪造身份。把这种东西贴进一个会上传的在线工具,等于把活跃凭证交给了第三方服务器。
所以这个工具的解析、校验、去重、导出全部在当前浏览器标签页里跑。拿每个令牌跟其余逐一比对的那套去重匹配,也在本地完成,没有哪一条令牌会被送出去做比对。上传的本地文件通过 File API 在标签页内读取,不进任何服务器。对 JWT 这类敏感类型,输出还会做脱敏,既能看到校验结果,又不至于把完整凭证暴露在屏幕和下载文件里。
和上下游工具配合
去重往往只是清洗链条里的一环。如果你手上的日志还是混着别的文本,先用 JWT Token提取 把令牌单独抽出来,再丢进去重工具,结果会干净很多。需要按统一格式拉平再比对的,可以接 JWT 规范化;只想确认格式合法性而不去重的,走列表校验那条更合适。
我自己的固定做法是:提取 → 去重 → 导出带行号的 CSV。三步走完,一份能直接交给安全团队复核的样本就成型了,从头到尾没有一条令牌离开过我的浏览器。
Made by Toolora · Updated 2026-06-13