共计 1435 个字符,预计需要花费 4 分钟才能阅读完成。
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 信息可以知道算法类型,然后把 payload 信息用保存在服务器端的密钥进行签名,把得到的签名和传过来的签名进行对比,一致说明信息正确,不一致说明数据错误重新登陆,在这个过程中因为密钥始终保存在服务器,所以一旦数据被修改签名得到的结果就会不一样,可以保证数据的完整性。
Tokens 的优势
无状态、可扩展
在客户端存储的 Token 是无状态的,并且能够被扩展。基于这种无状态和不存储 Session 信息,负载负载均衡器能够将用户信息从一个服务传到其他服务器上。
安全性
请求中发送 token 而不再是发送 cookie 能够防止 CSRF(跨站请求伪造)。即使在客户端使用 cookie 存储 token,cookie 也仅仅是一个存储机制而不是用于认证。不将信息存储在 Session 中,让我们少了对 session 操作。
token 是有时效的,一段时间之后用户需要重新验证。
可扩展性
Token 能够创建与其它程序共享权限的程序。
多平台跨域
我们提前先来谈论一下 CORS(跨域资源共享),对应用程序和服务进行扩展的时候,需要介入各种各种的设备和应用程序。
Token 过期时间设置
通常为了提升效率,减少消耗,会把 Token 的过期时保存在缓存或者内存中。
使用 Refresh Token,一旦 Token 过期,就反馈给前端,前端使用 Refresh Token 申请一个全新 Token 继续使用。