zoukankan      html  css  js  c++  java
  • JWT实现分布式Session

    JWT是什么

    JWT一看就是简称,它的全称JSON Web Token,从字面上我们看出

    1、数据是JSON格式
    2、用于Web应用
    3、是一个Token,也就是一个令牌方式

    看看官方的说明,它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象进行安全传输信息。这些信息可以通过对称/非对称方式进行签名,防止信息被串改

    紧凑的含义:就是JWT比较小,数据量不大,可以通过URL、POST参数或Header请求头方式进行传输。
    自包含的含义:jwt可以让用户自定义JWT里面包含的用户信息,如:姓名、昵称等(不要放隐密的信息)。从而避免了多次查询数据库

    JWT数据结构

    JWT由三个部分组成

    1、Header
    2、Payload
    3、Signature

    三者组合在一起

    Header.Payload.Signature
    

    案例

    看上去是不是满乱,我们来依次看下里面的结构。

    Header

    这个是JWT第一段数据,表示头部信息,主要的作用是描述JWT的元数据,上面的案例就是:

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

    1、alg属性表示签名的算法,默认算法为HS256,可以自行别的算法。
    2、typ属性表示这个令牌的类型,JWT令牌就为JWT。

    上面的JSON数据会通过Base64算法进行编码而成,看工具图

    Payload

    此为JWT第二段数据,用来存放实际需要传递的数据。JWT官方也规定了7个字段供选用

     当然除了官方字段,我们可以自定义字段,以上面的案例,我们看下实际的数据

    注意:这段也是用Base64算法,JWT默认是不加密的,任何人都可以获取,只要进行Base64解码就行了,所以不要把隐密的信息放到JWT中

    Signature

    此为JWT第三段数据,主要作用是对前面两段的数据进行签名,防止数据篡改。一般我们进行签名的时候会有个密钥(secret)只有服务器知道,然后利用Header中的签名算法进行签名,公式如下:

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

    算出签名后,把Header、Payload、Signature三个部分拼成一个字符串,之间用(.)分隔,这样就可以把组合而成的字符串返回给用户了。

    JWT的工作方式

    在用户进行认证登录时,登录成功后服务器会返回一个JWT给客户端;那这个JWT就是用户的凭证,以后到哪里去都要带上这个凭证token。尤其访问受保护的资源的时候,通常把JWT放在Authorization header中。要用 Bearer schema,如header请求头中:

    Authorization: Bearer <token>
    
     

    基于JWT的身份认证

    上面的JWT的工作方式,其实就是一个完整的身份认证流程,我们这里把这个讲的在通俗一点。

    1、用户提供用户名和密码登录
    2、服务器校验用户是否正确,如正确,就返回token给客户端,此token可以包含用户信息
    3、客户端存储token,可以保存在cookie或者local storage
    4、客户端以后请求时,都要带上这个token,一般放在请求头中
    5、服务器判断是否存在token,并且解码后就可以知道是哪个用户
    6、服务器这样就可以返回该用户的相关信息

    这个流程小伙伴们有没有发现,用户信息是放在JWT中的是存放在客户端(cookie,local storage)中的,服务器只需解码验证就行了,就可以知道获取到用户信息。而我们之前的Session方式就不一样。

    与Session-Cookie方式的区别

    Session-Cookie方式的这里就不多作介绍了,之前文章已经介绍了。直接上图说明区别

     上图是Sesson服务器方式,我们发现Session用户信息是在服务器端存储的。
    我们再来看看JWT方式

    上面的token即用户信息是存储在客户端的,服务器端只要解码即可。

    JWT方式认证的好处

    1、因为token存储在客户端,服务器只负责解码。这样不需要占用服务器端资源
    2、服务器端可以无限扩展,负载均衡器可以将用户传递到任何服务器,服务器都能知道用户信息,因为jwt里面包含了。
    3、数据安全,因为有签名,防止了篡改,但信息还是透明的,不要放敏感信息。
    4、放入请求头提交,很好的防止了csrf攻击

    说了这么多的好处,那是不是JWT就非常适合替换掉Session方式呢?

    JWT方式的坏处

    一、token失效问题

    JWT方式最大的坏处就是无法主动让token失效,小伙伴们会说token不是有过期时间吗?是的,token本身是有过期时间,但token一旦发出,服务器就无法收回

    如:一个jwt的token的失效时间是3天,但我们发现这个token有异常,有可能被人登录,那真实的用户可以修改密码。但是即使修改了密码,那个异常的token还是合法的,因为3天的失效时间未到,我们服务器是没法主动让异常token失效

    二、数据延时,不一致问题

    还有个问题就是因为jwt中包含了用户的部分信息,如果这些部分信息修改了,服务器获取的还是以前的jwt中的用户信息,导致数据不一致。

    总结

    小伙伴们怎么去选择Session的方式,是用传统的Sesion-Cookie服务器方式,还是用JWT方式,具体集合业务看。不过老顾这里推荐还是用传统的方式,因为以后的业务很有可能会用到用户Session。好了,谢谢!!!

     
  • 相关阅读:
    cnblog项目--20190309
    django js引入失效问题
    Python老男孩 day16 函数(六) 匿名函数
    Python老男孩 day16 函数(五) 函数的作用域
    Python老男孩 day15 函数(四) 递归
    Python老男孩 day15 函数(三) 前向引用之'函数即变量'
    Python老男孩 day15 函数(二) 局部变量与全局变量
    Python老男孩 day14 函数(一)
    Python老男孩 day14 字符串格式化
    Python老男孩 day14 集合
  • 原文地址:https://www.cnblogs.com/windpoplar/p/11955627.html
Copyright © 2011-2022 走看看