JWT介绍
JSON Web Token(JWT)是目前最流行的基于token的跨域身份验证解决方案。
在JWT极高的安全特性下保证了token的不可伪造和不可篡改,从而可实现易扩展、轻存储、高安全的无状态、分布式的Web应用授权。
本质上JWT是一个独立的身份验证令牌,可以包含用户标识、用户角色和权限等信息,以及可以存储任何其他信息(自包含)。任何人都可以轻松读取和解析,并使用密钥来验证真实性。
JWT的特点:
- 存储性能
- JWT将用户的状态分散到了客户端中保存,可以远远减少服务端的压力。相比较于通过Session方式实现身份验证有许多弊端:Session是存储在服务器端的,所以需要占用大量服务器内存,对于较大型应用而言可能还要保存许多的状态,一般还需借助nosql和缓存机制来实现session的存储,如果是分布式应用还需session共享。
- .兼容性
支持移动设备,支持跨程序调用,Cookie 是不允许垮域访问的,而 Token 则不存在这个问题。 - 单点登录
JWT能轻松的实现单点登录,因为用户的状态已经被传送到了客户端。token 可保存自定义信息,如:用户基本信息,web服务器用key去解析token,就获取到请求用户的信息了。我们也可以配置它以便包含用户拥有的任何权限。这意味着每个服务不需要与授权服务交互才能授权用户。 - 可拓展性
因为JWT的信息是保存在客户端的,在分布式系统中JWT不存在进行用户身份验证时的Session共享问题,只要拿到用户的信息对其进行JWT方式的验证就可以判断他的身份合法性,那么就很方便进行服务端的扩展。 - 安全性
因为JWT会通过数字签名实现身份验证的校验,所以他可以防止数据信息被篡改,达到很高的安全性。
JWT结构
JWT包含三个由点分隔的部分,它们分别是:
Header(头部)
Header通常由两部分组成:令牌的类型,即JWT。和用于签名加密的算法名称,如HMAC SHA256或RSA。Header部分的JSON被Base64Url编码,形成JWT的第一部分
{
“alg”: “HS256”,
“typ”: “JWT”
}
Payload(载荷)
Payload中放传输的信息,用户信息等用于传输的信息。Playload部分的JSON被Base64Url编码,形成JWT的第二部分。
{
“iss”: “发送人”,
“sub”: 主题”,
“aud”: “接受人”,
“exp”:”过期时间”,
“iat”:”签发时间”
“id”:”用户id”,
“name”:”用户姓名”
}
Signature(签名)
Signature用来验证发送请求者身份,由前两部分加密形成。要创建签名部分,您必须采用编码标头,编码有效载荷,秘钥,标头中指定的算法并签名。Signature部分的JSON被Base64Url编码,形成JWT的第三部分。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
其中secret时加密用的密钥
最后:将三者经过Base64Url编码后的内容通过点分隔后合成一个字符串放入token,并将token放入cookies中传给前端保存,服务器只要保存统一的密钥用于解密