跳到正文

解析JWT

查看JSON Web Token的头部、声明和过期时间。令牌是可用的凭据,所以这里的任何内容都不会被发送出去或存储,永远不会。

  • 绝不存储
  • 无需排队,无需等待
  • 无需注册,无水印

您的令牌绝不会离开此页面。它就在这里解析,不向任何服务器发送请求——这一点很重要,因为JWT通常是一个有效的登录凭证。页面加载完成后断开Wi-Fi,它照样能解析:没有任何数据被发送。

带着“Bearer ”前缀也没关系——会被自动忽略。

使用方法

1

粘贴令牌

带不带“Bearer ”前缀都可以。令牌只留在本页面中,不会发出任何请求。

2

查看三个部分

头部、载荷和签名分别解码并格式化。时间戳会转换成真实日期,并告诉您还剩多长时间。

3

留意警告

已过期的令牌、缺少过期时间、“none”算法以及其他问题都会被指出,并说明其含义。

哪些经过检查,哪些只是读取

除了两项日期比较之外,本页面上的一切都只是转录。头部和载荷经过Base64URL解码后显示出来;签名只是原样复制,从不处理,因为这里没有密钥,也根本不运行任何密码运算。页面所做的两项判断,都是与您自己设备时钟的算术比较——过期声明与当前时间比较,生效时间声明与当前时间比较。这里不考虑时钟偏差,而服务器检查同一个令牌时通常会留出一两分钟的余量。如果笔记本电脑的时钟快了五分钟,一个仍然有效的令牌会被显示为已过期,而令牌本身完全没有问题。

有两个解析细节决定了您实际看到的内容。时间声明只有以JSON数字形式出现时才会被读取:如果令牌的过期时间写成了字符串"1699999999",就会被视为根本没有过期时间,并收到“永不自动过期”的警告——与事实恰恰相反。另外,载荷使用浏览器自带的JSON解析器解析,而不是我们JSON工具背后那个保留全部数位的解析器,所以64位数字声明(例如主题中的雪花算法用户ID)显示时最后几位会被舍入。JWT中的标识符通常正是出于这个原因才写成字符串;如果不是字符串,请从原始载荷中读取,而不要看声明表格。

有五个部分的令牌会被视为加密的JWE而拒绝解析,这一判断仅根据部分数量作出,而不读取头部——实际上是对的,但值得知道这是一条捷径。不是三个部分的内容会被直接拒绝,载荷解码后是JSON数组或单纯字符串而不是对象的,也同样拒绝。算法为“none”时会发出警告,HS系列算法也会,因为其签名密钥是共享密钥而不是公钥。用RS、ES或PS签名的令牌不会触发任何警告,所以本页面没有提示,只代表没有发现已知的危险结构,并不代表认可。

如果您需要的是别的

这里不存储任何内容,这是本页面能够合理存在的唯一理由——但这仍然不是应该养成的习惯。隐私承诺无法靠阅读来验证:页面加载完成后断开网络,看解析工具是否照常工作,这恰恰是背后依赖服务器的工具做不到的。如果您粘贴到某个无法审查之处的令牌仍然有效,请直接更换它,而不要去琢磨它是否安全。更换只需一分钟。否则,您就得为一个仍能打开大门的凭据跟自己争论很久。如果想在电脑上而不是在浏览器标签页里读取令牌,载荷只需一行shell命令:取出以点分隔的第二个字段,用base64 -d解码,再通过管道交给jq。

当问题是令牌是否真实,而不是它写了什么时,本页面从设计上就不适用,其他所有在线解析工具也一样。验证应当在密钥所在的地方进行——在您的服务器上用所用语言的JWT库,对照签发方公布的JWKS进行检查。那只需几行代码,也是唯一有意义的答案;任何提出替您完成验证的网站,都是在索要那个您绝不应该交给网站的秘密。

常见问题

我的令牌会被发送到别处吗?

不会——对这个页面来说,这正是全部意义所在,而不只是一项功能。JWT通常是有效凭据:谁持有它,谁就能在它过期前以您的身份行事。把它粘贴到会提交给服务器的在线解析工具,就等于交出一把能用的钥匙,任何“不记录日志”的承诺都无法挽回。这个解析工具就是您眼前这个页面里的纯JavaScript。不存储任何内容,不记录任何日志,不发出任何请求。页面加载完成后,关掉Wi-Fi,它照样完全正常工作。这是您亲自验证隐私承诺的最简单方法,而不必只听我们的一面之词。

这里会验证签名吗?

不会,而且没有签名密钥,任何在线解析工具都无法诚实地做到这一点。解码和验证是完全不同的操作。解码只是把令牌从Base64还原——任何人都能对任何令牌这样做,它完全证明不了令牌是否真实。验证则意味着用签名时所用的密钥或公钥重新计算签名,而这把密钥绝不应该粘贴到任何网站上。您在这里看到的是令牌所“声称”的内容。这些声明是否可信,只有持有密钥的服务器才能回答。

我发给别人的JWT,对方能看到内容吗?

能——而且能看到全部,很多人在这一点上栽了跟头。JWT是签名的,不是加密的。头部和载荷都是Base64,这种编码不含任何秘密,所以任何截获令牌的人都能读到其中的每一项声明。签名能阻止他们“修改”令牌,却完全无法阻止他们“读取”令牌。千万不要在JWT载荷中放任何机密信息:不放密码,不放卡号,不放任何您不愿写在明信片上的个人数据。

“none”算法警告是什么意思?

表示令牌声称自己没有签名,这是本页面会报告的最严重问题之一。`alg: none`是一种有据可查的身份验证绕过手段:攻击者拿到一个真实令牌,把载荷改成自己是管理员,把算法设为“none”,删掉签名,而信任头部的库就会接受它。如今所有正规的JWT库都默认阻止这种做法,但信任`alg`的实现仍然存在。带有`alg: none`的令牌,在被证明无害之前,都应视为攻击。

怎么看过期时间?

已经替您算好了。`exp`、`iat`和`nbf`都是Unix时间戳——自1970年以来的秒数——原始数字根本看不懂。每一项都会显示为您所在时区的真实日期,并注明距今已过去多久或还剩多久;令牌过期时会直接说明,而不用您自己去推算。完全没有`exp`的令牌也会被标记:永不过期的JWT无法通过过期来撤销,只要签名密钥有效,它就一直有效。

我的令牌有五个部分,不是三个

那它就是JWE——经过加密,而不只是签名——没有解密密钥,确实无法读取其内容。页面会识别出这种结构并告诉您,而不是显示一堆乱码。五个部分意味着载荷是真正的密文,没有什么可解码的。

标准声明有哪些?

注册声明包括:`iss`签发者,`sub`主题(通常是用户ID),`aud`受众,`exp`过期时间,`nbf`生效时间(在此之前无效),`iat`签发时间,以及`jti`令牌的唯一ID。其他所有声明都由构建该系统的人自定义。输出中每个注册声明都标注了含义,您不必记住哪个三字母缩写代表什么。

小贴士: 这里只解码,不验证。JWT的签名证明令牌未被篡改,而验证签名需要签发方的密钥或公钥——这类密钥绝不应该粘贴到任何网页中。请把这里显示的一切都视为令牌的声明而非已证实的事实,并在您的服务器上进行验证。

把这个工具放到您的网站上

博客、课程页面或帮助文章均可免费使用。粘贴一段代码,访客就能直接在您的页面上使用。