JWT的工作原理
参考地址:
https://www.cnblogs.com/cjsblog/p/9277677.html
https://baijiahao.baidu.com/s?id=1608021814182894637&wfr=spider&for=pc
什么是JWT
JWT: JSON Web token 用于json对象在各方之间安全的传输信息,它是安全可被信任的,因为它是数字签名的。JWT是目前最流行的跨域身份验证解决方案
JWT应用场景
-
Authorization(授权):用户登录后,以后的每个请求中都包含JWT,允许用户访问该令牌允许的路由,资源和服务。单点登录是目前广泛使用的JWT的一个特性,因为它开销很小,而且可以轻松跨域使用
PS:单点登录:(Single Sign On),简称为 SSO,SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
-
Informatica Exchange(信息交换):由于JWT可以是数字签名,且可以验证内容是否被篡改,因此对于在各方之间安全传输信息而言,是一种很好的方式
JWT结构
-
Header
header典型的由2个部分组成:token的类型(jwt)和算法名称(如SHA256,RSA等)
例如:{ "alg":"HS256", "typ":"JWT" }
然后用base64对这个json编码就得到JWT的第一个部分
-
payload
payload是JWT的主体部分,包含了需要传递的数据。JWT指定7个默认字段供选择
- iss:发行人
- exp:到期时间
- sub:主题
- aud:用户
- nbf:在此之前不可用
- iat:发布时间
- jti:JWT ID用于标识该JWT
除了上述默认字段,还可以定义私有字段,例如:
{ "sub": "1234567890", "name": "chongchong", "admin": true }
对payload进行base64编码就得到JWT的第二个部分
PS:默认情况下JWT是未加密的,任何人都可以解读其内容,因此不要在header和payload
构建隐私信息字段,存放保密信息,以防止信息泄露。 -
Signature
Signatu是指签名部分,它是由编码过的header,编码过的payload,一个密钥,签名算法是header中指定的那一个,例如:
HMACSHA256(base64UrlEncode(header) + "."+ base64UrlEncode(payload), secret)
签名是用于验证消息在传递过程中有没有被更改,并且,对于使用私钥签名的token,它还可以验证JWT的发送方是否为它所称的发送方。
JWT如何进行工作
当用户使用他们的凭证登录成功后,一个JWT就会被返回,此后,这个返回的token就是用户凭证。无论何时用户想要访问受保护的路由或者资源的时候,用户代理(浏览器)都应该带上JWT。保存JWT的时间不应该超过你所需要的时间,否则可能会出现安全问题。通常JWT放在Authorization header中
header看起来应该是这样:
Authorization: Bearer <token>
服务器上受保护的路由会检查Authorization header中的JWT是否有效,如果有效,则用户可以访问受保护的资源
JWT工作:
- 应用或客户端向授权服务器请求授权
- 当授权被许可后,授权服务器返回一个access token给应用
- 客户端存储token,并且在随后的每一次请求中都带着它
- 服务器校验token并返回数据