JWT
Json Web Token ,是Token的一种实现方式,本质上是一条字符串。
Token
Token的意思是“令牌”,简单说Token就是一种身份认证方式,基于Token的用户认证是一种无状态的认证方式。而所谓无状态指的是在服务端不需存储token数据或者登录用户信息,而是在客户端的每次请求时,携带在请求头里一起到达服务端,用户信息则存储在Token中,由服务器来解析Token以达到验证的目的。
无状态与有状态的对比
有状态:
服务端存储用户信息(当然,只有用户已经登录过了才会在服务端存储信息)。
缺点:当用户量大时,服务端会存储大量的用户信息(无论是在Session域中还是Redis中),会给服务端带来很大的存储压力。
优点:存储在服务端数据很安全(因为服务器是很难攻破的,而请求是可以被抓包的)。
无状态:
服务端不存储用户信息,而是每次请求中携带Token (服务器不知道用户有没有登录,只能每次都通过解析Token获取用户信息)。
缺点:容易被截获,一旦Token的密钥泄露,客户端则可以任意访问服务端。
优点:节省服务端存储,支持跨域。
JWT结构
JWT由三部分组成,分别是标头(Header)、载荷(payload)、签名(Signature)
分别解析这三部分都是什么:
Header标头
是一个Json对象,用来描述JWT元数据,存储alg(签名算法),type(Token类型)等信息
Header Json对象会以Base64Url编码方式编译成字符串。
Payload载荷
主体内容部分,也是一个Json对象,Payload主要承载了一些用户信息,例如用户Id。Payload的Json对象也是通过Base64Url编码方式编译成字符串。
注意:因为Base64Url编码是著名的防君子不防小人,所以并不建议在Payload中存储用户的敏感信息
Signature签名
该部分是将前两部分Base64Url编码后的字符串,用 "." 拼接在一起后,再使用Header中记录的签名算法进行加密产生第三条字符串。
Signature的作用是使用不可逆的加密算法来保存前两部分的信息,目的是校验JWT是否被修改过。
三条字符串以 "." 拼接后就组成了一条完整的JWT。这种结构,既保证了JWT的不会被篡改,又易扩展(可以携带用户信息)