携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
我们都知道基于session的保持客户端会话的session是存储在服务端的, 这样带来的
-
第一个问题: 就是当客户端很多时会产生大量的I/O请求,这会大大拉低服务器的性能; -
第二个问题: 当存储session数据的服务器关机或者停机时则用户就无法使用网站了。当然可以进行集群管理,但这样仍会消耗掉额外的服务器。
ok,那么如何解决呢,于是就产生的JWT这项技术;
优点
jwt大部分的使用场景会是在请求是一次性的情况,并且有效期短,比如常见的邮箱激活账户策略。
上面所提到的session的问题使用jwt都可以解决,因为使用jwt的服务端不需要存取任何保持会话的数据,只需要每次将客户端传来的jwt重新验证一边就行了,当然使用jwt则尽量使用https进行传输,以防自己的jwt token泄露。
jwt也具有很好的扩展性,可以在分布式场景下不需要做额外的事情,比如使用session就需要进行多极处理。
缺点:
当用户推出登录时,如果jwt没有过期,则此时它仍然有效;如果想要销毁的话可以设置黑名单进行屏蔽,等过了过期时间后则将黑名单内容自动删除。
当jwt过期后,即使用户没有推出登录,则用户也不得不再次登录,也就是续签问题;如果不想此事发生,则就需要参考session机制了,此时也需要用到I/O。
关于jwt安全性,因为jwt签名部分是加密的,因此,只要你不在header或者payload存储隐私性的东西其实是没有问题的。
如果存储的数据过多,那么jwt计算就需要更多的时间,一次也会消耗低掉一部分性能。