返回
创建于
状态
公开

这是一个非常经典且重要的误区:JWT 的 Payload(负载)确实是不需要密钥就能“解密”的。

准确来说,JWT 的前两部分(Header 和 Payload)并不是加密的,而只是经过了 Base64URL 编码。任何人拿到这段字符串,都可以通过简单的解码看到里面的明文信息。


1. JWT 的结构拆解

一个 JWT 由三部分组成,用句点 . 分隔:

  1. Header(头部): 包含签名算法(如 HS256)。
  2. Payload(负载): 包含用户信息(如你提供的 email, nickname, isAdmin 等)。
  3. Signature(签名): 防止令牌被篡改的关键。

2. 为什么你能直接看到数据?

在你提供的字符串中,第二部分是: eyJ1c2VyIjp7ImlkIjoiM2U3NDVlOWItNmRhNC00NzNjLTllZmMtMWMxZDI4NTQ1MGVjIiw...

这只是 Base64URL 编码。它类似于一种“排版格式”,目的是让二进制数据能在 HTTP 传输中保持兼容,它不具备任何安全性

警告: 由于 Payload 是明文可见的,永远不要在 JWT 中存放密码、银行卡号等敏感信息。

3. 密钥的作用到底是什么?

既然大家都能看,那 JWT 还有什么用?密钥的作用在于 “验证完整性”“防篡改”

  • 生成签名: 服务器在发令牌时,会将 Header + Payload 加上一个只有服务器知道的密钥进行哈希计算,生成第三部分(Signature)。
  • 验证令牌: 当你把 JWT 发回给服务器时,服务器会用同样的算法和密钥再算一遍。如果算出来的结果和你带过来的 Signature 一致,说明这个令牌是合法的。

举个例子

如果你尝试修改 Payload 里的内容,比如把 "isAdmin": true 改成 "isAdmin": false,虽然你成功改了内容,但因为你没有服务器的密钥,你无法伪造出正确的 Signature。服务器一校验,发现签名对不上,就会拒绝这个请求。


总结

  • 读取信息: 不需要密钥(Base64 解码即可)。
  • 验证/修改信息: 必须有密钥。

安全建议: 如果你需要对 JWT 里的内容也进行加密(让别人完全看不见),你应该使用 JWE (JSON Web Encryption),但这比普通的 JWS (JWT) 复杂得多。