跳到主要内容

认识

介绍

JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。

过程

  1. 服务器认证以后,生成一个token,返回给客户端。(也可以直接种到Cookie里面)
  2. 此后,客户端每次与服务器通信,都要带上这个token
    • Cookie 中自动发送: 不可以跨域
    • Authorization 手动发送: 可以跨域
  3. 服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展

结构

JWT结构如图所示:

它是一个很长的字符串,中间用点(.)分隔成三个部分。注意,JWT 内部是没有换行的,这里只是为了便于展示,将它写成了几行。

JWT 的三个部分依次如下:

  • Header(头部)
  • Payload(负载)
  • Signature(签名)

组合成Token 为: Header.Payload.Signature

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)

算出签名以后,把HeaderPayloadSignature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。