一、为什么要关注 JWT(jwt是什么)
作为后端与前端通信中常见的轻量级凭证,JWT(JSON Web Token)在单点登录、微服务鉴权、移动端 TOKEN 传递中被广泛使用。很多同事会问:JWT是什么?简言之,JWT 是由 Header、Payload、Signature 三部分组成的字符串,方便在无状态服务间携带用户信息和过期控制。
注意:JWT 本身并不是加密,而是签名或可选的加密;不要把敏感信息放在未加密的 Payload 中。
核心结构快速回顾
一个典型的 jwt token 形如 xxxxx.yyyyy.zzzzz,三段通过“.”分隔。前两段是 Base64URL 编码,可以在线解析查看内容,第三段是签名用于校验完整性。
简单表格帮助记忆
| 字段 | 说明 |
|---|---|
| Header | 声明签名算法(如 HS256)和类型(JWT) |
| Payload | 承载用户数据(sub、exp、iat 等),注意不可存放明文敏感信息 |
| Signature | 基于 Header+Payload 和密钥计算的签名,用于校验 TOKEN 是否被篡改 |
二、JWT在线解析与工具实践(以 nimail 示例)
遇到未知的 TOKEN,第一步经常是把它放进在线解析工具查看结构。推荐一个常用示例:nimail 的 JWT 格式工具。这个页面可以把 JWT在线解析 的三段直接以可读 JSON 展示,便于快速定位问题(过期时间、签发者、scope 等)。
实战技巧:把服务返回的 TOKEN 复制到 nimail 工具中,优先查看 exp(过期时间)与 iss/aud(签发与受众)是否符合预期。
如何判断是 jwt 解密 还是 jwt 解码
开发中常把 jwt解码 与 jwt解密 混淆:解码(decode)通常指 Base64URL 解码 Header 和 Payload,解密(decrypt)仅在使用 JWE(加密 JWT)时存在。绝大多数场景我们做的是 jwt解析 / TOKEN解析,即查看结构与签名验证。
三、用 Python 快速解析(示例代码)
下面给出一个常见的 Python 示例,展示如何在不校验签名的情况下查看 Payload(用于调试),以及如何校验签名。
# pip install pyjwt
import jwt
from jwt import InvalidSignatureError
token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMifQ.sGN..."
# 不校验签名,仅解码(调试用)
try:
payload = jwt.decode(token, options={"verify_signature": False})
print("Payload (no verify):", payload)
except Exception as e:
print("Decode error:", e)
# 校验签名(需要知道 secret 或公钥)
secret = "your-secret"
try:
payload_verified = jwt.decode(token, secret, algorithms=["HS256"]) # 会抛出异常如果签名或过期
print("Verified payload:", payload_verified)
except InvalidSignatureError:
print("Signature invalid")
except Exception as e:
print("Verify error:", e)
建议:在生产环境中请始终验证签名并校验过期时间;调试时用
verify_signature=False 可以快速查看内容,但千万不要在正式鉴权中忽略验证。常见问题速查
- Token 过期:检查 exp 字段,服务与客户端的时钟是否一致。
- Signature 无效:确认使用的密钥或公钥匹配签发方。
- 字段丢失:检查签发流程(iss/aud/sub 是否被正确设置)。
作为开发者,掌握 JWT解析 与 JWT在线解析 的基本方法,可以在调试鉴权问题时大大缩短排查时间。结合 在线工具 和上面的 Python 示例,你可以快速判断是 jwt解码(查看)还是需要进行真正的 jwt解密/签名校验。