我们所说的JWT实际上是JWS,一下的jwt全部值jws
jwt工作流程
- 认证服务器校验用户名和密码,创建token,包含用户身份信息和过期时间戳
- 认证服务器根据秘钥,对Header和Payload进行签名,发给客户端浏览器
- 客户端浏览器获得JWT token(令牌),然后在每个HTTP请求后都附带着
- 认证服务器检查JWT签名,确认Payload是由自身发出的
只有认证服务器拥有私钥,并且认证服务器只把token发给提供了正确密码的用户,因此应用服务器可以认为这个token是由认证服务器颁发的也是安全的,因为该用户具有了正确的密码.
JWT两个作用:
- 认证服务器和校验JWT token的应用服务器分离
- 应用服务器无状态(和session作用相同)
JWT包含:
- 头部Header:描述签名的算法,如RS256,告诉客户端如何验证
- 数据Payload:所要传送的信息,不加密,不要放敏感信息
- 签名Signature:信息验证码MAC,由Payload、Header和密钥生成
https://jwt.io/
可以看到jwt的样例
头部HEADER:
key | 描述 |
---|---|
typ | 类型,这里是jwt |
alg | Algorithm ,所使用的算法,这里是HS256 就是签名算法,如MD5 ,hmac 等 |
PAYLOAD
key | 描述 |
---|---|
iss | 签发这 |
sub | 接收者 |
exp(expires) | 过期 |
iat(issued at) | 签发时间 |
SIGNATURE
将header 和 payload,使用自己的secretkey进行编码
签名类型
HS256是MAC码的概念.它的劣势有:
1.HS256要求JWT的服务器和客户端有相同的秘钥(秘钥被分发在客户端,不安全)
2.如果修改密码后,我们要重新分发,很麻烦
3.JWT的创建和校验没有分离
RS256是rsa,不对称加密,可以解决HS256的问题
RS256需要
1.私钥,只有认证服务器拥有,签名JWT,不能用来校验
2.公钥,应用服务器拥有,校验JWT,即使暴露,也没问题
参考:
https://blog.angular-university.io/angular-jwt/
https://blog.youkuaiyun.com/y472360651/article/details/86011712
https://www.cnblogs.com/wenqiangit/p/9592132.html
https://zhuanlan.zhihu.com/p/70275218?utm_source=wechat_session&utm_medium=social&utm_oi=985800679562223616
https://www.cnblogs.com/xiekeli/p/5607107.html