Java

Web Token

2021-07-20  本文已影响0人  TZX_0710

JSON Web Token

一般前端向后端发送请求 认证流程如下

  • 可短向服务器发送用户名和密码
  • 服务器验证通过,在当前session保存用户信息
  • 服务器返回给客户端一个sessionId,写入用户cookie。
  • 客户端每次请求携带sessionid。
  • 服务器收到sessionid 进行验证,然后把数据返回给客户端。

JWT原理

JWT的原理是,服务器认证以后,生成一个json对象,发送给用户,就像下面这样。

{

userName:"张三",
roles:"admin",

expireTime:"2018-7-01 12:0:0"

}

用户与服务端通信的时候,都要返回该json文件。服务器通过该json对象鉴定用户身份。

JWT的数据结构

JWT的组成部分由三个部分组成

  1. Header(头部)

    1. header部分是一个json对象,描述JWT的元数据,通常类似下面

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

      alg属性表示签名的算法,默认是HMACSHA256;typ属性表示这个令牌(Token)的类型(type),JWT令牌统一写为JWT。

  2. Payload(负载)

    1. Payload部分也是一个json对象,用来存放实际需要传递的数据。JWT规定了7个官方字段,供选用。

      • iss(issuer)签发人

      • exp(expiration time)过期时间

      • sub(subject)主题

      • aud(audience):受众

      • nbf(Not before)生效时间

      • iat(issued AT)签发时间

      • jti(JWT ID):编号

        除了以上字段,还可以定义私一些私有字段。

    JWT默认是不加密的,任何人都可以读到,所以不要把秘密信息放在该部分。这个json对象也要使用base64ul算法转成字符串。

  3. Signature(签名)

    Signature部分是对前两部分的签名,防止数据篡改。首先,需要指定一个密钥,这个密钥只有服务器才知道,不能泄露给用户。然后使用header里面指定的签名算法,默认HMAC SHA256

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

    算出签名后,把header payload signature三个部分拼成一个字符串,每个部分之间用.分割,

  4. Base64URL

    header和payload串型算法是Base64URL.这个算法跟Base64算法基本类似,但有一些小的不同。JWT作为一个令牌,有些场合可能会放到URL。Base64有三个字符+、/和=,在URL里面有特殊含义,所以要被替换掉:=被省略、+替换成-,/替换成_。这就是Base64URL算法。

JWT的使用方式

客户端收到服务器返回的JWT,可以存储再Cookie类里面,也可以存储再localStorage。此后,客户端每次与服务器通信,都要带上这个JWT。你可以把它放在Cookie里面自动发送,但是这样不能跨域,所以更好的做法是放在HTTP请求的头信息Authorization字段里面。

JWT的特点

  1. JWT默认是不加密的,但也是可以加密的。生成原始Token以后,可以用密钥再次加密一次

  2. JWT不加密的情况下,不能将秘密数据写入JWT

  3. JWT不仅可以用于认证,也可以用于交换信息。有效期使用JWT,可以降低服务器查询数据库的个数。

  4. JWT的最大缺点是,由于服务器不保存session状态,因此无法在使用过程中废弃某个token,或更改token的权限

  5. JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限

  6. 为了减少盗用,JWT不应该使用HTTP协议明码传输,使用HTTPS协议传输。

上一篇下一篇

猜你喜欢

热点阅读