这里有关为什么使用token而不是session等我就不再一一赘述啦。我主要是想从它的格式以及安全机制两方面入手进行说明。
格式
众所周知,token由三部分组成——头部(head)、荷载(payload)、签名(signature)。
未经过编码的token格式:x.y.z(这里xyz表示三种不同字符串)
header
经过解码后,头部就是一个json格式数据,
alg
表示使用的加密算法
typ
表示使用的token的类型,使用
base64
加密(能被解密)。
这里可以再补充一下什么是base64加密吧!
payload
这里面的内容就是比较多的了,可以分为3种类型
1、官方预定义
2、使用者自定义
我们可以将用户的一些基本信息放在其中,例如唯一标识等字段
3、私密使用者自定义
可以传输一些线下约定好的数据(其实这里我也不知道是什么意思)
signature
这就是核心部分,能够由头部+荷载+公私钥组成,能够选择算法进行加密。一般推荐不可逆算法如:MD5,RSA等
安全机制
是否存在获取token信息可能?
在https中应该不是大可能的,如果在http中,首先我们需要知道payload中放的大都是唯一标识,设备号等信息,那么我们可以考虑使用密钥将整个token进行加密,接收方再通过密钥进行解密(需要线下商量)
如果篡改token信息怎么办?
这里我提供的思路是:首先将第一次颁发的token的签名用redis存储起来(过期时间可以与token一致),在后续通信中获取签名,也就是上面所说的z部分,因为一旦涉及到修改数据就会导致签名发生改变。我们在服务端将拿到的token经行加密,与redis中指定的签名进行比对校验。
这里再说一嘴:在学习过程中遇到了两款还不错的token框架auth0和jsonwebtoken,下面附上两者的区别和优缺点
Token插件:Auto0和jsonwebtoken对比 - it610.com
版权归原作者 还在路上的咩 所有, 如有侵权,请联系我们删除。