JWT的简单介绍

 

由于HTTP协议是无状态的协议,因此用户登陆后保持登陆状态就是第一个需要解决的问题

在传统的用户登录认证中,因为http是无状态的,所以都是采用session方式。当用户登录成功,服务端会保存一个session,会给客户端一个sessionId客户端会把sessionId保存在cookie中,每次请求都会携带这个sessionId。

cookie+session这种模式通常是保存在内存中,而且服务从单服务到多服务会面临的session共享问题,随着用户量的增多,开销就会越大。而JWT不是这样的,只需要服务端生成token,客户端保存这个token,每次请求携带这个token,服务端认证解析就可

 

1. JWT的构成

由,header(头部),payload(载荷),signature(签证)

header(头部)
    jwt的头部承载两部分信息:

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

payload(载荷)
                         iss: jwt签发者
  sub: jwt所面向的用户
  aud: 接收jwt的一方
  exp: jwt的过期时间,这个过期时间必须要大于签发时间
  nbf: 定义在什么时间之前,该jwt都是不可用的.
  iat: jwt的签发时间
  jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

signature(签证)
           
header (base64后的)
        payload (base64后的)

         secret

这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

 

JWT的流程:

 

            ①首先用户通过用户名密码向认证服务器发起请求 
            ②认证服务器核实用户身份之后,生成一个Token返回到客户端,这个生成过程如下:首先构造称为header的JSON对象:{"typ":"JWT",

 

                     "alg":"HS256}

这个JSON包含两个字段,typ表示Token的类型,一般情况下为JWT,alg表示签名算法,这里我们使用HMACSHA256算法。

     接着是payload部分,认证服务器验证密码后找到用户的ID,将其放入payload,并且给定一个过期时间:接着我们把header和payload分别使用base64算法编码,然后用点号连接起来,并且使用私钥和HS256算法进行签名。

通过以上的过程,认证服务器将jwt返回的客户端,格式如下:aaaa.bbbb.cccc

          1.JWT可以放在那里?

           2.JWT的适用场景

 
    1.JWT可以放在那里?
            1.html5存储:localStorage or sessionStorage (Web Storage)
           2.放置cookies中
            相同对比:
相同点:都是无状态的,因为api所需要的验证信息都在token中<br>
不同点:1.前者可使用跨站点脚本(XSS)进行攻击,cross-site scripting (XSS) attacks。所以,Web存储在传输过程中不执行任何安全标准

2.Cookie与HttpOnly cookie标志一起使用时,不能通过JavaScript访问,并且不受XSS影响。但是传统的cookies不符合RESTful最佳实践,因为需要服务器存储。cookies+JWT不需要将状态存储在服务器上

JWT的适用场景

           由于Token的信息会暴露 因此,在JWT中,不应该在载荷里面加入任何敏感的数据

像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。

因此,JWT更适合用于一次性操作和做RESTful API无状态的身份认证。

 

 

 

1。jwt token防止泄露

            使用 https 加密你的应用,返回 jwt 给客户端时设置 httpOnly=true 并且使用 cookie 而不是 LocalStorage 存储 jwt,这样可以防止 XSS 攻击和 CSRF 攻击 

2.为什么不推荐使用 jwt 做单点登录+会话管

续签问题:

传统的 cookie 续签方案一般都是框架自带的,session 有效期 30 分钟,30 分钟内如果有访问,session 有效期被刷新至 30 分钟。而 jwt 本身的 payload 之中也有一个 exp 过期时间参数,来代表一个 jwt 的时效性,而 jwt 想延期这个 exp 就有点身不由己了,因为 payload 是参与签名的,一旦过期时间被修改,整个 jwt 串就变了,jwt 的特性天然不支持续签

如果一定要使用 jwt 做会话管理(payload 中存储会话信息),也不是没有解决方案

 

1.每次请求刷新 jwt 

2.只要快要过期的时候刷新 jwt

 

 

JWT的优劣势

  https://blog.youkuaiyun.com/qq_28165595/article/details/80214994

           安全传递

   http://blog.leapoahead.com/2015/09/06/understanding-jwt/

           基于JWT的Token验证

   https://blog.youkuaiyun.com/weixin_38568779/article/details/76833848

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值