jwt原理

jwt原理jwt原理jwt引入jwt构成headerpayloadsignaturejwt工作流程jwt优缺点jwt引入先说说为什么要使用jwt。传统的记录用户的登录状态使用的技术是cookie和session,但是存在这么一个问题:我们后端开发的时候使用这个技术栈,客户端可能会是PC、也可能会是移动端、也有可能其他不用这个技术栈实现的应用,那么这就会让cookie和session失去作用。因此我们引入jwt技术。jwt是JsonWebToken的缩写,它比seesion安全,且支持分布式站点的单点登录(SS

jwt引入

先说说为什么要使用jwt。传统的记录用户的登录状态使用的技术是cookie和session,但是存在这么一个问题:我们后端开发的时候使用这个技术栈,客户端可能会是PC、也可能会是移动端、也有可能其他不用这个技术栈实现的应用,那么这就会让cookie和session失去作用。因此我们引入jwt技术。jwt是Json Web Token的缩写,它比seesion安全,且支持分布式站点的单点登录(SSO)场景。

  • 什么是单点登录呢?

单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这意味着在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。

还得再说说cookie和session存在的问题。这个可能会更能理解单点登录这个概念(因为和实验室的人讨论了一下单点登录,有同学觉得他是只能在一个设备上登录)。
有这么一种情况:当一个工程项目用户群体非常庞大的时候,不可能把所有的数据放在一个服务器上,所以这个项目会有多个服务器。那么我们的用户在客户端发送请求,我们该向哪个服务器请求数据呢?这就需要nginx服务器来做这个工作了。nginx提供负载均衡的功能,当用户在客户端在vue中发送ajax请求之后,请求会转向nginx服务器,然后nginx会通过他的负载均衡策略,将请求均衡地转向不同的服务器。那么,如果用户先在一个服务器上登录了,存上了session文件,下一次再次登录的时候,nginx把请求转向了另外一个服务器,那用户是不是得再登录一次?再存一次session?那如果我们有100个服务器,1000个服务器呢?显然,使用cookie和session策略是存在缺陷的。根据上述的描述,我们也知道单点登录是什么意思了:nginx转发服务,只要转发到一个服务器上,那么我们下次再登录,不论nginx转发到哪个服务器上,都能够登录上。单点,指的是单个站点,单个服务器,而不是指单设备。

jwt构成

JWT就一段字符串,由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串。就像这样,用.分开:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).

header

jwt的头部承载两部分信息:

  1. 声明类型,这里是jwt
  2. 声明加密的算法通常直接使用HMAC、SHA256

先将头部表示成JSON格式,然后使用base64.b64encode()进行加密。

payload

载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分:

  1. 标准中注册的声明
  2. 公共的声明
  3. 私有的声明

具体的就不展开讲了,他就是用于存放一些用户信息字段,存成JSON格式之后也使用base64.b64encode()进行加密。

signature

jwt的第三部分是一个签证信息,这个签证信息由三部分组成:

  1. header (base64后的)
  2. payload (base64后的)
  3. secret密钥
    这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。将这三部分用.连接成一个完整的字符串,构成了最终的jwt:

jwt工作流程

  1. 用户在第一次登录的时候,会将用户名、密码等信息传到我们的服务器上进行身份验证,验证成功后,服务器会存在的密钥对用户信息进行加密生成jwt,并返回给用户,用户将jwt存储下来。
  2. 用户在下一次登录的时候,向服务器发送jwt,服务器会提取发送过来的jwt前面两段和服务器中存放的密钥重新生成jwt,两个jwt做比较,如果相同,说明用户登录了,如果不相同,说明jwt被篡改了,阻止用户登录。
  3. 每个服务器上都存放相同的密钥,这样就能实现单点登录。

jwt优缺点

jwt的优点:

  1. 实现分布式的单点登陆非常方便
  2. 数据实际保存在客户端,所以我们可以分担服务器的存储压力

jwt的缺点:

  1. 数据保存在了客户端,我们服务端只认jwt,不识别客户端。
  2. jwt可以设置过期时间,但是因为数据保存在了客户端,所以对于过期时间不好调整。

今天的文章jwt原理分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/6517.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注