什么是 JWT?
JWT(Json Web Token),是一个开源biaozhun,轻量,携带者用户信息的 json 对象,安全的进行服务器端与客户端交互。
因为 JWT 轻量,所以可以放在 Http Header 里,在服务器与客户端之间快速交互;同时,可以将用户名等基本不涉及隐私的用户信息放在 JWT 中,不用再次从数据库中获取。
什么时候使用 JWT?
- 需要认证:用户根据 username,password 登录后,使用 JWT 返回一个 Token 给客户端,客户端在请求的时候将 Token 放在 Http Header 里
JWT 详解
-
基本结构
- Header
- Payload
- Signature
-
Header
用于描述该 JWT 的最基本信息,例如算法。{ "alg" : "HS256" }
这里我们说明这个 JWT 的算法是 HS256。同时,对于 Header 我们也要进行 Base64 编码。
-
PayLoad
负载中由程序员自己定义的一些信息,例如:{ "username": "pm2017", "role": "PROJECT_MANAGER", "privileges": [ "RETRIVE_USER" ], "exp": 1506609371 }
这里我们设置 PayLoad 的内容有 username、role、privileges,以及 exp 过期时间。
- Signature
将 Header 和 PayLoad 编码后的字符串用.
连接在一起,并使用 HS256(Header 中设定的算法)算法与服务端存储的秘钥 secret 一起进行加密,得到的值为 Signature
所以,完整的 JWT 是:header.payload.signature
总结
- 缺点
- 发布后在其有效期内一直有效,只能等过期
- 优点
- JWT 构成简单,字节占用小,便于传输
- 不会在服务端保存信息,易于扩展
- 安全相关
- 不应该在 JWT 的 Payload 部分存放敏感信息
- 保存好 secret
- 使用 JWT 后,服务端会验证 Token,验证通过会返回相应的资源。整个流程如下图: