Introduce JWT
JWT 是 JSON Web Token 的缩写,一种对于服务器完全无状态的身份认证方式。
这是一个开放标准1,用户登录后,每个后续请求都将包含 JWT,允许用户访问该令牌允许的路由、服务和资源。
单点登录是一项如今广泛使用 JWT 的功能,其开销小,并且能够在不同领域轻松使用。
在身份验证中,当用户成功使用其凭据登录时,将返回一个 JWT。
如何工作
通常用户名和加盐哈希运算后的密码会被 POST 到登录端点,服务器进行核对,如果正确,就会签发 JWT.
JWT 结构
JWT 由三个部分组成,并用点分隔.
xxxx.yyyy.zzzz分别对应头部,载荷和签名。
头部
头部通常由两个部分组成:令牌的类型(即 JWT)和所使用的签名算法,例如 HMAC SHA256 或 RSA。
{
"alg": "HS256",
"typ": "JWT"
}载荷
令牌的第二部分是有效载荷,其中包含所有用于标记的信息。通常包括但不限于:
- 签发时间
- 签发者
- 过期时间
- 权限
例如
{
"name": "Linserin Yang",
"admin": true,
"iat": 1516239022
}签名
要创建签名部分,需要取一下信息:
- 头部
- 载荷
- 仅存储在服务器的密钥
- 在头中指定的算法。
例如,如果要使用 HMAC SHA256 算法,将按照以下方式创建签名:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)计算结果就是 Token.
局限性
JWT 完全对服务器无状态,也就无法做到会话管理。唯一能够登出会话的方式是更换存储于服务器的密钥。而这也意味着是所有会话全部失效,不能登出特定的会话。
尽管有 Refresh Token 和 Access Token 配合等设计,但这也就引入状态了。