2011-04-12 27 views

回答

2

对于几乎所有情况,饼干都是最好的。它们很简单,因为它们只依赖于服务器进程正在响应以及用户的浏览器像浏览器一样工作的事实。

Cookie不适合存储大量的数据或数据,这些数据或数据应该从用户隐藏,但这意味着您不应该将这些内容放在会话中。这通常不是问题,只要你牢记这个限制。

+0

Cookie的问题是高级用户更改值的能力。还有每个请求来回发送数据,这似乎是过度杀伤。宁愿发送一个键来查找数据。 – chrishomer 2011-04-12 05:00:23

+2

@ChrisH - “为了防止会话哈希被篡改,摘要会根据会话与服务器端秘密进行计算并插入cookie的末尾。” http://guides.rubyonrails.org/security.html。由于会话数据应该保持较小,所以来回发送不成问题。此外,cookie只在服务器发生更改时才会发送。 – 2011-04-12 05:12:17

3

安全性应该是一个问题。请记住,可以使用浏览器代理修改存储在客户端的任何内容(如cookie,表单POST参数,GET参数等)。因此,始终验证通过浏览器返回的任何内容。您可以加密cookie中的值或形成POST参数。另外,正如史蒂夫所说,Cookie通常只应用于小数值。

如果你不打算在服务器集群上运行,或者如果你是,如果你可以忍受用户的会话在服务器关闭时丢失的话,那么默认的基于文件的方法是非常好的重新登录)。对于绝大多数应用程序,这是完全可以接受的。您需要将负载均衡器配置为“粘性会话”,这意味着给定用户绑定到单个服务器。但是,这可能会使负载平衡变得更加困难,因为您有时会发现许多用户都绑定到一台服务器,而另一台服务器却处于空闲状态。

如果您需要跨集群共享会话状态,那么您有几个主要选项。如果你的流量不是极端的,你可以处理一点额外的延迟,那么你可以将会话信息存储在数据库中。只要数据库启动,会话数据就不会丢失。如果数据库关闭,那么会话数据可能是您最担心的问题。如果您的应用具有非常高的流量,或者令人难以置信的性能至关重要,那么您最好的办法就是使用分布式缓存,例如memcached。然而,这是额外的“基础设施”,你将不得不维护和监视。即使memcached已经发布,它仍然是您添加到应用程序环境的额外失败点。所以,如果你不需要它,不要轻视它。为了长话短说,我假设基于默认文件的会话存储方法对于90%以上的应用程序来说可能是完全可以接受的。

+1

我们已经在使用db store,并且担心增加的延迟 - 似乎要求100ms左右的请求...... memcache可能会失败,但我不想强制登录。由于Redis可以定期写入光盘,因此redis看起来稍微好一点 - 但是我没有使用redis的经验,也不确定它是否将缓存和会话存储中的memcache替换为它。 “原来的问题比原来的问题更广泛,但它存在于...” – chrishomer 2011-04-12 04:56:19

+0

“为了防止会话哈希被篡改,摘要会从具有服务器端秘密的会话中计算出来并插入cookie的末尾。 guides.rubyonrails.org/security.html。 – 2011-04-12 05:13:34

+0

100ms看起来过多。你有没有在数据库中调整会话存储?会话信息的读/写比率是多少?您可以在每次写入时持久化数据库,但在memcached中缓存,如果存在,则不查询数据库,而只是直接从缓存中查询。如果会话在缓存中不存在(因为可能服务器已经死掉),请查询数据库以填充缓存。只要服务器保持活动状态,就可以使用粘性会话,因此通常会话信息位于特定服务器上。 – squawknull 2011-04-13 01:04:59

相关问题