Connect/Express 中的“session”和“cookieSession”中间件有啥区别?
Posted
技术标签:
【中文标题】Connect/Express 中的“session”和“cookieSession”中间件有啥区别?【英文标题】:What is the difference between 'session' and 'cookieSession' middleware in Connect/Express?Connect/Express 中的“session”和“cookieSession”中间件有什么区别? 【发布时间】:2013-03-22 14:43:03 【问题描述】:有两个与会话相关的中间件与 Connect/Express 捆绑在一起。 有什么区别?我该如何选择?
我假设session 中间件与cookieSession 中间件相同,但具有额外的存储机制。
【问题讨论】:
您的两个链接都指向同一个页面 【参考方案1】:session middleware 默认使用 in-memory 存储实现通用会话功能。不过,它允许您指定其他存储格式。
另一方面,cookieSession middleware 实现 cookie-backed 存储(也就是说,整个会话被序列化为 cookie,而不仅仅是一个会话密钥。它应该只是当会话数据将保持相对较小时使用。
【讨论】:
而且,据我所知,它(cookie-session)只应在会话数据不敏感时使用。假设用户可以检查会话的内容,但中间件会检测数据何时被修改。 @RyanBales 如果会话数据应该保密,那么您应该使用 TLS,但在这种情况下,例如表单数据也应该保密,所以无论如何你都应该使用 TLS。默认设置将阻止其他网站读取这些 cookie。很难想象您想要向该用户隐藏有关用户会话的信息的情况,但在这种情况下,您可以在存储会话数据之前对其进行加密。【参考方案2】:两个中间件都使用客户端cookie 来维护用户的上下文,即Session。区别在于:
Cookie 中存储的内容,以及 是否需要服务器端存储下表比较了cookieSession middleware 和session middleware wrt 会话:
+----------------+-----------------------+----------------------+
| | Client-side store | Server-side store |
| | (cookie) | (in-memory, db ..) |
+----------------+-----------------------+----------------------+
| Middleware | Used? | Content | Used? | Content |
+----------------+--------+--------------+-------+--------------+
| session | Yes | Session ID | Yes | Session data |
+----------------+--------+--------------+-------+--------------+
| cookie-session | Yes | Session data | No | N/A |
+----------------+--------+--------------+-------+--------------+
cookieSession middleware 更简单,因为它不需要任何额外的服务器端存储,即服务器保持完全无状态。 session middleware 需要服务器端存储。默认的基于内存的会话存储的一个明显限制是它在有多个服务器实例时不起作用。在这种情况下,将需要一个替代的共享存储(例如,数据库),这使得它相对复杂。但总的来说,会话中间件更常用,因为它更灵活(用于存储敏感数据或更大的有效负载等)
【讨论】:
以上是关于Connect/Express 中的“session”和“cookieSession”中间件有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
Stripe Connect Express Webhook - 如何在用户完成 Stripe Connect Express 表单并被重定向后触发 Stripe Webhook
在 connect/express 中使用 cookieSession() 时为会话设置单独的 maxAge
servlet使用sessio和spring mvc中的controller使用session
node.js + express.js:使用 mongodb/mongoose 处理会话
java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Sessio