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
由点 .
分割的三个部分组成,分别是:
Header
Payload
Signature
因此,一个 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