2013-02-22 50 views
54

在Rails 3中,將數據存儲在cookie中並將數據存儲在會話中,將會話存儲設置爲CookieStore的默認值之間有什麼區別?Cookie與會話與CookieStore

例如

cookie[:foo] = 'bar' 

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

據我所知,兩個最終都存儲在客戶端cookie中。

什麼時候你會選擇使用一個嗎?

謝謝。

回答

93

主要區別在於,當您使用cookie[:foo] = 'bar'時,用戶能夠看到cookie的值,即'bar'。當您使用session[:foo] = 'bar'時,該值將通過導軌加密並存儲在_myapp_session cookie中。

當您要存儲的信息未綁定到會話時,您將使用cookie[]格式,例如,當用戶選擇首選語言時。

當您想要存儲與當前會話相關的信息時,您可以使用session[]格式。用戶的id

+10

糾正;該值不加密,但默認情況下編碼(使用base64)。 – Cem 2013-03-22 05:45:25

+12

雖然問題是關於Rails 3,其中只有Cookie被編碼,值得注意的是Rails 4加密它們。 – sheldonh 2013-05-25 12:57:47

+0

爲什麼Rails 4會被加密?任何想法? , 對於加密/解析每個請求的Rails應用程序來說,這不是很昂貴嗎? – 2013-06-14 03:39:39

10

Rails爲會話哈希提供了多種存儲機制。最重要的是ActiveRecord::SessionStoreActionDispatch::Session::CookieStore

存在多個會話存儲,即Rails保存會話散列和會話ID的位置。由於性能和維護原因,大多數實時應用程序在文件存儲上選擇ActiveRecord::SessionStore(或其衍生產品之一)。 ActiveRecord::SessionStore將會話ID和散列保留在數據庫表中,並保存並檢索每個請求的散列。

Rails 2引入了一個新的默認會話存儲,CookieStoreCookieStore將會話散列直接保存在客戶端的cookie中。服務器從cookie中檢索會話散列並消除對會話ID的需要。這將大大提高應用程序的速度,但它是一個有爭議的存儲選項,您必須考慮它的安全影響:

Cookie意味着4KB的嚴格大小限制。這很好,因爲無論如何您都不應該在會話中存儲大量數據,如前所述。在會話中存儲當前用戶的數據庫ID通常可以。 客戶端可以看到您存儲在會話中的所有內容,因爲它以明文形式存儲(實際上是Base64編碼的,因此未加密)。所以,當然,你不想在這裏存儲任何祕密。爲了防止會話哈希篡改,摘要會根據服務器端祕密的會話進行計算並插入cookie的末尾。 這意味着這個存儲的安全性取決於這個祕密(以及關於摘要算法,其默認爲SHA512,但尚未被破壞)。因此,請勿使用瑣碎的祕密,即字典中的字詞或短於30個字符的字詞