前言
在前面的学习中,我们已经学过了OAuth2,是一种第三方登录授权协议,今天我们要学习的是JWT,也是一种授权协议。为什么已经有OAuth2了,还要学习JWT呢,我们一起进入今天的学习。
什么是JWT
Json web toke(JWT)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC7519)定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名
Header 头部
头部包含了两个部分,token类型和采用的加密算法
{
"alg":"HS256",
"typ":"JWT"
}
他会使用Base64 编码组成 JWT 结构的第一部分
Base64 是一种编码,也就是说,他是可以被翻译回原来的样子的,它并不是一种加密过程。
Payload 负载
这部分是我们存放信息的地方,可以把用户id等信息放在这里,JWT 规范里面对这部分有进行了比较详细的介绍,常用的由 iss(签发者),exp(过期时间),sub(面向的客户),aud(接收方),iat(签发时间)
{
"iss":"lionluo JWT",
"iat":"1441593502",
"exp":"1441594722",
"aud":"www.exmaple.com",
"sub":"[email protected]"
}
也是使用Base64 编码组成JWT结构的第二部分
Signature 签名
前面两个部分都是使用Base64 进行编码的,即前端可以解开知道里面的信息。signature 需要使用编码后的header 和 payload以及我们提供的一个秘钥,然后使用header中指定的签名算法(HS256)进行签名,
三个部分通过 "。" 连接。
签名的作用:保证JWT没有被篡改过。
为什么使用JWT
传统token认证
- 客户端去授权服务器申请令牌
- 客户端携带令牌访问资源服务器
- 资源服务器访问授权服务器校验令牌的合法性
- 授权服务器返回校验结果
- 校验成功返回用户信息给资源服务器
- 资源服务器返回资源给客户端
缺点:用户每次请求资源服务,资源服务都需要携带令牌访问认证服务去校验令牌的合法性,并根据令牌获取用户的相关信息,性能低下
JWT认证
改进:利用公钥私钥完成对令牌的加密,如果加密解密成功,则表示令牌合法,如果加密解密失败,则令牌无效,不合法。
JWT使用
公钥和私钥
授权中心和资源中心分别持有公钥和私钥
私钥颁发令牌
公钥验证令牌
天行健,君子以自强不息。地势坤,君子以厚德载物。
参考文档:刘雪松老师的PPT