客户端Session和服务端Session对比
引言
本来想作为Client Side vs Server Side Session的翻译,结果自己的英语太烂,怕翻译的太渣,只能自行根据几篇参考文章总结一下,如果有说的不对的地方,还请大家指出。(把Client Side Session翻译成客户端Session也让我觉得很别扭)。
故事背景是昨天和受泽讨论验证码如何进行验证,然后谈到了Flask(Python的一个MVC框架)使用的是Client Side Session,于是略作了解。
首先我们需要了解一下Session的工作原理,在文末的参考链接1有针对PHP的分析,可以供参考,上一篇模拟登陆中也节选了图解HTTP中的图片来说明一下问题,这是面试中的常见问题,我们之后再对比时也会做相应说明,这里稍微介绍一下,就是在客户端存SessionID之类的Cookie信息,每次访问把Cookie带去请求服务端,服务端进行验证操作,如果服务端有Cookie对应的Session信息,那么确认,把它拿出来使用即可。
那么既然如此,为什么又会分为Client Side Session和Server Side Session,他们的优缺点是什么——这是本文我们所想讲的内容:
Client Side Session
在Client Side Session中,所有的Session信息都存放在Cookie中,好处当然是你不用再每个节点都同步不断的更新数据,甚至是请求都少了许多(因为具体的数据已经存在Cookie中了,你可以直接读取,而不用进行服务端的IO操作),当然,我们首先得保证你的客户端中存放的数据是安全的(防止用户恶意篡改),也就是需要加密后进行存放。
之后如图,使用非对称加密,把私钥放在本地,服务端存放公钥,不同服务端间只要同步公钥就行(具体的内容存放在客户端中,因此修改不会频繁)。这样的话,无论是哪个客户端,都能找到任一服务端完成验证。
优点(基本都是围绕上文所述展开的):
- 低延时,由于不用在服务端进行数据的获取,只需要验证和创建两个步骤,使得整个流程变得很快。
- 故障而可能出问题的点更少,理由同上。
- 高度扩展性
- 任何分布式中的服务器都可以进行验证,而无需反复的同步操作
缺点:
- Cookie的大小受限
- 所有的信息都存放在客户端中,可能会导致信息泄露
- 无法完整的终止(可以通过设定保质期来解决这个问题)
- 一些功能如注销可能无法被完整的支持(就算移除了Cookie,再次提交之后依旧会出现)。
Server Side Session
Server Side Session也就是我们传统的模型,所有的数据都存放在服务器中,如果存在多个服务器同步,需要完整的同步Session,在客户端中存放的Cookie只记录与服务端的映射关系。
优点:
- 按需随时可控的结束Session
- Cookie的大小更小
- 由于数据存放在服务器中,所以数据较为安全
- 不用担心Cookie大小,想放多少数据就放多少数据
- 由于存放在我们的服务器而不是客户端中,所以我们可以随时改变我们对Session的管理机制
缺点:
- 更大的风险,如果存放Session的介质发生了故障,那么所有的Session都没办法访问。
- 对于多个服务器而言,同步和验证上的困难
##结语 对于这两种实现方式而言各有利弊,当然在Flask后续中,受泽尝试了将Session删除之后恢复Cookie,发现竟然依旧可以成功读取原值,大概所谓的不可终止也就是这个意思。
个人目前仍然倾向于传统的方法,似乎更为安全和可靠一点,一些部分由于没有切实的实践所以翻译或者说自己归纳的可能有些生硬,望大家多多指教。
##本文参考
https://www.pureweber.com/article/how-session-works/
http://phillbarber.blogspot.com/2014/02/client-side-vs-server-side-session.html
https://en.wikipedia.org/wiki/Session_(computer_science)#Client_side_web_sessions
评论 (0)