JWT是什么
JWT:Json Web Token,本质为一个字符串。可以应用于:
- 授权:登陆验证。将服务端响应的JWT Token携带在在每个请求的Authorization进行登陆验证
- 信息交换:利用公钥、密钥对,可以进行签名,将信息数据在多方之间安全的进行数据传递。且基于Header与Payload部分进行签名计算,还可以验证内容是否被篡改
组成部分
Header:描述JWT元数据的Json对象。
- alg表示签名使用的算法,默认为HMAC SHA256(写为HS256)
- typ表示令牌的类型,JWT令牌则写为JWT
{
"alg": "HS256",
"typ": "JWT"
}
Payload:有效载荷,JWT的主体部分。Json结构,表明需要传递的数据。
七个默认可选字段:
-
iss(issuer):发行人
-
iat(issued at):发布时间
-
exp(expiration):到期时间
-
sub(subject):主题
-
aud(audience):用户
-
nbf(not before):在此之前不可用
-
jti:JWT ID用于标识JWT Token
除此之外,可指定自定义字段,一般会把用户的非敏感数据放入到Payload中,例:
{
"sub" : "test",
"name": "CQQ",
"job" : "developer"
}
Signature:对Header & Payload部分经过Base64处理后的数据,通过Header中指定算法生成签名数据,用于确保数据不会被篡改。
如何确定数据没有被篡改:Base64解开Header & Payload的明文数据,JWTString中其余的数据则为签名数据,服务器会存储一个不公开的密钥,通过该密钥进行:
HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)
将结果与刚刚得到的签名数据进行一致性对比。
完整的JWT String
JWTString=Base64(Header).Base64(Payload).HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)
JWT的类别
- nonsecure JWT:不签名,不安全
- JWS:
- JWE:Payload部分加密
类别 | 全称 | 说明 |
---|---|---|
JWS | JSON Web Signature structure | 消息会被签名,payload只是简单的base64加密。可防止篡改,但不防止被查看。 |
JWE | JSON Web Encryption structure | 消息会被签名 & 加密,没有钥匙无法解密消息。可防止篡改、查看。 |
优势
JWT基于Token认证方式对比传统的Session认证方式:
- 跨域:因为不应用Cookie,更好的支持跨域访问
- 简洁:JWT Token数据量小,故传输速度也快
- 适用于多端:对于不支持Cookie机制的客户端,基于请求头携带的Token的机制可以更好的支持
- 无状态:相比传统的Session机制,不需要在服务器存储用户信息及状态。这些数据都在客户端进行存储,节省服务器资源
实际应用
Java版本的基于JWT的登录验证:gitee