前几天新搭一个项目框架,在用户登录凭证选择上纠结了好久。之前我一直用的redis+token认证方式,这种方式感觉灵活也方便,然后同事说应该用JWT令牌方式,现在比较火。然后一场针对怎么选,选什么好的辩论展开了。针对这种技术选型的讨论,我觉得还挺有意思的,其实还是那句话:没有最好的方案,也不存在哪个更好,只是针对不同应用场景有做出合适的选择,那就是最好的。以下是我个人对token和JWT的对比理解:
共同点
- 两者都可以携带用户信息
- 都是访问资源的令牌
- 都是使服务端无状态化
- 都是只有验证成功后,客户端才能访问服务端上受保护的资源
区别
- JWT: 将 Token凭证 、过期时间还有用户信息等加密后存储于客户端,服务端只需要使用密钥解密进行校验(校验也是 JWT 自己实现的)即可,服务端不需要管理JWT令牌,因为 JWT 自包含了用户信息和加密的数据。
- Token:依赖于redis服务,增加了一个缓存中间件,增大系统的复杂度。
jwt劣势
- jwt加密方式会是密文变得很长,不便传输及管理。
- jwt实现令牌缓存在客户端,服务端无法管理,比如要往登录凭证缓存更多信息,没办法控制。
- jwt登录状态受客户端控制,如果做同一台机器只能一个用户登录这种服务端控制策略,不是很好做
token的劣势
- 增加了中间件是系统变得更复杂。
- 服务端得管理维护用户token,做服务迁移的时候,还得考虑用户登录凭证的迁移。
选择
个人觉得不管是JWT还是token没有觉得的好和坏,移动端应用我偏向选择token认证方式,accessToken+refreshToken认证机制更灵活,如果有单用户单一登录需求,最好用token认证方式。web端应用可以考虑采用JWT,登录凭证方便管理。
以上只是个人见解,由于研究的不是很深,想必还有很多不足的地方,欢迎各位大牛指正和补充。