JWT

1、jwt认证和session认证

    JWT,全称是 Json Web Token , 是一种 JSON 风格的轻量级的授权和身份认证规范,可实现无状态、分布式的 Web 应用授权:

      JWT属于无状态认证,支持集群化部署,服务端可以任意迁移,减少服务端存储session压力,多平台跨域。流程:用户发送用户名和密码,服务端验证成功后用户信息加密并且编码成一个 token给客户端,客户端每次请求携带token,服务端接收请求时会解密token再验证token是否有效,获取用户登录信息,再根据授权获取受保护的资源。验证token不通过的情况有很多,比如签名不正确,无权限等

2、JWT组成结构

  jWT由三段字符串和两个点号组成,如(xxxxxx.yyyyy.zzzzz)

  JWT头是一个json对象,格式如json{"alg":"HS256","typ":"JWT"}   alg是只jwt签名算法

       JWT主体是一个json对象,格式如json{"exp":"201909181230","role":"admin","isShow":false},有效载荷,包括三部分

      1)标准注册声明,一般包括:

          iss:jwt的签发者/发行人;

          sub:主题;

          aud:接收方;

          exp:jwt过期时间;

          nbf:jwt生效时间;

          iat:签发时间

          jti:jwt唯一身份标识,可以避免重放攻击

       2)公共声明,该部分可以在客户端解密

       2)私有声明

       jwt哈希签名:HMACSHA256(base64UrlEncode(JWT 头) + "." + base64UrlEncode(有效载荷),密码)

  JWT最终结果如下:base64UrlEncode(JWT 头)+"."+base64UrlEncode(有效载荷)+"."+HMACSHA256(base64UrlEncode(JWT 头) + "." + base64UrlEncode(有效载荷),密码)

3、有以下几个方法可以做到失效 JWT token(后期再考虑不同方式的优缺点)

  1. 将 token 存入 DB(如 Redis)中,失效则删除;但增加了一个每次校验时候都要先从 DB 中查询 token 是否存在的步骤,而且违背了 JWT 的无状态原则(这不就和 session 一样了么?)。
  2. 维护一个 token 黑名单,失效则加入黑名单中。
  3. 在 JWT 中增加一个版本号字段,失效则改变该版本号。
  4. 在服务端设置加密的 key 时,为每个用户生成唯一的 key,失效则改变该 key。

4、JWT 注意事项

  • JWT 默认不加密,如果要写入敏感信息必须加密,可以用生成的原始令牌再次对内容进行加密;
  • JWT 无法使服务器保存会话状态,当令牌生成后在有效期内无法取消也不能更改;
  • JWT 包含认证信息,如果泄露了,任何人都可以获得令牌所有的权限;因此 JWT 有效期不能太长,对于重要操作每次请求都必须进行身份验证。
原文地址:https://www.cnblogs.com/yaohuiqin/p/12712464.html