> 解码 | 检查 | 验证 <
// 即时解码和检查JSON Web Token(JWT)
本地处理
100%客户端JWT解码。您的令牌永远不会离开浏览器。
自动解码
粘贴或输入时自动解码JWT令牌。
完整令牌检查
查看头部、载荷和签名。检查算法和过期状态。
// 关于JWT解码
JWT结构:
JSON Web Token(JWT)由三个Base64URL编码的部分组成,用点分隔:头部.载荷.签名。头部指定算法和令牌类型。载荷包含声明(数据)。签名验证令牌的完整性。
示例:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0In0.signature → {"alg":"HS256"} + {"sub":"1234"}
常见用途:
- >调试Web应用程序中的认证令牌
- >检查OAuth 2.0和OpenID Connect令牌
- >验证令牌过期和声明
- >理解RFC 7519的JWT结构
- >检查Base64URL编码完整性
>> 常见问题
问:什么是JSON Web Token(JWT)?
答:JWT(JSON Web Token)是一个开放标准(RFC 7519),用于以JSON对象的形式在各方之间安全地传输信息。它紧凑、URL安全,广泛用于身份验证。
问:JWT的三个部分是什么?
答:JWT由三个用点分隔的部分组成:头部(算法和类型)、载荷(声明和数据)和签名(验证哈希)。每个部分都经过Base64URL编码。
问:没有密钥能解码JWT吗?
答:可以,JWT的头部和载荷可以被任何人解码,因为它们只是Base64URL编码的(未加密)。密钥仅用于验证签名。
问:JWT和基于会话的认证有什么区别?
答:会话通过会话ID cookie在服务器上存储状态。JWT是无状态的——令牌本身包含所有必要信息。
问:JWT过期如何工作?
答:JWT载荷中的exp声明以Unix时间戳指定过期时间。超过此时间后,令牌应被视为无效。
// 常见的 JWT 签名算法
头部的 alg 决定签名方式。HS* 使用共享密钥,RS*、PS*、ES* 和 EdDSA 使用密钥对。
| alg | 算法 |
|---|---|
| HS256 | HMAC + SHA-256 |
| HS512 | HMAC + SHA-512 |
| RS256 | RSA PKCS#1 v1.5 + SHA-256 |
| PS256 | RSASSA-PSS + SHA-256 |
| ES256 | ECDSA P-256 + SHA-256 |
| EdDSA | Ed25519 |
// 在代码中验证 JWT
仅解码不会验证任何内容。验证时务必明确指定允许的算法。
Node.js (jsonwebtoken) jwt.verify(token, secret, { algorithms: ['HS256'] })
Python (PyJWT) jwt.decode(token, key, algorithms=["HS256"])
PHP (firebase/php-jwt) JWT::decode($token, new Key($key, 'HS256'))
Go (golang-jwt) jwt.Parse(token, keyFunc, jwt.WithValidMethods([]string{"HS256"}))
Java (jjwt) Jwts.parser().verifyWith(key).build().parseSignedClaims(token)
>> 更多问题
问:标准声明 iss、sub、aud、exp、nbf、iat、jti 分别是什么意思?
答:iss 是签发者,sub 是主体(通常是用户 ID),aud 是目标受众,exp 是过期时间,nbf 是生效时间,iat 是签发时间,jti 是令牌唯一 ID。时间均为 Unix 秒。
问:JWT 是加密的吗?
答:常见的已签名 JWT(JWS)并未加密,只是 Base64URL 编码,任何人都能读取内容。签名只能防止篡改。不要在其中放置敏感数据,或改用加密的 JWE。
问:如何验证 JWT 的签名?
答:需要密钥:HS256 使用共享密钥,RS256/ES256 使用公钥。服务器会对 头部.载荷 重新计算签名并比对。本解码器在浏览器中运行,不会替你验证签名,请使用经过审计的库。
问:JWT 常见的安全问题有哪些?
答:常见问题:信任令牌自带的 alg(尤其是 none)、HS256 密钥过弱、未校验 exp、iss、aud、在载荷中放敏感数据,以及把长期有效的令牌存放在 localStorage。