一、JWT是什么
JWT即JSON Web Token,是一种认证鉴权方式,一般是用在我们的http接口请求上,将认证信息返回到客户端,储存在客户端,每次的接口调用都需要带上验证信息。
二、JWT的结构
JWT一共分为三个部分,header(头部)、 payload(负载) 和signature(签名)。
JWT的格式如下所示:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
1. header(头部)
header是一个json对象,描述了加密算法的方式及验证方式。通常为如下所示:
{
"alg": "HS256",
"typ": "JWT"
}
然后对这个json对象进行base64url的编码。
2. payload(负载)
payload存放的是实际需要传递的数据,可使用官方推荐的字段,也可自定义字段。通常为如下所示:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
// 官方推荐的字段
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号
然后对这个json对象进行base64url的编码。
3. signature(签名)
signature主要是对header和payload进行签名,jwt 中常用的签名算法是 HS256,还需要一个用来加密的密钥secret。
具体格式如下:
HS256 (base64url(header) + '.' + base64url(payload), secret)
4.最终格式
将header、payload、signature用“.”连接起来。
base64url(header) + "." + base64url(payload) + "." + signature
base64Url方法:
由于JWT可以放在URL中(例如api.example/?token=xxx)。 由于URL中“+”,“/”,“=”会被转义掉,所以Base64URL中需要对他们做替换,即把"="去掉,"+"用"-"替换,"/"用"_"替换。
三、JWT的使用
成功生成jwt后,可将jwt存在localStorage里,进行http请求时,将信息通过header的Authorization字段携带过去。
四、JWT的验证
服务端接收到jwt字符串后,对jwt进行验证。
以下是node中的其中一种验证方式,直接调用了第三方库jsonwebtoken的方法。
var jwt = require('jsonwebtoken');
jwt.verify(jwtVal, 'your secret', function(err, decoded) {
console.log('解码----', decoded)
});
/** 使用正确密钥获取到的decoded为
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
**/
// 使用错误密钥获取到的decoded为 undefined
除此之外,还可以将header、payload用base64url的方法进行解码,在使用已知密钥进行加密,再将加密后的值与从客户端传来的值进行对比。
五、参考文档
JWT官方文档:https://jwt.io/introduction/
阮一峰JWT教程: https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html