jwt,标题是啥不重要,反正你又记不住🍺🍺🍺
什么是 jwt
在现代的 Web 应用开发中,目前已经有大半部分的应用都是使用的 jwt 的方式来做登录鉴权功能,那么什么是 jwt 呢?
JSON Web Token(JWT)是一个开放标准RFC 519,它定义了一种紧凑且自包含的方式,用于作为JSON对象在各方面之间安全地传输信息;JWT是一个数字签名,生成的信息是可以验证并被信任的;- 它可以使用
HMAC算法或使用RSA或ECDSA的公钥/私钥对对jwt进行签名; JWT是目前最流行的跨域认证解决方案;
什么时候用到 jwt
这里有一些场景下可以使用到 jwt,具体如下:
Authorization: 这是使用jwt最常见的场景。一次登录,之后的每次请求都会包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是目前广泛使用JWT的一个特性,因为它开销很小,并且能够轻松地跨不同的域使用;- 信息交换:
jwt是在各方之间安全传输信息的好方法。因为jwt可以进行签名,例如使用公钥/私钥对,所以您可以确定发送者就是就是本人。此外,由于签名是使用header和payload计算的,因此您还可以验证内容是否未被篡改;
jwt 的特点及组成
当我们使用一个技术的时候,首先我们应该清楚地知道它有什么特点,JWT 就具有以下优点:
- 跨平台:
JWT是基于JSON格式的标准,因此可以在不同编程语言和平台之间轻松传递和解析; - 自包含:
JWT包含了身份验证和授权所需的所有信息,因此减少了服务器端存储和查询的负担; - 可扩展: 可以向
payload中添加自定义的声明,以瞒住特定应用程序的需求;
在其紧凑形式中,JWT 由点 . 分割的三个部分组成,分别是:
HeaderPayloadSignature
因此,一个 JWT 通常如下所示:
xxxxx.yyyyy.zzzzz
接下来我们来看看它们每一部分分别代表什么?
Header
header 通常包含两个部分:
- 令牌(
token)的类型,即JWT; - 使用的签名算法,例如
HMAC SHA256或者RSA;
例如:
{
"alg": "HS256",
"typ": "JWT"
}
然后,对该 JSON 进行 Base64Url 编码,以形成 JWT 的第一部分
Payload
Token 的第二部分就是 Payload,也就是载体。它包含声明,声明是关于实体(通常是用户)和附加数据的陈述。声明分为三种类型: 注册声明、公共声明和私有声明。
-
注册声明: 这些是一组预定义的声明,具有特定的含义并进行了标准化,一些注册声明的示例包括:
iss: 表示token的发行者,即发出JWT的实体;sub: 表示token的主题,通常是用户或token所代表的实体;exp: 指定token的过期时间;aud: 指定token的预期受众,即token所面向的接收者;
-
公共声明: 这些是由
jwt的使用者定义的自定义声明,它们没有标准化。公共声明应该以避免与其他声明冲突的方式进行定义。这些声明用于携带关于实体的附加信息或提供特定域应用程序的细节。 -
私有声明: 这些是由共享
JWT的各方之间的私有协议定义和使用的自定义声明。它们不适用于其他方使用或理解;
一个有效的 payload 的例子是:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
然后对有效 payload 进行 Base64Url 编码,以形成 JSON Web Token 的第二部分。
对应已签名的
token,此信息虽然受到防止篡改的保护,但任何人都可以读取。除非进行二次加密,否则不要在jwt的payload元素中放置秘密信息。
Signature
要创建签名部分,你需要获取编码的 header、payload、secret,以及 header 中指定的算法,并对它们进行签名。
例如,如果您想使用 HMAC SHA256 算法,可以按照以下方式创建签名:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret);
签名用于验证消息在传输过程中是否被篡改,并且在使用私钥签名的令牌中,它还可以验证 JWT 的发送方是否是它所声称的身份。
组合在一起
输出的三个由点分割的 Base64-URL 字符串,可以在 HTML 和 HTTP 环境中轻松传递这些字符串,与基于 XML 的标准相比,它更紧凑:

参考文献
总结
- 由于
Header和Payload是基本使用Base64URL能进行编码解码的,所以Header和Payload的内容是等同于公开的,谁拿到JWT,都能知道内容; - 由于
Signature的生成方式,JWT一旦生成,没有Secret的人是没法篡改payload的。因为改了payload后,你需要secret对新的payload进行签名;
综上所述,jwt 一经发出,就无法修改了。一旦泄漏,任何人都可以获得该 token 的所有权限。为了减少盗用,jwt 的有效期应该设置得比较短,对于一些比较重要的权限,使用时应该再次对用户进行认证。
转载自:https://juejin.cn/post/7251104465730175031