JWT和token的区别及优缺点
TOKEN
概念: 令牌, 是访问资源的凭证。
1、Token的认证流程:
-
用户输入用户名和密码,发送给服务器。
-
服务器验证用户名和密码,正确的话就返回给客户端一个签名过的token。
-
浏览器客户端拿到这个token,存储到cookie或者localStorage中。
-
客户端后续每次请求中,会在 header中携带token发送给服务器。
-
服务器器验证token并解析出用户ID等相关信息,通过调取数据库信息比对,如果有效那么认证就成功,可以返回客户端需要的数据,无效则返回错误信息引导客户端跳转到登陆页面。
2、Token的优点:
1.可以隐藏真实数据
2.适用于分布式或微服务
3.安全系数高
3、Token缺点:
1、需要解析后,调用数据库比对来验证,浪费服务器资源
2、内存级别重启全部失效
3、时效性,无法失效,被非法获取后可以一直使用
4、集群部署,多台服务器无法共享,负载会导致用户状态不同步
JWT
1、概念:
JWT是json web token缩写。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。
2、组成:
WT包含三个部分: Header头部,Payload负载和Signature签名。由三部分生成token,三部分之间用“.”号做分割。 列如 :
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
-
Header
在Header中通常包含了两部分:
-
type:代表token的类型,这里使用的是JWT类型。
-
alg:使用的Hash算法,例如HMAC SHA256或RSA.
例如:
{ "alg": "HS256", "typ": "JWT" } 这会被经过base64Url编码形成第一部分
-
-
Payload
token的第二个部分是荷载信息,它包含一些声明Claim(实体的描述,通常是一个User信息,还包括一些其他的元数据) 声明分三类:
(1)Reserved Claims,这是一套预定义的声明,并不是必须的,这是一套易于使用、操作性强的声明。包括:iss(issuer)、exp(expiration time)、sub(subject)、aud(audience)等
(2)Plubic Claims, 公共的声明
(3)Private Claims,私有的声明,即交换信息的双方自定义的声明
例如:
{ "sub": "1234567890", "name": "John Doe", "admin": true } 同样经过Base64Url编码后形成第二部分
-
signature
是一个签证信息。使用header中指定的算法将编码后的header、编码后的payload、一个secret进行加密。 例如:
使用的是HMAC SHA256算法,大致流程类似于:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
这个signature字段被用来确认JWT信息的发送者是谁,并保证信息没有被修改 。
这三部分连接成一个完整的字符串,构成了最终的jwt
例如下面这个例子:
现在有一个接口/viptest只能是vip用户访问,我们看看服务端如何根据Token判断用户是否有效。
普通token版:
查库判断是否过期
查库判断时候是VIP
JWT 版本:
假如payload部分如下:
{
"exp": 1518624000,
"isVip": true,
"uid":1
}
解析JWT
判断签名是否正确,根据生成签名时使用的密钥和加密算法,只要这一步过了就说明是payload是可信的
判断JWT token是否过期,根据exp,判断是否是VIP,根据isVip
从以上不难看出:JWT版是没有查库的,他所需要的基础信息可以直接放到JWT里,服务端只要判断签名是否正确就可以判断出该用户是否可以访问该接口,当然JWT里的内容也不是无限多的,其他更多的信息我们就可以通过id去查数据库
3、优点:
1.无需服务器端存放数据,减轻服务器端的压力
2.占用带宽比较小、跨语言
3.token自身包含用户信息且无法篡改,在服务(网关)中可以自行解析校验出用户信息,对认证服务器(account-svc)压力小
4、缺点:
1.建议不要放铭感数据 userid、手机号码(如果非要放userId,deptId等信息,可采用rsa256算法加密)RSA256生成Jwt
2.Jwt生成之后无法修改(发生变化)
3.后端无法统计 生成jwt
4.无法吊销令牌,只能等待令牌自身过期
5.令牌长度与其包含用户信息多少正相关,传输开销较大
6.Jwt是无状态的,如果别人获取到了,别人也能用
结论:
对于使用token还是jwt,就要针对具体使用情况而定,最为科学。觉得我个人总结不错的话,可以添加收藏哦!