JWT——基础知识

372 阅读2分钟

Json web token知识点

学习参考的博客

理解 JWT 的使用场景和优劣

JWT使用

讲真,别再使用 JWT了

1、概况

其实就是在web环境下两个实体之间传输数的一项标准。实际上传输的就是一个字符串。广义的来讲JWT就是一个标准的名称;狭义上的JWT指的就是用来传递的那个token字符串。JWT的基本使用是一种签名的方式,用来判断JWT(字符串)是否可信,从而服务端判断能否访问自己的资源。

2、组成

JWT字符串中的数据结构三部分组成

  • header:指定类型、加密算法等。例如
{
    "alg":"HS256", // 算法名称
    "typ":"JWT"  // 类型
}
  • payload:存放消息主体,用来存储JWT的基本信息。例如
{
  // 用户信息,状态等
  "sub": "1234567890",	// 持有人id
  "name": "John Doe",	// 持有人名称
  "admin": true. 	// 是否为管理员            	   "expitation":1622709599  // 过期时间戳
}
  • signature: 由header、payload分别使用base64编码之后拼接,最后使用header中的加密算法统一加密得到。主要用于签名验证。

3、验证过程

验证的过程也比较简单,根据signature中的定义,也就是对header和payload中的内容进行base64编码和使用header中的加密算法加密得到的字符串与signature中的进行对比,如果不相同则说明JWT中的数据被非法篡改过。

当然客户端和服务器中要使用相同的密钥才能得到相同的加密字符串。关于密钥的安全传递也是涉及到另外的算法。可以看这篇文章——密钥交换算法。感受一下数学的神奇之处。

4、具体分析

无状态

由于JWT是存储在客户端的,服务端并不存储用户的状态——即JWT是无状态的,服务端只需要知道对应的密钥对客户端传递过来的JWT字符串进行验证就好了 。

假注销

区别与传统的cookie-session方式,当用户注销的时候,服务端并不能做什么(因为没有保存用户的信息),如果用客户端去清除存储的对应JWT信息的话,实际上是一种假注销行为,

实际上2描述的问题可以考虑对密钥进行按照用户实行一一对应,这样用户注销的时候,服务端直接删除该用户对应的密钥即可实现真正意义上的注销。

过期时间维护

当想要延长过期时间的时候,传统的session方式是直接延长便可,而JWT则需要更改payload中的信息,这样不免需要重新计算signature,带来一定的性能问题。