使用CookieStore进行Cookie与会话

gjb*_*gjb 64 cookies session ruby-on-rails ruby-on-rails-3

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

例如

cookie[:foo] = 'bar'

# MyApp::Application.config.session_store :cookie_store, key: '_myapp_session'
session[:foo] = 'bar'
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

Wol*_*ang 111

主要区别在于,当您使用cookie[:foo] = 'bar'用户时,能够看到cookie的值,即'bar'.当您使用session[:foo] = 'bar'该值时,将通过rails加密并存储在_myapp_sessioncookie中.

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

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

  • 虽然问题是关于Rails 3,其中cookie只是编码的,但值得注意的是Rails 4对它们进行加密. (12认同)
  • 纠正; 该值未加密,但默认情况下编码(使用base64). (10认同)
  • @KrishnaprasadVarma不用担心.它不是非常昂贵(在删除它时确实难以找到用例会有明显的改进)并且很容易扩展(没有像数据库这样的共享资源).寻找其他地方的优化. (2认同)

dan*_*per 11

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

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

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

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