cookie 篇在作者的上一篇文章 Cookie 和 Session 在 Node.JS 中的实践 (一) 已经是写得算是比较详细了, 有兴趣可以翻看, 这篇是 session 篇, 重点在讨论 seesion 的特性, 概念, 以及 session 和 cookie 的区别和联系.
之前有人问我, 这个问题有必要长篇大论的探讨吗? 其实只要我觉得这个技术点重要而且具有迷惑性, 就值得去写, 去探讨, 否则你很难完全明白. 写这种文章有两个好处:
首先, 于作者而言, 写出来文章让大家一起理解某个技术这本身就是一种考验, 如果作者的观点, 看法是正确的那么这样能加深作者自己对技术点的理解; 如果错了, 明眼人会指出错误, 一起讨论, 理解.
再者, 于读者而言, 作者觉得只要读者能从文章中获得新的知识, 那这篇文章的价值也就发挥出来了. 作者也经常去看别人写的文章, 通过别人的见解, 可以快速理解某个技术.
如果想聪明, 请犯错.
如果不成功, 那就再试一试.--《一万小时天才理论》
session
COOKIE 存在于客户端, 而 SESSION 存在于服务端, 并且 SESSION 需要 COOKIE 的支持.
session 是存在于服务端的信息管理机制, 它把客户端信息以某种信息形式记录在服务器中, 客户端再次访问只需要从 session 中查找用户的状态就可以了.
session 运行机制
session 的运行机制是这样的, 当程序需要为某个客户端的请求创建一个 seesion 时, 服务器会首先检查这个客户端的请求中的 cookie 是否含有 session 标识符(很多人把他叫 session_id).
考虑两种检查结果:
1. 包含并且没有过期, 则表示服务器已经对这个客户端创建了 session, 而服务器只需按照 session_id 把 session 检索出来使用.
2. 不包含或已过期, 则需要新创建一个 session 并且生成与这个 session 相关联的 session_id 返回给客户端保存.
session 存在的必要性
session 存在的必要性, 很少文章谈到这个, 作者一开始一直都在想这个问题:
使用纯客户端中的 cookie 就能完成会话保持, 为什么需要服务端的 session?
先来看这个例子: 在一个浏览器中登录博客园, 通过开发工具获得了 cookie 并复制, 在另一个浏览器中打开博客园(退出登录状态下), 然后把复制好的 cookie 都填入该浏览器中, 刷新, 你会发现这个浏览器居然是已经是登录状态了.(作者亲测例子, 读者自行测试具体截图不放了, 若操作有问题评论区解决)
只要盗取了 cookie, 就能劫持 session. 同样的道理, 如果单使用 cookie, 那么也是一样只要盗取了 cookie 就能做到冒充登录. 既然盗取了 cookie, 无论是 session 还是 cookie 都一样会被冒充, 那为什么需要 session 呢?
作者为了明白这个问题, 花了很多时间才弄明白, 没文化真阔怕. 其实 session 存在的必要性可以从以下几点说明:
1. 用 session 只需要在客户端保存一个 id, 实际上大量数据都是保存在服务端. 如果全部用 cookie, 数据量大的时候客户端是没有那么多空间的.
2.cookie 只是实现 session 的其中一种方案. 虽然是最常用的, 但并不是唯一的方法. 还有 URL 等其他方式
3. 全部在客户端保存, 服务端无法验证, 这样伪造和仿冒会更加容易.(伪造一个随机的 id 很难, 但伪造另一个用户名是很容易的)
4. 全部保存在客户端, 那么一旦被劫持, 全部信息都会泄露
5. 客户端数据量变大, 网络传输的数据量也会变大
其实, 在当下的开发中, 都是结合二者使用的.
总结
COOKIE 存在于客户端, 而 SESSION 存在于服务端, 并且 SESSION 需要 COOKIE 的支持. session 是存在于服务端的信息管理机制, 它把客户端信息以某种信息形式记录在服务器中, 客户端再次访问只需要从 session 中查找用户的状态就可以了.
session 和 cookie 间的区别和联系:
最大的区别, session 在服务端, cookie 在客户端.
最大的联系, session 需要 cookie, 完成一个会话需要两者结合.
session 比 cookie 要更安全.
单 cookie 数据不能超过 4K, 另外浏览器可能会限制单个站点的 cookie 数量. 而 session 在服务端没有此类限制.
考虑到后面会使用 NODE.JS 作为写 session 和 cookie 的实践, 所以把文章分成 3 部分最好 --cookie 篇, session 篇, NODE.JS 实践篇. 这样, 读者可以按需去看, 写 NODE.JS 可以看我下一篇的文章, 不会 NODE 的可以跳过了.
下次, NODE.JS 见.
如果您觉得阅读本文对您有帮助, 请点一下 "推荐" 按钮, 您的 "推荐" 将是我最大的写作动力!
- Reference
- http://blog.51yip.com/PHP/938.html
- https://www.cnblogs.com/shiyangxt/articles/1305506.HTML
来源: https://www.cnblogs.com/wljqds/p/session.html