Cookie与会话与CookieStore

在Rails 3中,将数据存储在Cookie中并将数据存储在会话中与将会话存储设置为CookieStore的默认值之间有什么区别?

例如

cookie[:foo] = 'bar' # MyApp::Application.config.session_store :cookie_store, key: '_myapp_session' session[:foo] = 'bar' 

据我所知,最终都存储在一个客户端cookie中。

你什么时候select使用一个呢?

谢谢。

主要区别是,当你使用cookie[:foo] = 'bar' ,用户可以看到cookie的值,即'bar' 。 当你使用session[:foo] = 'bar'这个值将被railsencryption并存储在_myapp_session cookie中。

当您要存储的信息未绑定到会话时,例如当用户select首选语言时,您将使用cookie[]格式。

如果要存储与当前会话相关的信息(例如用户的id ,则可以使用session[]格式。

Rails为会话哈希提供了几种存储机制。 最重要的是ActiveRecord::SessionStoreActionDispatch::Session::CookieStore

有一些会话存储,即Rails保存会话哈希和会话ID。 由于性能和维护的原因,大多数实时应用程序selectActiveRecord::SessionStore (或其派生之一)在文件存储。 ActiveRecord::SessionStore ID和散列保留在数据库表中,并保存并检索每个请求的散列。

Rails 2引入了一个新的默认会话存储, CookieStoreCookieStore散列直接保存在客户端的cookie中。 服务器从cookie中检索会话散列,并且不需要会话ID。 这将大大提高应用程序的速度,但它是一个有争议的存储选项,你必须考虑它的安全含义:

Cookies意味着严格的4kB大小限制。 这很好,因为如前所述,不应该在会话中存储大量的数据。 在会话中存储当前用户的数据库ID通常是可以的。 客户端可以看到在会话中存储的所有内容,因为它以明文forms存储(实际上是Base64编码的,因此不encryption)。 所以,当然,你不想在这里存储任何秘密。 为了防止会话哈希篡改,摘要是从具有服务器端秘密的会话中计算出来的,并插入到cookie的末尾。 这意味着这个存储的安全性取决于这个秘密(并且在摘要algorithm上,其缺省为SHA512,但是尚未被破坏)。 所以不要使用一个简单的秘密,即一个词典中的一个词,或者一个短于30个字符的词