Cookie 与 CookieStore 的会话
Posted
技术标签:
【中文标题】Cookie 与 CookieStore 的会话【英文标题】:Cookies vs Sessions with CookieStore 【发布时间】:2013-02-07 23:19:03 【问题描述】:在 Rails 3 中,在 cookie 中存储数据和在 session 中存储数据有什么区别,session store 设置为默认的 CookieStore?
例如
cookie[:foo] = 'bar'
# MyApp::Application.config.session_store :cookie_store, key: '_myapp_session'
session[:foo] = 'bar'
据我所知,两者最终都存储在客户端 cookie 中。
您什么时候会选择使用其中一种?
谢谢。
【问题讨论】:
【参考方案1】:在 Rails 3 中的主要区别在于,当您使用 cookie[:foo] = 'bar'
时,用户能够看到 cookie 的值,即 'bar'
。当您使用session[:foo] = 'bar'
时,该值将被rails 加密并存储在_myapp_session
cookie 中。
当您要存储的信息未绑定到会话时,您将使用cookie[]
格式,例如当用户选择首选语言时。
当您想要存储与当前会话相关的信息时,您可以使用session[]
格式,例如用户的id
。
From Rails 4 cookies became encrypted by default.
【讨论】:
更正;默认情况下,该值未加密但已编码(使用 base64)。 虽然问题是关于 Rails 3,其中仅对 cookie 进行了编码,但值得注意的是 Rails 4 对它们进行了加密。 为什么 Rails 4 加密?任何想法? , 对每个请求进行加密/解密的 Rails 应用程序会不会很昂贵? 嗯,加密真的有必要吗?当然你真正想要的是一个签名,这样人们就无法伪造它? @KrishnaprasadVarma 不用担心。它不是很昂贵(删除它时真的很难找到一个用例将是一个显着的改进)并且易于扩展(没有像数据库这样的共享资源)。在别处寻找优化。【参考方案2】:Rails 为会话哈希提供了多种存储机制。最重要的是ActiveRecord::SessionStore
和ActionDispatch::Session::CookieStore
。
有许多会话存储,即 Rails 保存会话哈希和会话 ID 的地方。由于性能和维护原因,大多数实际应用程序选择ActiveRecord::SessionStore
(或其衍生产品之一)而不是文件存储。 ActiveRecord::SessionStore
将会话 ID 和哈希保存在数据库表中,并保存和检索每个请求的哈希。
Rails 2 引入了一个新的默认会话存储,CookieStore
。 CookieStore
将会话哈希直接保存在客户端的 cookie 中。服务器从 cookie 中检索会话哈希并消除对会话 ID 的需要。这将大大提高应用程序的速度,但这是一个有争议的存储选项,您必须考虑它的安全隐患:
Cookie 意味着 4kB 的严格大小限制。这很好,因为您不应该在会话中存储大量数据,如前所述。在会话中存储当前用户的数据库 ID 通常是可以的。 客户端可以看到您在会话中存储的所有内容,因为它以明文形式存储(实际上是 Base64 编码的,因此未加密)。所以,当然,你不想在这里存储任何秘密。为了防止会话哈希篡改,从会话中计算出一个摘要,其中包含服务器端的秘密,并将其插入到 cookie 的末尾。 这意味着此存储的安全性取决于此机密(以及摘要算法,该算法默认为 SHA512,尚未受到损害)。所以不要使用微不足道的秘密,即字典中的单词,或者少于 30 个字符的单词
【讨论】:
以上是关于Cookie 与 CookieStore 的会话的主要内容,如果未能解决你的问题,请参考以下文章