一、什么是JWT

JWT是JSON Web Token的缩写,JSON Web Token是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,可以将各方之间的信息作为JSON对象安全地传输。该信息可以被验证和信任,因为它是经过加密的。

二、JWT结构

.NET Core WebAPI 认证授权之JWT(一):JWT介绍_java

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。如:

.NET Core WebAPI 认证授权之JWT(一):JWT介绍_java_02

最后可以使用jwt.io Debugger解码,验证或生成JWT。

注意:虽然签名过后的Token可以防止篡改,但是Token的信息是公开的,任何人都可以读取,所以尽量不要在有效载荷或标头传递敏感信息(如密码)。

三、JWT认证授权流程

.NET Core WebAPI 认证授权之JWT(一):JWT介绍_java_03

偷了张图    

认证授权流程客户端使用账号和密码访问鉴权中心进行认证 =》鉴权中心验证账号密码,正确则生成并返回Token =》客户端使用Token访问API =》API验证Token,有效则返回数据。

该流程中有基本的三个对象:鉴权中心API 客户端,是三个独立的模块。

在这个过程中,有两点需要注意:

1.Token安全问题?

由于Token是访问数据的凭证,所以需要格外注意Token安全问题。首先不应该将Token保存太久,会设置一个过期时间。其次,在使用浏览器请求时,切勿将Token放在浏览器本地存储(local-storage)中。每当用户想要访问受保护的资源时,用户都应该带上Token,通常会放在Authorization请求标头中,如下:

Authorization: Bearer <token>

2.API如何验证客户端携带的Token是否有效?

这里就用到了签名,也就Token的第三部分,JWT有两种常见的签名算法:HMACRSA
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.单点登录友好

没有跨域问题,轻松实现单点登录。