怎么取出jwt里的数据,jwt怎么获取额外信息

首页 > 实用技巧 > 作者:YD1662023-06-09 07:36:00

前文《》介绍了目前应用最多的会话管理方案还是基于token的方案,不仅有很多实现,而且还有现成的标准可用,这个标准就是JSON Web Token(JWT)。这篇文章就来重点介绍一下JWT。

JWT是一个开放标准(RFC 7519),它定义了一种紧凑和自包含的方式,以JSON字符串的形式在各方之间安全地传输信息。JWT标准本身没有提供技术实现,但是大部分的编程语言都提供了自己的技术实现,所以实际在用的时候,只要根据自己需要,选用合适的实现库即可。

使用JWT传输的数据,实际上是一个字符串,这个字符串就是JWT字符串。JWT字符串有两个特点:

JWT的请求流程

怎么取出jwt里的数据,jwt怎么获取额外信息(1)

JWT请求流程

JWT的请求流程如上图所示,主要包括了JWT字符串的生成和验证:

  1. 浏览器向服务器发送POST请求,带有用户名和密码
  2. 服务器验证后用密钥创建一个JWT字符串
  3. 服务器返回JWT给浏览器
  4. 浏览器再次请求,将JWT放在请求头中
  5. 服务器验证JWT签名,提取用户信息
  6. 服务器返回响应
JWT字符串的生成

一个JWT字符串由三个部分组成:header(头部)、payload(载荷)和signature(签名)。这三个部分在JWT字符串中用英文句号“.”分隔开来。

header部分是由下面格式的json结构生成出来:

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

这个json中的typ属性,用来标识字符串是一个JWT字符串;alg属性用来说明所使用的签名和摘要算法。一般签发JWT的时候,header对应的json结构只需要这两个属性就够了。JWT的header部分是把这个json结构,经过Base64Url编码之后生成出来的。

payload部分是用来承载要传递的数据,它的json结构实际上是对要传递的数据的一组声明,这些声明被JWT标准称为claims,每一个属性值对就是一个claim

JWT标准里面定义的标准claim有:

当然我们可以按照自己的想法来自定义payload的结构:

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

payload部分也是把这个json结构经过Base64Url编码之后生成出来。

signature是签名部分。签名过程是把 header 和 payload 对应的json结构分别进行Base64url编码之后得到的两个串,用英文句点号拼接起来,再根据 alg 字段指定的签名算法生成出来。算法不同,签名结果也会不同,但不同的算法最终要解决的问题是一样的。

以 alg: HS256 为例来说明签名如何生成。HS256其实包含的是两种算法:HMAC算法和SHA256算法,前者用于生成摘要,后者用于对摘要进行数字签名。这两个算法也可以用HMACSHA256来统称,运用HMACSHA256实现签名的算法如下:

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

最终的JWT字符串就是把header、payload和signature三个部分,用英文句号“.”连接组成。

怎么取出jwt里的数据,jwt怎么获取额外信息(2)

不同颜色代表JWT不同部分

JWT的验证

JWT的验证主要是对签名的验证,以及payload中的各个标准claim进行验证。只有验证成功的JWT,才能被当做有效的凭证来使用。

签名验证

当服务端接收到JWT的时候,首先要对JWT的完整性进行验证,也就是签名认证。验证的方法其实很简单:

接收方验证签名的时候必须使用生成签名相同的密钥。因此服务端必须要对密钥妥善安全保管。

标准claim验证

在签发JWT的时候,一般只用sub跟exp两个claim即可,用sub存储用户id,用exp存储过期时间。在claim验证的时候仅验证exp这个claim,以实现会话的有效期管理。

总结

JWT有以下优势:

使用JWT时需要注意的是:不要在JWT的payload部分存放敏感信息,因为该部分是可以解密的。密钥一定要保存好,尽量使用Https协议来进行Http请求。

参考资料:https://jwt.io/introduction/

我会持续更新关于物联网、云原生以及数字科技方面的文章,用简单的语言描述复杂的技术,也会偶尔发表一下对IT产业的看法,请大家多多关注,欢迎留言和转发,希望与大家互动交流,谢谢。

,

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.