一、什么是JWT
JWT是JSON Web Token的缩写,JSON Web Token是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,可以将各方之间的信息作为JSON对象安全地传输。该信息可以被验证和信任,因为它是经过加密的。
二、JWT结构
Token原文
Token由三部分组成,通过"."分隔,分别是:
● 标头● 有效载荷● 签名
所以JWT表示为:xxxxx.yyyyy.zzzzz
1.标头
标头通常由两部分组成:令牌的类型(JWT)和所使用的签名算法(HMAC SHA256或RSA)。
{
"alg": "HS256",
"typ": "JWT"
}
然后此JSON被Base64Url编码以形成JWT的第一部分。2.有效载荷
有效负载中包含声明。声明是有关实体(通常是用户)和其他数据的声明,用来传递数据。官方规定了7个非强制但建议使用的字段:
● iss(issuer):签发人● exp(expiration time) :过期时间● sub(subject):主题● aud(audience):受众● nbf(not befaore):生效时间● lat(issued at):签发时间● jti(jwt id):编号
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
然后对此JSON进行Base64Url编码形成JWT的第二部分。3.签名
签名是将第一部分(header)、第二部分(payload)、密钥(key)通过指定算法(HMAC、RSA)进行加密生成的。例如,如果要使用HMAC SHA256(HS256)算法,则将通过以下方式创建签名:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
生成的签名就是JWT的第三部分。将这三部分拼接在一起并使用"."分隔后形成的字符串就是Token。如:最后可以使用jwt.io Debugger解码,验证或生成JWT。
注意:虽然签名过后的Token可以防止篡改,但是Token的信息是公开的,任何人都可以读取,所以尽量不要在有效载荷或标头传递敏感信息(如密码)。
三、JWT认证授权流程
偷了张图
认证授权流程:客户端使用账号和密码访问鉴权中心进行认证 =》鉴权中心验证账号密码,正确则生成并返回Token =》客户端使用Token访问API =》API验证Token,有效则返回数据。
该流程中有基本的三个对象:鉴权中心、API、 客户端,是三个独立的模块。
在这个过程中,有两点需要注意:
1.Token安全问题?
由于Token是访问数据的凭证,所以需要格外注意Token安全问题。首先不应该将Token保存太久,会设置一个过期时间。其次,在使用浏览器请求时,切勿将Token放在浏览器本地存储(local-storage)中。每当用户想要访问受保护的资源时,用户都应该带上Token,通常会放在Authorization请求标头中,如下:
Authorization: Bearer <token>
2.API如何验证客户端携带的Token是否有效?
这里就用到了签名,也就Token的第三部分,JWT有两种常见的签名算法:HMAC和RSA。
①HMAC全称哈希消息认证码,是一种具有密钥的哈希算法,以一个密钥和一个消息为输入,生成消息摘要作为输出。 鉴权中心:key1 API:key1双方持有相同的 key1 ,鉴权中心验证账号密码成功后,使用 key1 进行HMAC加密后得到Token并返回给客户端,客户端使用该Token访问API时,API使用 key1 进行解密,如果能够解密,则说明Token是来自鉴权中心,进一步验证Token是否过期,没过期则返回数据。②RSA是一种非对称可逆加密,具有一对不同的密钥(公钥和私钥),如果使用公钥加密,那么只有私钥能解密,如果使用私钥加密,则只有公钥能解密。 鉴权中心:private_key API:public_key首先借助第三方工具,生成一对RSA密钥( private_key 和 public_key ),然后将 private_key 给鉴权中心,将 public_key 给API。鉴权中心验证账号密码成功后,使用 private_key 进行RSA加密后得到Token并返回给客户端,客户端使用该Token访问API时,API使用 public_key 进行解密,如果能够解密,则说明Token是来自鉴权中心,进一步验证Token是否过期,没过期则返回数据。
四、JWT对比传统认证授权模式(Session、Cookies)的优劣势
1.减轻服务器压力
Token自身包含了信息,并且不需要将Token存储在服务器,可以有效减轻服务器压力。
2.可以多端使用
可以将Token用于移动端、小程序、桌面程序等,打破了传统模式只能用于浏览器的局限性。
3.单点登录友好
没有跨域问题,轻松实现单点登录。