使用CookieStore进行Cookie与会话

时间:2013-02-22 10:53:34

标签: ruby-on-rails ruby-on-rails-3 session cookies

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

e.g。

cookie[:foo] = 'bar'

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

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

你什么时候选择使用其中一个?

感谢。

2 个答案:

答案 0 :(得分:108)

主要区别在于,当您使用cookie[:foo] = 'bar'时,用户可以看到Cookie的值,即'bar'。当您使用session[:foo] = 'bar'时,该值将由rails加密并存储在_myapp_session Cookie中。

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

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

答案 1 :(得分:11)

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

有许多会话存储,即Rails保存会话哈希和会话ID的位置。由于性能和维护原因,大多数实际应用程序在文件存储上选择ActiveRecord::SessionStore(或其衍生产品之一)。 ActiveRecord::SessionStore将会话ID和哈希值保存在数据库表中,并在每个请求中保存并检索哈希值。

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

Cookies意味着严格的4kB大小限制。这很好,因为您不应该在会话中存储大量数据,如前所述。在会话中存储当前用户的数据库ID通常是可以的。 客户端可以看到您在会话中存储的所有内容,因为它以明文形式存储(实际上是Base64编码的,因此未加密)。所以,当然,你不想在这里存储任何秘密。为了防止会话哈希篡改,从具有服务器端密钥的会话计算摘要并将其插入到cookie的末尾。 这意味着此存储的安全性取决于此秘密(以及摘要算法,默认为SHA512,尚未受到损害)。所以不要使用琐碎的秘密,即字典中的单词,或短于30个字符的单词