1> 授权 用户一旦通过登录认证, 会被下发一个token, 之后的每次请求都会带上这个token, 将能访问该token允许的资源/服务, 单点登录广泛采用了jwt, 因为它负载轻量且自然跨域使用。
2> 信息交换 jwt中含有轻量用户数据,有效使用JWT,可以降低服务器查询数据库的次数。利用非对称的公钥私钥,还可以做到可信的信息交换。
核心优势:
jwt一般附加在请求头:Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzU1MTkwNTEyLCJpYXQiOjE3NTQ4MzA1MTIsImp0aSI6ImRiY2M2ZjE4ODVlZjRmNTliODgxMzUyNzBiYWY1NTU2IiwidXNlcl9pZCI6MX0.JBQD87mcrRm6dG4tYdrxqV_fVDeuonsbPyJr2mgiFiM
静态结构有点类似基本身份认证basic authentication:Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
jwt token分为三块, 中间用.连接
base64({
"token_type": "access",
"exp": 1755190512,
"iat": 1754830512,
"jti": "dbcc6f1885ef4f59b88135270baf5556",
"user_id": 1
})
如果使用HS256对称加密算法:
sign= HMACSHA256(base64(header) + "." +base64(payload),secret)
jwt payload中的claims
iss | Issuer | 发牌人 |
sub | Subject | 主题 |
aud | Audience | claim的受众 |
exp | Expiration Time | 过期时间 |
iat | Issued At | 发牌时间 |
jti | JWT ID | jwt 的唯一id,用于防止重放攻击、或注销token |
jti
是否已在“已使用列表”或“黑名单”中来拒绝重复请求。jti
作为 key 存储在 Redis 中,实现 Token 注销(logout)功能。
例如:用户登出后,将 jti
加入黑名单,后续请求即使有有效签名也会被拒绝。客户端携带jwt token,服务端完整的校验流程
1> validation
2> verification
密码学原理:
特性 | 对称加密 | 非对称加密 |
---|---|---|
加解密效率 | ✅ 高 | ❌ 较低 |
密钥管理 | ❌ 难(需安全分发) | ✅ 易(公钥可公开) |
能否确认发送者身份? | ❌ 不能(无不可否认性) | ✅ 能(通过数字签名 |
简单解释对称加密为什么没有不可否认性。 A携带token请求B: A请求:info=从账户转出100, sign=HS256对称加密(info, secret)到B; B因为要校验A服务,也共享有A的secret, B也可以发出信息且产生sign=HS256(info, secret), 最终这个结果不能推断出是A发出的信息。 非对称加密为什么可以?是因为用私钥签名后, 虽然可能很多人持有公钥能验签, 但根据私钥的私密性和非对称加密的配对性,能推断信息是持有私钥的一方发送的。