Token的常⽤实现⽅式
简述
通常的Token在服务器端的实现⽅式有这⼏个:
1.⽤SessionID实现Token的功能
2.⽣成Token存在数据库(关系型数据库)
3.⽣成Token存在Redis(⾮关系型数据库)
4.使⽤JsonWebToken(JWT)
下⾯分析⼀下各个存储⽅式的优缺点
Session
对于每个会话,服务器会⽣成Session保存在服务器上,⽽对应的SessionID⾃动通过HTTP头中的Set-Cookie返回保存在浏览器等客户端中,每
次请求客户端都会带上SessionID,然后服务器通过SessionID找到Session判断⽤户状态。
优点:
1.操作简单,⼀般⼩项⽬使⽤起来完全没问题
缺点:
n⽂件可能需要共享。当需要多个服务器做负载均衡时⿇烦就来了,由于Session以⽂件⽅式存储在服务器硬盘中,就会出现只有⼀个
服务器存在会话Session⽂件,⽽其他服务器没有该会话的Session⽂件的情况。
(解决该问题可以参考/wangtao_20/p/)
2.⼀些客户端不会⾃动保存和发送SessionID,如⼩程序,需要⼿动在请求头Set-Cookie中加上
⽣成Token并存在数据库(关系型数据库)
如字⾯意思,就是⼿动⽣成Token串存在数据库中,将Token返回客户端并且每次客户端请求都带上这个Token。
优点:
1.由于Token在数据库中⽽不像Session存在本地,⽅便管理与多服务器⽀持。
缺点:
1.验证效率问题。每次验证⽤户状态都要⾛数据库,增加了数据库的负担,不过在⽤户量不是特别庞⼤的情况下没问题(毕竟⼤部分⽤户请求都
要经过数据库,顺便验证⼀下问题不⼤)
⽣成Token并存在Redis(⾮关系型数据库)
也是⼿动⽣成Token,但这次是存在Redis中⽽不是关系数据库中。
优点:
1.由于Token在Redis中⽽不像Session存在本地,⽅便管理与多服务器⽀持。
2.由于Redis跑在内存中,验证效率快上很多
缺点:
的快的优点也导致了它的缺点,Redis跑在内存中,⼀旦Redis服务器崩了,此时⼀些数据就会丢失
使⽤JsonWebToken(JWT)
简单来说JWT就是通过可逆加密算法,⽣成⼀串包含⽤户、过期时间等关键信息的Token,每次请求服务器拿到这个Token解密出来就能得到⽤
户信息,从⽽判断⽤户状态。
优点:
1.⽆论哪个服务器解出来的Token信息都⼀样,⽽且不需要做任何查询数据库操作,省掉了数据库/Redis的开销
缺点:
1.⽆法主动更新Token的有效性,只要⽤户传回来的Token没有过期,服务器就会认为这个⽤户操作是有效的。⽐如⼀下这个场景:某⽤户被封
禁,此时该⽤户所有操作都应该被禁⽌,但是由于之前发给⽤户的JWTToken还没有过期,服务器仍然认为该⽤户操作合法。有⼀个解决⽅案
是维护⼀张JWT⿊名单表,只有没在表上的⽤户的JWT是有效的。但是随之⽽来⼜有⼀个问题便是这个JWT⿊名单表存在哪⾥。存在服务器,
那么⼜要搞多服务器同步。存在关系数据库,那么查数据库效率⼜低。存在Redis,则⼜回到了Token丢失问题。。
2.其实解析JWTToken也是消耗服务器CPU的
总结
个⼈意见是⼤型项⽬可以使⽤Token+Redis/Token+数据库,这个Token可以是⾃⼰⽣成,也可以是JWTToken,只不过验证还是⾛Redis/数
据库。对于要求不⾼的项⽬,Session/JWT也是可以胜任的。
本文发布于:2022-12-31 22:46:37,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/68300.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |