Cookie 与 CookieStore 的会话

在 Rails 3中,在 cookie 中存储数据和在会话中存储数据(会话存储设置为 CookieStore 的默认值)有什么区别?

例如:。

cookie[:foo] = 'bar'


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

据我所知,两者都存储在客户端 cookie 中。

你什么时候会选择使用一个而不是另一个?

谢谢。

22131 次浏览

Rails 为会话散列提供了几种存储机制,其中最重要的是 ActiveRecord::SessionStoreActionDispatch::Session::CookieStore

有许多会话存储,例如 Rails 在其中保存会话散列和会话 ID。由于性能和维护方面的原因,大多数实时应用程序选择 ActiveRecord::SessionStore(或其衍生产品之一)而不是文件存储。ActiveRecord::SessionStore将会话 ID 和散列保存在数据库表中,并在每次请求时保存和检索散列。

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

Cookie 意味着严格的大小限制为4kB。这很好,因为您无论如何都不应该在会话中存储大量数据,如前所述。在会话中存储当前用户的数据库 ID 通常是可以的。 客户机可以看到存储在会话中的所有内容,因为它以明文形式存储(实际上是 Base64编码的,所以没有加密)。所以,当然,你不想在这里存储任何秘密。为了防止会话散列篡改,将从具有服务器端机密的会话计算摘要,并将其插入到 Cookie 的末尾。 这意味着这个存储的安全性依赖于这个秘密(以及缺省为 SHA512的摘要算法,该算法尚未被破坏)。因此,不要使用一个微不足道的秘密,即一个词从字典,或一个短于30个字符

Rails 3中的主要区别在于,当您使用 cookie[:foo] = 'bar'时,用户能够看到 cookie 的值,即 'bar'。当您使用 session[:foo] = 'bar'时,该值将被 Rails 加密并存储在 _myapp_session cookie 中。

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

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

默认情况下,From Rails 4 cookie 被加密。