2013-02-22 19 views
54

रेल 3 में, एक कुकी में डेटा संग्रहीत करने और सत्र में डेटा संग्रहीत करने के बीच क्या अंतर है, सत्र स्टोर को कुकीस्टोर के डिफ़ॉल्ट पर सेट किया गया है?कुकीस्टोर के साथ कुकीज़ बनाम सत्र

उदा।

cookie[:foo] = 'bar' 

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

जहां तक ​​मैं कह सकता हूं, दोनों क्लाइंट-साइड कुकी में संग्रहीत होते हैं।

आप दूसरे पर एक का उपयोग कब करना चुनेंगे?

धन्यवाद।

उत्तर

93

मुख्य अंतर यह है कि जब आप cookie[:foo] = 'bar' का उपयोग करते हैं तो उपयोगकर्ता कुकी के लिए मूल्य देख सकता है, यानी 'bar'। जब आप session[:foo] = 'bar' का उपयोग करते हैं तो मान रेल द्वारा एन्क्रिप्ट किया जाएगा और _myapp_session कुकी में संग्रहीत किया जाएगा।

जब आप जिस स्टोर को स्टोर करना चाहते हैं, तो आप cookie[] प्रारूप का उपयोग करेंगे, उदाहरण के लिए बाध्य नहीं है, उदा। जब उपयोगकर्ता पसंदीदा भाषा का चयन करते हैं।

आप session[] प्रारूप का उपयोग करेंगे जब आप वर्तमान सत्र से संबंधित जानकारी को संग्रहीत करना चाहते हैं, उदा। उपयोगकर्ता के id

+10

एक सुधार; मान एन्क्रिप्ट नहीं किया गया है लेकिन डिफ़ॉल्ट रूप से एन्कोड किया गया है (बेस 64 के साथ)। – Cem

+12

हालांकि सवाल रेल 3 के बारे में था, जिसमें कुकीज़ केवल एन्कोड की गई थी, यह ध्यान देने योग्य है कि रेल 4 उन्हें एन्क्रिप्ट करता है। – sheldonh

+0

रेल 4 एन्क्रिप्ट क्यों करता है? कोई उपाय? , क्या यह रेल ऐप के लिए महंगा नहीं होगा जो हर अनुरोध को एन्क्रिप्ट/डिक्रिप्ट करता है? –

10

रेल सत्र सत्र के लिए कई भंडारण तंत्र प्रदान करता है। सबसे महत्वपूर्ण ActiveRecord::SessionStore और ActionDispatch::Session::CookieStore हैं।

कई सत्र स्टोरेज हैं, यानी रेल जहां सत्र हैश और सत्र आईडी बचाता है। अधिकांश वास्तविक-लाइव अनुप्रयोग प्रदर्शन और रखरखाव के कारणों के कारण फ़ाइल संग्रहण पर ActiveRecord::SessionStore (या इसके डेरिवेटिव्स में से एक) का चयन करते हैं। ActiveRecord::SessionStore सत्र आईडी और हैश को डेटाबेस तालिका में रखता है और प्रत्येक अनुरोध पर हैश को बचाता है और पुनर्प्राप्त करता है।

रेल 2 ने एक नया डिफ़ॉल्ट सत्र भंडारण, CookieStore पेश किया। CookieStore क्लाइंट-साइड पर सीधे कुकी में सत्र हैश बचाता है। सर्वर कुकी से सत्र हैश पुनर्प्राप्त करता है और सत्र आईडी की आवश्यकता को समाप्त करता है। इससे एप्लिकेशन की गति में काफी वृद्धि होगी, लेकिन यह एक विवादास्पद स्टोरेज विकल्प है और आपको इसके सुरक्षा प्रभावों के बारे में सोचना होगा:

कुकीज़ 4kB की सख्त आकार सीमा दर्शाती हैं। यह ठीक है क्योंकि आपको पहले बताए गए सत्र में बड़ी मात्रा में डेटा स्टोर नहीं करना चाहिए। सत्र में वर्तमान उपयोगकर्ता की डेटाबेस आईडी को संग्रहीत करना आमतौर पर ठीक है। ग्राहक आपके द्वारा सत्र में संग्रहीत सब कुछ देख सकता है, क्योंकि यह स्पष्ट-पाठ में संग्रहीत होता है (वास्तव में बेस 64-एन्कोडेड, इसलिए एन्क्रिप्टेड नहीं)। तो, ज़ाहिर है, आप यहां किसी भी रहस्य को स्टोर नहीं करना चाहते हैं। सत्र हैश छेड़छाड़ को रोकने के लिए, एक पाचन की गणना सर्वर से साइड गुप्त के साथ की जाती है और कुकी के अंत में डाली जाती है। इसका मतलब है कि इस भंडारण की सुरक्षा इस रहस्य पर निर्भर करती है (और डाइजेस्ट एल्गोरिदम पर, जो SHA512 पर डिफ़ॉल्ट है, जिसे अभी तक समझौता नहीं किया गया है)। तो एक छोटे से रहस्य का प्रयोग न करें, यानी एक शब्दकोष का शब्द, या 30 वर्णों से कम

संबंधित मुद्दे