JSON Web Tokens (jwt)简介

什么是 JSON Web Token?

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

尽管可以对 JWT 进行加密以在各方之间提供保密性,但我们将重点关注已签名的令牌。签名令牌可以验证其中包含的声明的完整性,而加密令牌可以向其他方隐藏这些声明。当使用公钥/私钥对对令牌进行签名时,签名还证明只有持有私钥的一方才是签名者.

什么时候应该使用JSON Web Tokens?

以下是 JSON Web Tokens 有用的一些场景:

  • 授权: 这是使用 JWT 最常见的场景。用户登录后,每个后续请求都将包含 JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是如今广泛使用 JWT 的一项功能,因为它的开销很小并且能够轻松跨不同域使用.
  • 信息交换: JSON Web Tokens 是在各方之间安全传输信息的好方法。因为 JWT 可以签名——例如,使用公钥/私钥对——你可以确定发送者是他们所说的人。此外,由于签名是使用标头和有效负载计算的,因此您还可以验证内容是否未被篡改.

什么是 JSON Web Token 结构?

在其紧凑的格式中,JSON Web Tokens 由三部分组成,由点 (.)分隔,它们是:

  • Header(标头)
  • Payload(有效载荷 )
  • Signature(签名)

因此,JWT 通常如下所示.

xxxxx.yyyyy.zzzzz

让我们分解不同的部分.

Header

标头通常由两部分组成:令牌的类型,即 JWT,以及所使用的签名算法,例如 HMAC SHA256 或 RSA.

例如:

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

然后,这个 JSON 被Base64Url编码以形成 JWT 的第一部分.

Payload

令牌的第二部分是有效负载,其中包含声明。声明是关于实体(通常是用户)和附加数据的声明。声明分为三种类型:registered(注册声明)、public(公共声明)和private(私人声明).

  • 已注册声明: 这些是一组预定义的声明,它们不是强制性的,但建议使用,以提供一组有用的、可互操作的声明。其中一些是: iss(发布者)、 exp(到期时间)、 sub(主题)、 aud(受众)和其他.

    请注意,声明名称只有三个字符长,因为 JWT 是为了紧凑.

  • 公共声明: 这些可以由使用 JWT 的人随意定义。但是为了避免冲突,它们应该在IANA JSON Web Token注册表中定义,或者定义为包含抗冲突名称空间的 URI。
  • 私人声明: 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公共声明

一个示例有效载荷可以是:

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

然后,有效负载经过Base64Url编码,形成 JSON Web Token 的第二部分.

请注意,对于签名的令牌,此信息虽然受到防止篡改的保护,但任何人都可以读取。不要将秘密信息放在 JWT 的有效负载或标头元素中,除非它是加密的.

签名

要创建签名部分,您必须采用编码标头、编码有效负载、秘码、标头中指定的算法,然后对其进行签名.

例如,如果要使用 HMAC SHA256 算法,将按以下方式创建签名:

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

签名用于验证消息在此过程中没有被更改,并且在使用私钥签名的令牌的情况下,它还可以验证 JWT 的发送者是否如其所说.

把所有放在一起

输出是由点分隔的三个 Base64-URL 字符串,可以在 HTML 和 HTTP 环境中轻松传递,同时与基于 XML 的标准(如 SAML)相比更加紧凑.

下面显示了一个 JWT,它对前面的标头和有效负载进行了编码,并使用秘码进行了签名. 

Encoded JWT

如果您想使用 JWT 并将这些概念付诸实践,您可以使用jwt Debugger来解码、验证和生成 JWT.

JWT.io Debugger

JSON Web Tokens 如何工作?

在身份验证中,当用户使用其凭据成功登录时,将返回一个 JSON Web Token。由于令牌是凭据,因此必须非常小心以防止出现安全问题。通常,您不应将令牌保留的时间超过要求的时间.

由于缺乏安全性,您也不应该将敏感的会话数据存储在浏览器存储中.

每当用户想要访问受保护的路由或资源时,用户代理都应发送 JWT,通常在使用Bearer模式的Authorization 标头中。标头的内容应如下所示:

Authorization: Bearer <token>

在某些情况下,这可以是无状态授权机制。服务器的受保护路由将在Authorization 标头中检查有效的 JWT,如果存在,则允许用户访问受保护的资源。如果 JWT 包含必要的数据,则可能会减少为某些操作查询数据库的需要,尽管情况可能并非总是如此.

请注意,如果您通过 HTTP 标头发送 JWT 令牌,则应尝试防止它们变得太大。某些服务器不接受超过 8 KB 的标头。如果尝试在 JWT 令牌中嵌入过多信息(例如包含所有用户的权限),则可能需要替代解决方案,例如 Auth0 细粒度授权.

如果令牌在Authorization标头中发送,跨源资源共享 (CORS) 将不会成为问题,因为它不使用 cookie.

下图显示了如何获取 JWT 并将其用于访问 API 或资源:

How does a JSON Web Token work

  1. 应用程序或客户端向授权服务器请求授权。这是通过不同的授权流之一执行的。例如,典型的 OpenID Connect 兼容 Web 应用程序将使用 授权代码流通过/oauth/authorize端点.
  2. 授予授权后,授权服务器会向应用程序返回一个访问令牌.
  3. 应用程序使用访问令牌访问受保护的资源(如 API).

请注意,对于已签名的令牌,令牌中包含的所有信息都会暴露给用户或其他方,即使他们无法更改。这意味着您不应将秘密信息放入令牌中.

我们为什么要使用JSON Web Tokens?

让我们谈谈JSON Web Tokens (JWT)Simple Web Tokens (SWT)安全断言标记语言令牌(SAML)相比的优势.

由于 JSON 比 XML 更简洁,因此在编码时它的大小也更小,使 JWT 比 SAML 更紧凑。这使得 JWT 成为在 HTML 和 HTTP 环境中传递的不错选择.

安全方面,SWT 只能通过使用 HMAC 算法的共享密钥进行对称签名。但是,JWT 和 SAML 令牌可以使用 X.509 证书形式的公钥/私钥对进行签名。与签署 JSON 的简单性相比,使用 XML 数字签名签署 XML 而不会引入模糊的安全漏洞是非常困难的.

JSON 解析器在大多数编程语言中都很常见,因为它们直接映射到对象。相反,XML 没有自然的文档到对象的映射。这使得使用 JWT 比使用 SAML 断言更容易.

关于使用,JWT 用于互联网规模。这凸显了客户端在多个平台(尤其是移动平台)上处理 JSON Web Token的便利性.

Comparing the length of an encoded JWT and an encoded SAML

 编码的 JWT 和编码的 SAML 的长度比较

如果您想阅读有关 JSON Web Tokens 的更多信息,甚至开始使用它们在您自己的应用程序中执行身份验证,请浏览Auth0 上的JSON Web Token 页面.

立即开始使用 JWT

开始使用该工具

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值