Rails v2.3:会话和cookie之间的区别

我正在通过阅读在线指南(适用于Rails v2.3 )学习Rails。 指南很棒,然而,对我来说有一个混乱,那就是:

有一章解释了Rails 会话 ,另一章解释了Rails的Cookies 。 解释很容易理解,但比较两者时,像我这样的读者并没有看到Session和Cookies之间的显着差异。 特别是在哪种情况下应该使用会话,在哪种情况下应该使用Cookie?

此外,在会话章节中,有一个CookieStore的概念, 那么CookieStore和Cookies之间有什么区别呢?

有人能解释一下这些吗?

Sessions&Cookies都能够在两个或多个请求之间存储一些信息(例如:current_user id),这些请求(在http中)是无状态的。

但Session更像是一个抽象概念,与在特定时间内处于特定状态的概念有关:它包含的信息可以存储在数据库,服务器端文件,redis散列或cookie中。

Cookie总是小文本文件,导航器必须在请求之间存储一些持久数据……但是在客户端有一些数据可能是不安全的,这就是为什么它经常被加密。 但这个概念确实可以与会话重叠。

TL; DR:会话持有临时数据的抽象概念。 Cookies一种(常见的)方式。

Cookie是存储在浏览器中的小文本文件。

会话是“正在使用”状态的概念,该状态可以具有与之关联的数据。 Rails使用cookie跟踪会话,并允许您为关联数据选择不同的存储,并使用相同的session接口访问它。

CookieStore意味着所有会话信息都存储在cookie本身内。 您可以选择在适当的地方使用其他各种商店,并且它仍然可用于您的session访问者方法。

除会话外,您还可以设置其他cookie以在用户的​​浏览器上存储信息。 它们与会话无关,可以单独设置,访问和删除。

示例1,在会话中存储登录用户的购物车:

 session[:embarassing_products] = ['ooh', 'naughty', 'lucky_im_using_activerecord_store', 'only_the_session_id_is_in_the_cookie', 'other_data_arent_in_the_browser'] 

购物车将保留给用户的会话。 您可以将会话设置为在关闭浏览器窗口,用户注销或经过一定时间后结束。

示例2,记住浏览器在cookie中对您的域的最后语言首选项:

 cookie[:lang] = 'en-US' 

此信息存储在cookie本身内。 除非cookie过期或被删除(由您或用户删除),否则它将保留在浏览器中。

对我来说,主要区别在于会话数据存储在服务器上,而cookie存储在客户端(浏览器)上。

因此,您可以信任会话中的数据。 来自cookie的信息可以被操纵,被盗,因此不应该依赖于关键用途(例如,对于正确的访问)。

第二点,cookie是有限的大小,只是基于文本。 您可以在会话中存储许多复杂对象(但要注意内存消耗),并且您不必将它们传输到客户端,然后在每个请求时返回。

通常会话只会持续到用户关闭浏览器。 这对于典型的登录非常有用。 然而,如果您需要在会话之间保留信息,则可以使用持续时间较长的cookie,例如,即使在重新启动浏览器后仍会存在“记住我”标记。