认识
介绍
JSON Web Token
(缩写 JWT)是目前最流行的跨域认证解决方案。
过程
- 服务器认证以后,生成一个
token
,返回给客户端。(也可以直接种到Cookie
里面) - 此后,客户端每次与服务器通信,都要带上这个
token
。- Cookie 中自动发送: 不可以跨域
- Authorization 手动发送: 可以跨域
- 服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展
结构
JWT
结构如图所示:
它是一个很长的字符串,中间用点(.)分隔成三个部分。注意,JWT 内部是没有换行的,这里只是为了便于展示,将它写成了几行。
JWT 的三个部分依次如下:
- Header(头部)
- Payload(负载)
- Signature(签名)
组合成Token
为: Header.Payload.Signature
Header
Header
部分是一个JSON
对象,描述JWT
的元数据,通常是下面的样子:
{
"alg": "HS256",
"typ": "JWT"
}
- alg: 表示签名的算法(algorithm)默认是 HMAC SHA256(写成 HS256)
- typ: 表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT
Header
加密算法: 通过Base64URL
算法转换成字符串
Payload
Payload
是一个JSON
对象,用来存放实际需要传递的数据。JWT 规定了7
个官方字段,供选用:
- iss (issuer):签发人
- exp (expiration time):过期时间
- sub (subject):主题
- aud (audience):受众
- nbf (Not Before):生效时间
- iat (Issued At):签发时间
- jti (JWT ID):编号
除了官方字段,你还可以在这个部分定义私有字段:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Paylogd
加密算法: 通过Base64URL
算法转换成字符串
Signature
Signature
部分是对前两部分的签名,防止数据篡改。
首先,需要指定一个密钥(secret)
。这个密钥只有服务器才知道,不能泄露给用户。然后,使用Header
里面指定的签名算法(默认是 HMAC SHA256)
,按照下面的公式产生签名。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
算出签名以后,把Header
、Payload
、Signature
三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。