什么是JWT?   

       Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一 种基于 JSON 的开放标准((RFC 7519)定义了一种简洁的,自包含的方法用于 通信双方之间以 JSON 对象的形式安全的传递信息)。因为数字签名的存在,这些 信息是可信的,JWT 可以使用 HMAC 算法或者是 RSA 的公私秘钥对进行签名。   

基于 token 的鉴权机制

     基于 token 的鉴权机制类似于HTTP 协议也是无状态的,它不需要在服务端 去保留用户的认证信息或者会话信息。这就意味着基于 token 认证机制的应用 不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。

流程上是这样的:

1. 用户使用账号和密码发出 post 请求

2. 服务器使用私钥创建一个 jwt

3. 服务器返回这个 jwt 给浏览器

4. 浏览器将该 jwt 串在请求头中像服务器发送请求

5. 服务器验证该 jwt

6. 返回响应的资源给浏览器。

JWT优点

1.简洁(Compact): 可以通过 URL,POST 参数或者在 HTTP header 发送,因为数据量小,传输速度也很快

2.自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库

3.因为 Token 是以 JSON 加密的形式保存在客户端的,所以 JWT 是跨语言的,原则上任何 web 形式都支持。

4.不需要在服务端保存会话信息,特别适用于分布式微服务。

JWT 的构成

JWT 是由三段信息构成的,将这三段信息文本用.链接一起就构成了 Jwt 字符串。

就像这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiw ibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab3 0RMHrHDcEfxjoYZgeFONFh7HgQ

第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 用户的信息),第三部分是签证(signature).

header

jwt 的头部承载两部分信息:

(1) 声明类型,这里是 jwt

(2) 声明加密的算法     通常直接使用 HMAC HS256

完整的头部就像下面这样的 JSON:

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

然后将头部进行 base64 转码,构成了第一部分. eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

playload

载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效 信息包含三个部分

(1) 标准中注册的声明

(2) 公共的声明     公共的声明可以添加任何的信息,一般添加用户的相关信息或其 他业务 需要的必要信息.但不建议添加敏感信息(例如密码),因为该部分在客户端可解密. id,用户名,头像名

(3) 私有的声明

定义一个 payload

{ "sub": "1234567890", "name": "John Doe", "admin": true }

然后将其进行 base64 转码,得到 Jwt 的第二部分。 eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4i OnRydWV9

signature

jwt 的第三部分是一个签证信息,这个签证信息由三部分组成:

(1) header (base64 后的)

(2) payload (base64 后的)

(3) secret

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