Web Token
JSON Web Token
一般前端向后端发送请求 认证流程如下
- 可短向服务器发送用户名和密码
- 服务器验证通过,在当前session保存用户信息
- 服务器返回给客户端一个sessionId,写入用户cookie。
- 客户端每次请求携带sessionid。
- 服务器收到sessionid 进行验证,然后把数据返回给客户端。
JWT原理
JWT的原理是,服务器认证以后,生成一个json对象,发送给用户,就像下面这样。
{
userName:"张三",
roles:"admin",expireTime:"2018-7-01 12:0:0"
}
用户与服务端通信的时候,都要返回该json文件。服务器通过该json对象鉴定用户身份。
JWT的数据结构
JWT的组成部分由三个部分组成
Header(头部)
header部分是一个json对象,描述JWT的元数据,通常类似下面
{ "alg":"HS256", "typ":"JWT" }
alg属性表示签名的算法,默认是HMACSHA256;typ属性表示这个令牌(Token)的类型(type),JWT令牌统一写为JWT。
Payload(负载)
Payload部分也是一个json对象,用来存放实际需要传递的数据。JWT规定了7个官方字段,供选用。
iss(issuer)签发人
exp(expiration time)过期时间
sub(subject)主题
aud(audience):受众
nbf(Not before)生效时间
iat(issued AT)签发时间
jti(JWT ID):编号
除了以上字段,还可以定义私一些私有字段。
JWT默认是不加密的,任何人都可以读到,所以不要把秘密信息放在该部分。这个json对象也要使用base64ul算法转成字符串。
Signature(签名)
Signature部分是对前两部分的签名,防止数据篡改。首先,需要指定一个密钥,这个密钥只有服务器才知道,不能泄露给用户。然后使用header里面指定的签名算法,默认HMAC SHA256
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
算出签名后,把header payload signature三个部分拼成一个字符串,每个部分之间用
.
分割,Base64URL
header和payload串型算法是Base64URL.这个算法跟Base64算法基本类似,但有一些小的不同。JWT作为一个令牌,有些场合可能会放到URL。Base64有三个字符+、/和=,在URL里面有特殊含义,所以要被替换掉:
=
被省略、+
替换成-
,/
替换成_。这就是Base64URL算法。JWT的使用方式
客户端收到服务器返回的JWT,可以存储再Cookie类里面,也可以存储再localStorage。此后,客户端每次与服务器通信,都要带上这个JWT。你可以把它放在Cookie里面自动发送,但是这样不能跨域,所以更好的做法是放在HTTP请求的头信息Authorization字段里面。
JWT的特点
JWT默认是不加密的,但也是可以加密的。生成原始Token以后,可以用密钥再次加密一次
JWT不加密的情况下,不能将秘密数据写入JWT
JWT不仅可以用于认证,也可以用于交换信息。有效期使用JWT,可以降低服务器查询数据库的个数。
JWT的最大缺点是,由于服务器不保存session状态,因此无法在使用过程中废弃某个token,或更改token的权限
JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限
为了减少盗用,JWT不应该使用HTTP协议明码传输,使用HTTPS协议传输。