解码 | 检查 | 验证

> 解码 | 检查 | 验证 <

// 即时解码和检查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算法
HS256HMAC + SHA-256
HS512HMAC + SHA-512
RS256RSA PKCS#1 v1.5 + SHA-256
PS256RSASSA-PSS + SHA-256
ES256ECDSA P-256 + SHA-256
EdDSAEd25519

// 在代码中验证 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。

// 其他语言