JWT 原理 jwt验证方式是将用户信息通过加密生成token,每次请求服务端只需要使用保存的密钥验证token的正确性,不用再保存任何session数据了,进而服务端变得无状态,容易实现拓展。 加密前的用户信息,如: { "username": "vist", "role": "admin", "expire": "2018-12-08 20:20:20" } 客户端收到的token: 7cd357af816b907f2cc9acbe9c3b4625 JWT 结构 一个token分为3部分:
3个部分用“.”分隔,如: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c 头部 JWT的头部分是一个JSON对象,描述元数据,通常是: { "typ": "JWT", "alg": "HS256" } typ 为声明类型,指定 "JWT" alg 为加密的算法,默认是 "HS256" 也可以是下列中的算法: 载荷 载荷(payload)是数据的载体,用来存放实际需要传递的数据信息,也是一个JSON对象。 JWT官方推荐字段:
也可以使用自定义字段,如: { "username": "vist", "role": "admin" } 签名 签名部分是对前两部分(头部,载荷)的签名,防止数据篡改。 按下列步骤生成: 1、先指定密钥(secret) 2、把头部(header)和载荷(payload)信息分别base64转换 3、使用头部(header)指定的算法加密 最终,签名(signature) = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret) 客户端得到的签名: header.payload.signature 也可以对JWT进行再加密。 JWT 使用 1、服务端根据用户登录状态,将用户信息加密到token中,返给客户端 2、客户端收到服务端返回的token,存储在cookie中 3、客户端和服务端每次通信都带上token,可以放在http请求头信息中,如:Authorization字段里面 4、服务端解密token,验证内容,完成相应逻辑 JWT 特点
|