了解 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 受到青睐的一些主要原因:
- 安全性:JWT 经过数字签名,确保数据不被篡改。
- 可扩展性:JWT 是无状态的,不需要服务器端存储,这使其成为分布式系统的理想选择。
- 紧凑:JWT 紧凑,可以通过 URL、POST 参数或 HTTP 标头轻松发送。
- 自包含:JWT 的有效负载包含目标用户所需的所有信息,无需多次查询数据库。
JWT 的结构
JWT 由三部分组成:Header、Payload 和 Signature。这些部分之间用点 (.) 分隔。
Header.Payload.Signature
让我们分解一下每个组件:
1️⃣ 标题
标头通常由两部分组成:令牌类型(即 JWT)和正在使用的签名算法(例如 HMAC、SHA256 或 RSA)。
例子:
{
"alg": "HS256",
"typ": "JWT"
}
然后对该 JSON 对象进行 Base64Url 编码以形成 JWT 的第一部分。
2️⃣ 有效载荷
有效载荷包含声明。声明是关于实体(通常是用户)及其附加数据的声明。声明分为三种类型:注册声明、公开声明和私有声明。
- 注册声明:这些是一组预定义的声明,不是强制性的但建议使用,例如
iss
(发行者)、exp
(到期时间)、sub
(主题)、aud
(受众)等。 - 公共声明:这些可以随意定义,但应该是抗冲突的或具有命名空间的。
- 私人声明:这些是自定义声明,用于在同意使用它们的各方之间共享信息。
例子:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
这个JSON对象也是经过Base64Url编码,形成JWT的第二部分。
3️⃣签名
要创建签名部分,您必须获取已编码的标头、已编码的有效负载、密钥以及标头中指定的算法。签名用于验证 JWT 的发送者身份,并确保消息在传输过程中未被篡改。
例如,如果您想使用 HMAC SHA256 算法,则签名将像这样创建:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
然后对签名进行 Base64Url 编码并形成 JWT 的第三部分。
JWT 的工作原理
当客户端想要访问受保护的资源时,它会将 JWT 添加到 HTTP 请求的授权标头中,类似于 Bearer Token。服务器会执行一系列步骤来验证 JWT。如果所有验证步骤都通过,服务器就会认定 JWT 有效,并授予对请求资源的访问权限。
步骤如下:
1️⃣解码 JWT:服务器解码 JWT 以提取标头和有效负载。
2️⃣验证签名:服务器通过将签名算法重新应用于标头、有效负载和密钥来验证签名。如果重新计算的签名与 JWT 中的签名匹配,则表明令牌未被篡改。
3️⃣检查到期时间:服务器检查有效负载中的到期时间,以确保令牌未过期。
4️⃣附加检查:根据应用程序的要求,服务器可能会执行附加检查,例如验证令牌颁发者或根据撤销令牌列表检查令牌。
真实场景中的 JWT
让我们探索 2024 年 JWT 的一些实际应用:
-
单点登录 (SSO) 奇境:
想象一下,只需登录一次公司生态系统,即可无缝访问多项服务。JWT 让这个梦想成为现实,它可以安全地跨域传递您的身份验证状态。 -
微服务编排:
在微服务领域,JWT 充当着完美的信使角色。它们在服务之间传递身份验证和授权信息,确保通信安全高效。 -
物联网设备身份验证:
当您的智能冰箱与智能烤面包机对话时(是的,我们将在 2024 年实现这一点),JWT 可确保只有授权的设备才能交换数据。 -
无服务器功能授权:
随着无服务器架构的兴起,JWT 提供了一种无状态的方式来授权功能调用,而无需持久会话。
2024 年 JWT 最佳实践
-
保密,保障安全:
保护您的签名密钥,如同保护唯一的密钥环。使用密钥管理服务并定期轮换密钥。 -
不要过度打包你的令牌:
保持有效载荷较小。JWT 不能替代数据库! -
设置合理的到期时间:
短期令牌(几分钟,而不是几天)可最大限度地降低令牌被盗用的风险。 -
实现令牌撤销:
使用令牌黑名单或 Redis 缓存在需要时使令牌无效。 -
始终使用 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