session和jwt
session
Session是把用户的具体信息,权限什么的,存在于服务端的。用户发过来的SessionId,它可以直接去对比一个Map。直接去查看的,这样的话,效率比较高。
优点
- 原理简单,易于学习。
- 用户信息存储在服务端,可以快速封禁某个用户。
缺点
- 占用服务端内存,硬件成本高。
- 多进程,多服务器时,不好同步-需要使用第三方缓存,如redis。
- 默认有跨域限制。
分布式情况下存在的问题
有两台机器,分别称为A和B。因为它是分布式的,所有一般的情况下是会有一个负载均衡服务器的。用户去访问的时候,它可能第一次去访问A,然后A记录了用户的信息。然后这个用户再去访问的时候,它可能就访问B了,比如说登录功能,它就会让你重新登录,特别影响用户体验。
分布式情况下问题的解决方案
再有一个服务器用于统一存放Session信息。但如果用户信息太多,一台服务器存不下怎么办?
答:用redis来解决该问题。一般就是用Redis做统一的存储或者说不同机器之间做一个同步。一般就是这两种情况。
jwt
JWT传过来之后,服务器是还需要进行解析的。这样的话,它的性能消耗是比较高的。
优点
- 不占用服务端内存
- 多进程,多服务器,不受影响
- 无跨域限制
缺点
- 用户信息存储在客户端,无法快速封禁某个用户。
- 万一服务端密钥被泄露,用户信息全部丢失。
- token体积一般大于cookie,会增加请求的数据量。
总结
- 如有严格管理用户信息的需求,推荐session。
- 如无特殊需求,使用jwt。
参考资料:前端面试第16题:session和jwt