JWT的全称是Json Web Token,是一种基于JSON的、用于在网络上声明某种主张的令牌(token)规范。
JWT由三部分组成:header、payload、signature,各部分通过 ‘ . ’ 连接。
例如:XXXX.YYYY.ZZZZ
1、HEAD
头部是一个JSON对象,存储描述数据类型(JWT)和签名算法(HSA256、RSA256),通过Base64UrlEncode编码后生成head 。
编码:eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9
解码:
{
"alg": "RS256",
"typ": "JWT"
}
2、PAYLOAD
负载存放一些传输的有效声明,可以使用官方提供的声明,也可以自定义声明。同样通过Base64UrlEncode编码后生成payload。声明可以分为三种类型:
Registered claims:
官方预定义的、非强制性的但是推荐使用的、有助于交互的声明(注意使用这些声明只能是三个字符)。
名称 | 作用 |
---|---|
iss (issuer) | 签发人 |
sub (subject) | 主题 |
aud (audience) | 受众 |
exp (expiration time) | 过期时间 |
nbf (Not Before) | 生效时间 |
iat (Issued At) | 签发时间 |
jti (JWT ID) | 编号 |
Public claims:
保留给JWT的使用者自定义。但是需要注意避免使用IANA JSON Web Token Registry中定义的关键字。
Private claims:
保留给JWT的使用者自定义,用来传送传输双方约定好的消息
编码:
eyJhdWQiOiLopb_pl6jpmL_mtaoiLCJkYXRhIjoiXCLopb_pl6jpmL_mtapcIiIsImlzcyI6IkhBTkdIVUFfQURNSU4iLCJleHAiOjE2MjIzNjA4NDEsImlhdCI6MTYyMjM2MDg0MX0
解码:
{
"aud": "西门阿浪",
"data": "\"西门阿浪\"",
"iss": "HANGHUA_ADMIN",
"exp": 1622360841,
"iat": 1622360841
}
3、SIGNATURE
数据签名是JWT的核心部分,构成较为复杂,且无法被反编码。
HS256加密:
signature = HMACSHA256( base64UrlEncode(header) + "." +base64UrlEncode(payload), secret );
RS256加密:
signature = RSASHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload), publicKey, privateKey)
signature可以选择对称加密算法或者非对称加密算法,常用的就是HS256、RS256。
- 对称加密: 加密方和解密方利用同一个秘钥对数据进行加密和解密。
- 非对称加密: 加密方用私钥加密,并把公钥告诉解密方用于解密
4、JWT执行逻辑
文章评论