Rails/Devise如何处理Cookie会话?

37

我希望了解在使用Rails/Devise登录用户时发生的实际情况。

我创建了一个最小的Rails应用程序,安装了Devise并创建了一个User Devise模型。一切正常,当我使用“记住我”功能登录时,我得到了一个会话cookie,就像预期的那样。

现在让我困扰的是:Rails如何处理浏览器通过cookie传递的会话信息?

我天真地期望某些信息存储在数据库中,但我找不到它们的位置。没有session表,Users中也没有会话列,在tmp目录中也找不到任何有用的内容。

请注意,重新启动服务器不会终止我的会话。这是当然可以预料的,但现在我真的想知道这里发生了什么样的魔法?

换句话说:服务器如何检查cookie的有效性以验证用户身份?

谢谢!


2
Devise将一些信息存储在数据库中(例如last_sign_in_atlast_sign_in_ip等),但依赖于cookie来模拟随时间变化的有状态会话一致性。该cookie具有“TTL”或生存时间,当选中“记住我”时,该cookie将写入浏览器。(至少从我所了解的情况来看,这是与Devise相关的默认/最典型的系统。) - mecampbellsoup
1个回答

29
默认的Rails会话存储是CookieStore。这意味着所有会话数据都存储在cookie中,而不是在任何数据库中。在Rails 3.2中,cookie被签名以防篡改,但没有加密。在Rails 4中,它通常是默认加密的。它存在于cookie中,因此可以在服务器重新启动时保持不变。这也意味着您只能存储4k的数据,并且您不希望在Rails <4中将任何敏感信息存储在其中。无论如何,最好将会话数据保持最少。

您还可以选择将会话数据存储在数据库中,并仅在cookie中具有会话ID。

我上周给出的答案提供了一些额外的信息,可能会有用:

在我开始在网上阅读有关它们的信息之前,Sessions对我来说很有意义

此外,CookieStore的Rails API文档提供了一个很好的摘要:

http://api.rubyonrails.org/classes/ActionDispatch/Session/CookieStore.html


1
我认为当你说“持久性如何跨服务器重启保持”时,你真正的意思是“持久性如何跨浏览器/客户端重启保持”,对吗? - mecampbellsoup
我实际上是指在服务器重新启动时,因为问题中提到“请注意,重新启动服务器不会终止我的会话。这当然是预期的,但现在我真的很想知道这里发生了什么样的魔法?”,所以我的观点是它跨越服务器重新启动的原因是它存储在客户端的 cookie 中,因此独立于服务器重新启动。当然,根据 cookie 的过期时间,它也可以跨越浏览器重新启动。 - Tim
那么,如果我使用Rails 4,我的应用程序是否独立于后端服务器?它是否没有会话亲和性? - simo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接