文章目录

  • 前言
  • 什么是 JSON Web 令牌?
  • 什么时候应该使用 JSON Web Tokens?
  • JWT 认证
  • 认证流程
  • jwt 优势
  • jwt 结构


前言

JWT是什么?

https://jwt.io/introduction

什么是 JSON Web 令牌?

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

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

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

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

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

JWT 认证

jks 秘钥库 查看私钥 jwt 秘钥_Web

认证流程

1.前端通过web表单(POST)提交用户名和密码发送到服务端接口。建议方式通过SSL加密传输德https协议,避免重要信息被截取泄露。
2. 后端核对用户名和密码,将用户id等信息作为JWT Payload(负载),将其与头部分别进行Base64编码拼接后签名,形成一个JWT。形成的JWT就是一个形同xxxxx.yyyyy.zzzzz的字符串。
3. 后端将jwt字符串作为登录成功的返回结果返回给前端。前端可以将返回的结果保存在localStoraehuo或者sessionStorage上,退出登录时前端删除保存的JWT即可。
4. 前端在每次请求时将JWT放入HTTP Header中的Authorization位。(解决XSS和XSRC问题)
5. 后端检查是否存在,如存在验证JWT的有效性。例如 检查签名是否正确;检查token是否过期;检查token的接收方是否时自己(可选)。
6. 验证通过后使用JWT中包含的用户信息进行其它逻辑操作,返回相应的结果。

jwt 优势

简洁: 可以通过URL ,POST参数或者 Http header发送,因为数据量小,传输速度快
自包含:负载中包含了所有用户所需要的信息,避免了多次查询数据库。
因为token是以JSON加密的形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持
不需要在服务端保存会话信息,特别适用于分布式微服务。

jwt 结构

在其紧凑的形式中,JSON Web令牌由三个部分组成,用点(.)分隔,

  • Header 头(包含签名算法)
  • Payload 有效载荷 (用户信息,不能包含敏感信息)
  • Signature 签名(基于header和payload,和密钥生成的签名信息,防伪)

因此,JWT通常看起来如下所示。
xxxxx.yyyyy.zzzzz
标头通常由两部分组成:令牌的类型,即JWT,以及正在使用的签名算法,如HMAC SHA256或RSA。

例子

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

然后,这个JSON经过Base64Url编码,形成JWT的第一部分。
Payload
令牌的第二部分是有效负载,其中包含声明。声明是关于实体(通常是用户)和其他数据的语句。索赔有三种类型:注册索赔、公开索赔和私人索赔。
注册索赔:这是一组预定义的索赔,不是强制性的,而是推荐的,以提供一组有用的、可互操作的索赔。其中一些是:iss(发行者)、exp(过期时间)、sub(主题)、aud(受众)和其他。
注意,权利要求名称只有三个字符长,因为JWT是为了紧凑。
公共声明:使用jwt的人可以随意定义这些声明。但是为了避免冲突,应该在IANA JSON Web令牌注册表中定义它们,或者定义为包含抗冲突命名空间的URI。
私有索赔:这些是为在同意使用它们的各方之间共享信息而创建的定制索赔,它们既不是注册的索赔,也不是公共索赔。
例子

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

然后对Payload进行Base64Url编码,形成JSON Web令牌的第二部分。

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

Signature
要创建签名部分,您必须获取已编码的标头、已编码的有效载荷、一个秘密、标头中指定的算法,并在其上签名。
以使用HMAC SHA256算法为例,签名的创建方式如下:

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

签名用于验证消息在发送过程中没有被更改,并且,在用私钥签名的令牌的情况下,它还可以验证JWT的发送者就是它所说的那个人。

拼接到一起

输出是三个用圆点分隔的Base64-URL字符串,可以很容易地在HTML和HTTP环境中传递,同时与基于xml的标准(如SAML)相比更紧凑。

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

jks 秘钥库 查看私钥 jwt 秘钥_前端_02


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

jks 秘钥库 查看私钥 jwt 秘钥_前端_03