CoderTools

JWT编解码器

安全地解码、验证和生成JWT令牌

解码后的JWT

头部


                        

载荷


                        

签名


                        

JSON Web Tokens (JWT) 权威指南

什么是 JWT (JSON Web Token)?

JSON Web Token (JWT) 是一个开放标准 (RFC 7519),定义了一种紧凑且自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。这些信息可以被验证和信任,因为它们经过了数字签名。JWT 可以使用密钥(HMAC 算法)或公钥/私钥对(RSA 或 ECDSA)进行签名。由于采用了 Base64Url 编码,物体积小,可以通过 URL、POST 参数或 HTTP 头部发送。

JWT 的结构

一个 JWT 技术上由三部分组成,用点 (.) 分隔,分别是:

xxxxx.yyyyy.zzzzz
  • 头部 (Header) : 头部通常由两部分组成:令牌的类型 (即 JWT) 和所使用的签名算法,例如 HMAC SHA256 或 RSA。
  • 载荷 (Payload) : 载荷包含声明 (Claims)。声明是关于实体(通常是用户)和其他数据的陈述。声明有三种类型:注册的、公开的和私有的声明。
  • 签名 (Signature) : 要创建签名部分,您必须获取编码后的头部、编码后的载荷、一个密钥、头部中指定的算法,并对其进行签名。签名用于验证消息在传输过程中未被更改。

支持的算法

本工具支持解码和验证所有标准算法,以及生成对称加密算法的令牌:

  • HS256: HS256 (HMAC SHA-256): 对称加密。需要共享密钥。速度快,常用于微服务。
  • HS384: HS384 (HMAC SHA-384): 对称加密。使用 384 位哈希,抗碰撞性更高。
  • HS512: HS512 (HMAC SHA-512): 对称加密。使用 512 位哈希。对称签名中最安全的。
  • RS256: RS256 (RSA SHA-256): 非对称加密。使用私钥签名,公钥验证。非常适合公共 API。
  • RS384: RS384 (RSA SHA-384): 非对称加密。比 RS256 哈希更强。
  • RS512: RS512 (RSA SHA-512): 非对称加密。RSA 签名的最高安全级别。

理解 JWT 声明 (Claims)

声明是关于主体的断言信息。标准的注册声明包括:

  • iss (Issuer): iss (Issuer): 签发人,标识颁发 JWT 的实体。
  • sub (Subject): sub (Subject): 主体,标识 JWT 所面向的用户或实体。
  • aud (Audience): aud (Audience): 受众,标识 JWT 预期的接收者。
  • exp (Expiration Time): exp (Expiration Time): 过期时间,标识 JWT 不再被接受的时间点。
  • nbf (Not Before): nbf (Not Before): 生效时间,标识在此时间之前 JWT 不可被接受。
  • iat (Issued At): iat (Issued At): 签发时间,标识 JWT 生成的时间。
  • jti (JWT ID): jti (JWT ID): 唯一标识符,用于标识特定的 JWT。

何时使用 JWT?

  • 授权 (Authorization): 这是最常见的场景。用户登录后,后续的每个请求都会包含 JWT,允许用户访问该令牌许可的路由、服务和资源。
  • 信息交换: JWT 是在各方之间安全传输信息的好方法。因为 JWT 可以被签名,您可以确信发送者是他们所声称的人。
  • 无状态会话: 与服务器端会话不同,JWT 包含所有必要的用户数据,减少了数据库查询会话的压力。
  • 跨域单点登录 (SSO): 因为 JWT 是无状态且紧凑的,非常易于在不同域之间传递以实现 SSO。
  • API 安全: 保护 RESTful API,服务器无需维护会话状态。

关键安全最佳实践: 1. 此时把敏感数据(如密码)放入载荷中;它是可被任何人读取的(Base64 解码)。2. 始终检查签名。3. 使用 'exp'(过期)声明限制令牌寿命。4. 使用 HTTPS 防止令牌被拦截。5. 安全存储令牌(推荐使用 HttpOnly Cookie 而非 LocalStorage 以防止 XSS 攻击)。

参考资料

常见问题 (FAQ)

JWT 是加密还是编码?

标准的 JWT 是经过编码和签名的,而不是加密的。载荷中的数据是 Base64Url 编码的,这意味着任何人都可以解码并读取它。签名确保数据未被篡改,但不会隐藏数据。如果需要隐藏数据,您需要使用 JWE (JSON Web Encryption)。

客户端应该把 JWT 存在哪里?

对于 Web 应用,通常认为将 JWT 存储在 `HttpOnly` Cookie 中比 `localStorage` 更安全,因为 Cookie 对跨站脚本 (XSS) 攻击免疫。但是,Cookie 容易受到 CSRF 攻击,需要单独防御。

如果不慎泄露了 JWT 会怎样?

如果 JWT 被盗,窃贼可以在令牌过期前冒充用户。这就是为什么必须使用较短的过期时间 (`exp`) 并实施令牌撤销策略(如黑名单 jti)或使用带有轮换机制的刷新令牌。

此工具会将我的密钥发送到服务器吗?

不会。此工具完全在客户端运行。您的私钥、密钥和令牌数据永远不会离开您的浏览器。所有加密操作均使用 JavaScript 库在本地执行。

我可以手动修改载荷吗?

您可以在本地修改载荷部分,但这样做会导致基于原始密钥的签名失效。除非您用正确的密钥/私钥重新签名,否则服务器将拒绝该令牌。

HS256 和 RS256 有什么区别?

HS256 是对称算法(签名和验证使用同一个共享密钥)。RS256 是非对称算法(使用私钥签名,使用公钥验证)。RS256 更适合分布式系统,其中许多服务需要验证令牌但不能生成令牌。

快捷菜单

暂无访问记录