JWT 简单了解一下
hanpy

JWT 的全称是 JSON Web Token

官方网站:https://jwt.io/

JWT 解决的问题

  1. 可以为多种终端提供统一的令牌格式
  2. 跨域认证的问题。(传统的web或者其他开发使用session,都会面临数据同步和持久化的问题)

JWT 的组成

从外观上来看,jwt就是一个很长的字符串,中间用两个点(.)分隔成三个部分,这三个部分分别是 Header(头部) 、 Payload(负载)、 Signature(签名)

1
2
# 写成一行就是这样的排列
Header.Payload.Signature

Header(头部)

Header 部分是一个 JSON 对象,描述 JWT 的元数据,比如其类型以及签名所用的算法等,可以表示为一个 json 对象

1
2
3
4
{
"alg": "HS256",
"typ": "JWT"
}

alg 属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256)

typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为 JWT

将上面的 JSON 对象使用 Base64URL 算法转成字符串

Payload(负载)

Payload 部分有7个官方规定的字段(不是必须的)

1
2
3
4
5
6
7
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号

还可以自定义字段,比如官网的例子

1
2
3
4
5
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}

将上面的 JSON 对象使用 Base64URL 算法转成字符串

Signature(签名)

Signature 部分是对前两部分的签名,防止数据篡改。指定一个密钥(secret),然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256)按照下面的公式计算出签名

1
2
3
4
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)

HeaderPayloadSignature 三个部分拼成一个字符串,每个部分之间用”点”(.)分隔,就可以返回给用户。