likes
comments
collection
share

jwt,标题是啥不重要,反正你又记不住🍺🍺🍺

作者站长头像
站长
· 阅读数 18

什么是 jwt

在现代的 Web 应用开发中,目前已经有大半部分的应用都是使用的 jwt 的方式来做登录鉴权功能,那么什么是 jwt 呢?

  • JSON Web Token(JWT) 是一个开放标准 RFC 519,它定义了一种紧凑且自包含的方式,用于作为 JSON 对象在各方面之间安全地传输信息;
  • JWT 是一个数字签名,生成的信息是可以验证并被信任的;
  • 它可以使用 HMAC 算法或使用 RSAECDSA 的公钥/私钥对对 jwt 进行签名;
  • JWT 是目前最流行的跨域认证解决方案;

什么时候用到 jwt

这里有一些场景下可以使用到 jwt,具体如下:

  • Authorization: 这是使用 jwt 最常见的场景。一次登录,之后的每次请求都会包含 JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是目前广泛使用 JWT 的一个特性,因为它开销很小,并且能够轻松地跨不同的域使用;
  • 信息交换: jwt 是在各方之间安全传输信息的好方法。因为 jwt 可以进行签名,例如使用 公钥/私钥对,所以您可以确定发送者就是就是本人。此外,由于签名是使用 headerpayload 计算的,因此您还可以验证内容是否未被篡改;

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,也就是载体。它包含声明,声明是关于实体(通常是用户)和附加数据的陈述。声明分为三种类型: 注册声明、公共声明和私有声明。

  1. 注册声明: 这些是一组预定义的声明,具有特定的含义并进行了标准化,一些注册声明的示例包括:

    • iss: 表示 token 的发行者,即发出 JWT 的实体;
    • sub: 表示 token 的主题,通常是用户或 token 所代表的实体;
    • exp: 指定 token 的过期时间;
    • aud: 指定 token 的预期受众,即 token 所面向的接收者;
  2. 公共声明: 这些是由 jwt 的使用者定义的自定义声明,它们没有标准化。公共声明应该以避免与其他声明冲突的方式进行定义。这些声明用于携带关于实体的附加信息或提供特定域应用程序的细节。

  3. 私有声明: 这些是由共享 JWT 的各方之间的私有协议定义和使用的自定义声明。它们不适用于其他方使用或理解;

一个有效的 payload 的例子是:

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

然后对有效 payload 进行 Base64Url 编码,以形成 JSON Web Token 的第二部分。

对应已签名的 token,此信息虽然受到防止篡改的保护,但任何人都可以读取。除非进行二次加密,否则不要在 jwtpayload 元素中放置秘密信息。

Signature

要创建签名部分,你需要获取编码的 headerpayloadsecret,以及 header 中指定的算法,并对它们进行签名。

例如,如果您想使用 HMAC SHA256 算法,可以按照以下方式创建签名:

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

签名用于验证消息在传输过程中是否被篡改,并且在使用私钥签名的令牌中,它还可以验证 JWT 的发送方是否是它所声称的身份。

组合在一起

输出的三个由点分割的 Base64-URL 字符串,可以在 HTMLHTTP 环境中轻松传递这些字符串,与基于 XML 的标准相比,它更紧凑: jwt,标题是啥不重要,反正你又记不住🍺🍺🍺

参考文献

总结

  • 由于 HeaderPayload 是基本使用 Base64URL 能进行编码解码的,所以 HeaderPayload 的内容是等同于公开的,谁拿到 JWT,都能知道内容;
  • 由于 Signature 的生成方式,JWT 一旦生成,没有 Secret 的人是没法篡改 payload 的。因为改了 payload 后,你需要 secret 对新的 payload 进行签名;

综上所述,jwt 一经发出,就无法修改了。一旦泄漏,任何人都可以获得该 token 的所有权限。为了减少盗用,jwt 的有效期应该设置得比较短,对于一些比较重要的权限,使用时应该再次对用户进行认证。

转载自:https://juejin.cn/post/7251104465730175031
评论
请登录