简单 5 步理解 JWT (JSON Web Tokens)

翻译自:5 Easy Steps to Understanding JSON Web Tokens (JWT)

在本文中,将解释 JWT (JSON Web Tokens) 的基本原理,以及它们为什么会被使用。JWT 是确保应用程序中的信任和安全性的重要部分。JWT 允许声明 (例如用户数据)以安全的方式表示。

要解释 JWT 的工作原理,让我们从一个抽象定义开始。

一个 JWT ( JSON Web Token)是一个 JSON 对象,它在 RFC 7519 中定义为一种安全的方式来表示两方之间的一组信息。Token 有 头部、有效载荷和签名组成。

简而言之,JWT 只是一个具有如下格式的字符串:

header.payload.signature

需要指出:一个双引号的字符串实际上被认为是一个有效的 JSON 对象。

为了说明 JWT 实际使用的方式和原因,我们将使用一个简单的 3 实体示例(参见下图)。本例中的实体是用户、应用服务器和身份验证服务器。身份验证服务器将向用户提供 JWT。通过 JWT,用户可以安全地与应用程序通信。

imgimg应用程序如何使用 JWT 来验证用户的真实性。

本例中,用户使用身份验证服务器的登录系统(如用户名和密码、Facebook 登录、谷歌登录等)进入身份验证服务器。然后,身份验证服务器创建 JWT 并将其发送给用户。当用户对应用程序进行 API 调用时,用户将通过 JWT 和API 调用。在此设置中,将配置应用程序服务器,以验证传入的 JWT 是由身份验证服务器创建的(稍后将更详细地解释验证过程)。因此,当用户使用附加的 JWT 进行 API 调用时,应用程序可以使用 JWT 来验证 API 调用是否来自经过身份验证的用户。

接下来,将会更深入地进行研究 JWT,以及它是如何构造和验证的。

第一步:生成头部

JWT 的头组件包含关于如何计算 JWT 签名的信息。

头部是一个具有如下格式的 JSON 对象:

{

在这个 JSON 中,“typ” 键的值指定该对象是 一个 JWT,而 “alg” 键的值指定用于创建 JWT 签名组件的哈希算法。在我们的例子中,我们使用了 hmc - sha256 算法,一个使用密钥的散列算法来计算签名(在步骤 3 中更详细地讨论)。

第二步:生成 PAYLOAD (有效载荷)

JWT 的有效载荷组件是存储在 JWT 中的数据(此数据也称为 JWT 的“声明”)。在我们的示例中,身份验证服务器使用存储在其中的用户信息创建一个 JWT,特别是用户 ID。

{

有效载荷内的数据称为 Token 的“声明”。

在我们的示例中,我们只将一个声明放入有效负载中。你可以根据自己的喜好插入很多声明。JWT 有效载荷有几种不同的标准要求,如“iss”、“sub” 和 “exp” 的过期时间。这些字段在创建 JWT 时非常有用,但是它们是可选的。有关 JWT 标准字段的更详细列表,请参阅 JWT wikipedia

请记住,数据的大小将影响 JWT 的总体大小,这通常不是问题,但是过大的 JWT 可能会对性能造成负面影响,并导致延迟。

第三步:生成签名

使用如下的伪代码计算签名:

// 签名算法
data = base64urlEncode( header ) + “.” + base64urlEncode( payload )
signature = Hash( data, secret );

本算法的功能是分别把第一步和第二部生成的头部和有效载荷进行 base64url 编码。接着使用 (.)把编码后的两者连接起来。在我们的伪代码中,连接后的字符串赋值给 data 变量。JWT 签名是由数据字符串使用 JWT 头中指定的散列算法与密钥进行散列。

在我们的示例中,头部和有效载荷的 base64url 编码结果为:

// 头部
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
// 有效载荷
eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ

接着,使用头部和有效载荷连接后的字符串上应用指定的签名算法 (HS256),将 ‘secret’ 字符串设置为密匙。我们将生成如下的 JWT 签名:

// 签名
-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM

第四步:将 JWT 的三部分连接成一个字符串

当我们生成 JWT 的三部分,我们就可以生成 JWT。记住 JWT 的结构: header.payload.signature,我们使用 (.) 将三部分连接起来。我们使用了头部和有效载荷的 base64url 编码,以及我们在步骤 3 中生成的签名。

// JWT Token
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM

你也可以通过 jwt.io 网站来生成 JWT。

回到我们的例子,此时认证服务器将生成的 JWT 发送给用户。

JWT 如何保护我们的数据?

重要的是要理解,使用 JWT 的目的不是以任何方式隐藏数据。使用 JWT 的原因是为了证明发送的数据实际上是由一个真实的源创建的。

正如前面的步骤所示,JWT中的数据是经过编码和签名的,而不是加密的。编码数据的目的是改变数据的结构。签名数据允许数据接收者验证数据来源的真实性。因此,编码和签名数据不能保证数据的安全。另一方面,加密的主要目的是保护数据并防止未经授权的访问。关于编码和加密之间的区别的更详细的解释,以及关于哈希如何工作的更多信息,请参阅 本文

由于 JWT 只有签名和编码,而且 JWT 没有加密,因此 JWT 不能保证敏感数据的安全性。

第五步:验证 JWT

在我们简单的 3 个实体示例中,我们使用的是由 HS256 算法签名的 JWT,其中只有身份验证服务器和应用服务器知道密匙。当应用程序设置其身份验证过程时,应用服务器从身份验证服务器接收密钥。由于应用程序知道密匙,当用户向应用程序发出 JWT 附加的 API 调用时,应用程序可以在 JWT 上执行与步骤 3 相同的签名算法。然后,应用程序可以验证从它自己的散列操作中获得的签名是否与 JWT 本身的签名相匹配(即它匹配由身份验证服务器创建的 JWT 签名)。如果签名匹配,则意味着 JWT 是有效的,这表明 API 调用来自一个真实的源。否则,如果签名不匹配,则意味着接收的 JWT 无效,这可能是对应用程序的潜在攻击的指示器。因此,通过验证 JWT,应用程序在自己和用户之间添加了一层信任。

总结

我们讨论了 JWT 是什么,它们是如何创建和验证的,以及如何使用它们来确保应用程序和它的用户之间的信任。这是了解 JWT 的基本原理以及它们为什么有用的起点。在确保应用程序的信任和安全性方面,JWT 只是一个难题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSON Web Tokens (JWTs)在前端的应用非常广泛。JWT是一种轻量级的安全传输机制,用于在不同系统之间安全地传输信息。它是一种基于JSON的开放标准(RFC 7519),用于在各个实体之间以可靠和安全的方式传输信息。 在前端应用中,JWTs通常用于身份验证和授权。以下是JWT在前端应用中的常见应用方式: 1. 用户身份验证:当用户登录时,服务器会生成一个包含用户信息和其他相关数据的JWT,并将其返回给客户端。客户端可以将JWT存储在本地(通常使用浏览器的本地存储,如localStorage或sessionStorage),并在后续请求中将其作为身份验证凭证发送给服务器。服务器可以验证JWT的签名,并从中提取用户信息,以确认用户的身份。 2. 跨域身份验证:当前端应用需要与多个不同域的后端服务进行交互时,可以使用JWT作为跨域身份验证解决方案。客户端在登录后获取JWT,并将其发送到其他后端服务作为身份验证凭证。后端服务可以验证JWT的签名并提取其中的信息,以确认用户的身份。 3. 授权和权限管理:JWT可以包含有关用户角色和权限的信息。在前端应用中,可以使用JWT来控制用户对不同功能和资源的访问权限。前端应用可以解析JWT并根据其中的角色和权限信息来决定显示哪些功能或资源。 4. 单点登录(Single Sign-On,SSO):JWT也可以用于实现单点登录功能。当用户在一个应用中登录后,该应用会生成一个JWT,并将其发送给身份提供者(如身份验证服务器)。其他需要用户身份验证的应用可以通过验证JWT来确认用户的身份,而无需用户再次登录。 总结起来,JWT在前端应用中可以用于用户身份验证、授权和权限管理,以及实现跨域身份验证和单点登录等功能。使用JWT可以减少服务器端的状态管理,提高系统的可扩展性和性能。然而,在使用JWT时需要注意安全性,例如使用HTTPS来传输JWT,避免将敏感信息存储在JWT中,并定期更新JWT的密钥等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值