JWT(json web token)
JWT 可以分三部分
第一部分:header 头部
第二部分:payload 载荷
第三部分:signature 签证
header 头部包含 声明类型,和加密算法类型 如 { 'typ': 'JWT', 'alg': 'HS256'}
payload 载荷包含
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识
也可以自定义添加一些信息如(用户名)
signature 签证是根据 header(头部)的算法和保存在服务器端的密钥对payload(载荷)进行数字签名得到的
把他们进行 base64 转换得到 Token 如下格式,三部分用点号分割
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJldmVyb25lIiwiYXVkIjoiYXVkIiwiaXNzIjoibHlmIiwiZXhwIjoxNTkxODcyMzA0LCJ1c2VySWQiOiIzMSIsImlhdCI6MTU5MTc4NTkwNCwianRpIjoibGlueWFmZWkiLCJ1c2VybmFtZSI6Imx5ZiJ9.JvBMth8SaTV3J6f0TWodGeHs7JW2mi839h7Ixme1Cig
Token 可以通过 base64 逆运算获得 header 和 payload 里的信息都是明文的(当然可以自己加密),所以不要放敏感信息
Token 使用的原理
1 登录时用户端把用户名和密码发给服务端
2 服务端验证用户名和密码通过后根据 JWT 生成 Token (其中加密算法的密钥保存在服务器端,不可泄漏)
3 服务端把带 Token 的数据返回给用户端
4 用户端把 Token 存储起来
5 以后每次再请求时直接把 Token 传给服务端
服务器端是如何知道 Token 是否被黑客修改或盗用的呢?
当服务器端得到 Token 时通过 base64 逆运算获取 header 信息和 payload 信息,通过header 信息可以知道算法类型,然后根据header 里的算法,把 payload 信息用保存在服务器端的密钥进行签名,把得到的签名和传过来的签名进行对比,一致说明信息正确,不一致说明数据被篡改重新登陆,在这个过程中因为密钥始终保存在服务器,所以一旦数据被修改签名得到的结果就会不一样,可以保证数据的完整性。
Tokens的优势
无状态、可扩展
在客户端存储的Token是无状态的,并且能够被扩展。基于这种无状态和不存储Session信息,负载负载均衡器能够将用户信息从一个服务传到其他服务器上。
安全性
请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,让我们少了对session操作。
token是有时效的,一段时间之后用户需要重新验证。
可扩展性
Token能够创建与其它程序共享权限的程序。
多平台跨域
我们提前先来谈论一下CORS(跨域资源共享),对应用程序和服务进行扩展的时候,需要介入各种各种的设备和应用程序。
Token 过期时间设置
通常为了提升效率,减少消耗,会把 Token 的过期时保存在缓存或者内存中。
使用 Refresh Token,一旦 Token 过期,就反馈给前端,前端使用 Refresh Token 申请一个全新 Token 继续使用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。