了解 JSON Web 令牌 (JWT) 以实现安全信息共享

2025-05-28

了解 JSON Web 令牌 (JWT) 以实现安全信息共享

在软件架构领域,尤其是在处理多方安全身份验证/授权时,一个健壮的身份证明共享机制至关重要。JSON Web Token (JWT) 🔏 是最安全、使用最广泛的方法之一。

在这篇博客中,我们将深入探讨 JWT 是什么、它们如何工作以及为什么它们是安全数据传输的绝佳选择。

什么是 JSON Web 令牌 (JWT)?

JSON Web Token (JWT) 是一项开放标准 (RFC 7519),它定义了一种紧凑且自包含的方式,以 JSON 对象的形式在各​​方之间安全地传输信息。由于这些信息经过数字签名,因此可以验证和信任。JWT 可以使用密钥(采用 HMAC 算法)或公钥/私钥对(使用 RSA 或 ECDSA)进行签名。

为什么要使用 JWT?

JWT 是无状态的,这意味着服务器不需要在会话中存储令牌信息。这种无状态特性使得 JWT 具有可扩展性,非常适合客户端-服务器应用程序和分布式系统。以下是 JWT 受到青睐的一些主要原因:

  1. 安全性:JWT 经过数字签名,确保数据不被篡改。
  2. 可扩展性:JWT 是无状态的,不需要服务器端存储,这使其成为分布式系统的理想选择。
  3. 紧凑:JWT 紧凑,可以通过 URL、POST 参数或 HTTP 标头轻松发送。
  4. 自包含:JWT 的有效负载包含目标用户所需的所有信息,无需多次查询数据库。

Jwt

JWT 的结构

JWT 由三部分组成:Header、Payload 和 Signature。这些部分之间用点 (.) 分隔。



Header.Payload.Signature


Enter fullscreen mode Exit fullscreen mode

让我们分解一下每个组件:

1️⃣ 标题

标头通常由两部分组成:令牌类型(即 JWT)和正在使用的签名算法(例如 HMAC、SHA256 或 RSA)。

例子:



{
  "alg": "HS256",
  "typ": "JWT"
}


Enter fullscreen mode Exit fullscreen mode

然后对该 JSON 对象进行 Base64Url 编码以形成 JWT 的第一部分。

2️⃣ 有效载荷

有效载荷包含声明。声明是关于实体(通常是用户)及其附加数据的声明。声明分为三种类型:注册声明、公开声明和私有声明。

  • 注册声明:这些是一组预定义的声明,不是强制性的但建议使用,例如iss(发行者)、exp(到期时间)、sub(主题)、aud(受众)等。
  • 公共声明:这些可以随意定义,但应该是抗冲突的或具有命名空间的。
  • 私人声明:这些是自定义声明,用于在同意使用它们的各方之间共享信息。

例子:



{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}


Enter fullscreen mode Exit fullscreen mode

这个JSON对象也是经过Base64Url编码,形成JWT的第二部分。

3️⃣签名

要创建签名部分,您必须获取已编码的标头、已编码的有效负载、密钥以及标头中指定的算法。签名用于验证 JWT 的发送者身份,并确保消息在传输过程中未被篡改。

例如,如果您想使用 HMAC SHA256 算法,则签名将像这样创建:



HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)


Enter fullscreen mode Exit fullscreen mode

然后对签名进行 Base64Url 编码并形成 JWT 的第三部分。

做

JWT 的工作原理

当客户端想要访问受保护的资源时,它会将 JWT 添加到 HTTP 请求的授权标头中,类似于 Bearer Token。服务器会执行一系列步骤来验证 JWT。如果所有验证步骤都通过,服务器就会认定 JWT 有效,并授予对请求资源的访问权限。

步骤如下:

1️⃣解码 JWT:服务器解码 JWT 以提取标头和有效负载。

解码
2️⃣验证签名:服务器通过将签名算法重新应用于标头、有效负载和密钥来验证签名。如果重新计算的签名与 JWT 中的签名匹配,则表明令牌未被篡改。

3️⃣检查到期时间:服务器检查有效负载中的到期时间,以确保令牌未过期。

4️⃣附加检查:根据应用程序的要求,服务器可能会执行附加检查,例如验证令牌颁发者或根据撤销令牌列表检查令牌。

Jwt

真实场景中的 JWT

让我们探索 2024 年 JWT 的一些实际应用:

  1. 单点登录 (SSO) 奇境
    想象一下,只需登录一次公司生态系统,即可无缝访问多项服务。JWT 让这个梦想成为现实,它可以安全地跨域传递您的身份验证状态。

  2. 微服务编排
    在微服务领域,JWT 充当着完美的信使角色。它们在服务之间传递身份验证和授权信息,确保通信安全高效。

  3. 物联网设备身份验证
    当您的智能冰箱与智能烤面包机对话时(是的,我们将在 2024 年实现这一点),JWT 可确保只有授权的设备才能交换数据。

  4. 无服务器功能授权
    随着无服务器架构的兴起,JWT 提供了一种无状态的方式来授权功能调用,而无需持久会话。

2024 年 JWT 最佳实践

  1. 保密,保障安全
    保护您的签名密钥,如同保护唯一的密钥环。使用密钥管理服务并定期轮换密钥。

  2. 不要过度打包你的令牌
    保持有效载荷较小。JWT 不能替代数据库!

  3. 设置合理的到期时间
    短期令牌(几分钟,而不是几天)可最大限度地降低令牌被盗用的风险。

  4. 实现令牌撤销
    使用令牌黑名单或 Redis 缓存在需要时使令牌无效。

  5. 始终使用 HTTPS
    始终通过加密连接传输 JWT。无一例外!

JWT 实践

JWT 用途广泛,可用于各种场景。例如,它们通常用于授权后端 API,同时保持相同的权限设置。许多现代应用程序(包括 Appwrite)都支持基于 JWT 的身份验证,以确保安全高效的授权流程。

结论

JSON Web Tokens (JWT) 是现代 Web 应用程序中用于安全共享信息的强大工具。它提供了一种紧凑、独立且安全的数据传输方式,使其成为从无状态身份验证到 API 安全等各种用例的绝佳选择。通过理解和实现 JWT,开发人员可以增强其应用程序的安全性和可扩展性。

文章来源:https://dev.to/vyan/understanding-json-web-tokens-jwt-for-secure-information-sharing-5c3a
PREV
使用 Vue 和 Markdown 创建简单博客
NEXT
如何在 Node.js(Express.js)中构建后端代码