什么是JWT
JWT(JSON WEB TOKEN)是通信双方之间以 JSON对象的形式安全传递信息的方法。
其实可以理解为使用非对称算法来进行前后端校验。
JWT 的组成
JWT 由三部分组成
头部-Header
# alg是签名算法,默认是HS256,
# typ是token类型,一般JWT默认为JWT
{
"alg": "HS256",
"typ": "JWT"
}
然后按照此规则将头部信息进行base64编码,构成JWT第一部分
载荷-payload
payload 就是存放有效信息的地方
{
"key0": "value0",
"key1": "value1"
}
payload 中有一些参数字段是建议使用的 (仅列出几个)
| 参数 | 含义 |
|---|---|
| iat | jwt的签发时间 |
| exp | jwt的过期时间,这个过期时间必须要大于签发时间 |
| nbf | 定义在什么时间之前,该jwt都是不可用的 |
JWT规定了7个官方字段:
- iss(issuer):签发人
- exp (expiration time):过期时间
- sub (subject):主题
- aud (audience):受众
- nbf (Not Before):生效时间
- iat (Issued At):签发时间
- jti (JWT ID):编号
比如来定义一个payload
{
"exp": Math.floor(Date.now() / 1000) + (60 * 60),
"name": "John Doe"
}
payload 会进行base64编码,构成JWT第二部分
签证-Singnature
Signature 部分是对前两部分的签名,防止数据篡改。
需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256)。
let encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
let secret = "秘钥";
let singnature = HMACSHA256(encodedString, secret);
signature 是JWT的第三部分
将以上三部分拼接起来(中间用.分隔),就是最后的JWT