Express.js में Node.js के साथ सत्र कैसे काम करते हैं?


96

Express.js का उपयोग करना , सत्र मृत सरल हैं। मैं उत्सुक हूं कि वे वास्तव में कैसे काम करते हैं।

क्या यह क्लाइंट पर कुछ कुकी संग्रहीत करता है? यदि हां, तो मुझे वह कुकी कहां मिल सकती है? यदि आवश्यक हो, तो मैं इसे कैसे डिकोड करूं?

मैं मूल रूप से यह देखना चाहता हूं कि क्या कोई उपयोगकर्ता लॉग इन कर रहा है, तब भी जब उपयोगकर्ता वास्तव में उस समय साइट पर नहीं है (जैसे कि फेसबुक जानता है कि आप अन्य साइटों पर कब लॉग इन हैं)। लेकिन मुझे लगता है कि मुझे पहले समझना चाहिए कि सत्र कैसे काम करता है।

जवाबों:


43

मैंने कभी भी Express.js का उपयोग नहीं किया है, हालाँकि इस विषय पर उनके प्रलेखन के अनुसार ऐसा लगता है:

  • कुकीज़ क्लाइंट पर संग्रहीत की जाती हैं, एक कुंजी के साथ (जो सर्वर सत्र डेटा को पुनः प्राप्त करने के लिए उपयोग करेगा) और एक हैश (जो सर्वर यह सुनिश्चित करने के लिए उपयोग करेगा कि कुकी डेटा के साथ छेड़छाड़ नहीं की गई है, इसलिए यदि आप कोशिश करते हैं और बदलते हैं। कुकी का मान अमान्य होगा)

  • कुछ फ्रेमवर्क (जैसे प्ले फ्रेमवर्क !) के विपरीत सत्र डेटा, सर्वर पर आयोजित किया जाता है, इसलिए कुकी वास्तविक सत्र डेटा के धारक की तुलना में सत्र के लिए प्लेसहोल्डर की तरह अधिक होती है।

  • से यहाँ , ऐसा लगता है सर्वर पर इस सत्र के डेटा की तरह स्मृति में आयोजित डिफ़ॉल्ट रूप से है, हालांकि कि जो कुछ भी भंडारण फार्म लागू उचित एपीआई को बदला जा सकता है।

इसलिए यदि आप एक विशिष्ट reqअनुरोध ऑब्जेक्ट के बिना चीजों की जांच करना चाहते हैं , तो जैसा कि आपने कहा, आपको बस उसी भंडारण तक पहुंचने की आवश्यकता है। पहले दस्तावेज़ीकरण पृष्ठ के निचले भाग में, यह आवश्यक तरीकों का विवरण देता है कि भंडारण को लागू करने की आवश्यकता है, इसलिए यदि आप अपने भंडारण एपीआई से परिचित हैं, तो हो सकता है कि आप ऐसा .getAll()कुछ कर सकते हैं जो मौजूद है, और सत्र डेटा के माध्यम से लूप करें और जो भी पढ़ें मूल्यों आप चाहते हैं।


166

अवलोकन

Express.js उपयोगकर्ता के ब्राउज़र में एक सत्र आईडी (एक एन्क्रिप्शन हस्ताक्षर के साथ) को संग्रहीत करने के लिए एक कुकी का उपयोग करता है और फिर, बाद के अनुरोधों पर, सर्वर पर संग्रहीत सत्र जानकारी को पुनः प्राप्त करने के लिए उस कुकी के मूल्य का उपयोग करता है। यह सर्वर साइड स्टोरेज एक मेमोरी स्टोर (डिफ़ॉल्ट) या कोई अन्य स्टोर हो सकता है जो आवश्यक तरीकों (जैसे कनेक्ट-रेडिस ) को लागू करता है।

विवरण

Express.js / Connect एक 24-वर्ण Base64 स्ट्रिंग का उपयोग करके बनाता है utils.uid(24)और इसे इसमें संग्रहीत करता है req.sessionID। इस स्ट्रिंग को तब कुकी में मान के रूप में उपयोग किया जाता है।

ग्राहक की ओर

हस्ताक्षरित कुकीज़ हमेशा सत्रों के लिए उपयोग की जाती हैं, इसलिए कुकी मूल्य का निम्न प्रारूप होगा।

[sid].[signature]

जहां [साइड] सेशन है और सत्र मिडलवेयर को इनिशियलाइज़ करते समय प्रदान की गई गुप्त कुंजी का उपयोग करके [साइड] साइन करके [सिग्नेचर] जेनरेट किया जाता है। छेड़छाड़ को रोकने के लिए हस्ताक्षरित कदम उठाया जाता है। यह उपयोग किए जाने वाले गुप्त कुंजी के ज्ञान के बिना [सिड] को संशोधित करने और फिर [हस्ताक्षर] करने के लिए कम्प्यूटेशनल रूप से अलग होना चाहिए। सत्र कुकी अभी भी चोरी और पुन: उपयोग के लिए असुरक्षित है, अगर [साइड] के किसी भी संशोधन की आवश्यकता नहीं है।

इस कुकी का नाम है

connect.sid

सर्वर साइड

यदि कोई हैंडलर मिडलवेयर के बाद आता है cookieParserऔर sessionइसके वेरिएबल तक पहुंच होगी req.cookies। इसमें JSON ऑब्जेक्ट शामिल है जिसकी कुंजी कुकी कुंजी है और मान कुकी मान हैं। इसमें एक कुंजी का नाम होगा connect.sidऔर इसका मूल्य हस्ताक्षरित सत्र पहचानकर्ता होगा।

यहां इस बात का एक उदाहरण है कि एक मार्ग कैसे सेट किया जाए जो हर अनुरोध पर सत्र कुकी के अस्तित्व की जांच करेगा और इसके मूल्य को कंसोल पर प्रिंट करेगा।

app.get("/*", function(req, res, next) {

    if(typeof req.cookies['connect.sid'] !== 'undefined') {
        console.log(req.cookies['connect.sid']);
    }

    next(); // Call the next middleware
});

आपको यह भी सुनिश्चित करना होगा कि राउटर ( app.use(app.router)) के बाद cookieParserऔर sessionआपके कॉन्फ़िगर अनुभाग में शामिल है।

निम्नलिखित डेटा का एक उदाहरण है जो Express.js / कनेक्ट द्वारा आंतरिक रूप से संग्रहीत है।

{
  "lastAccess": 1343846924959,
  "cookie": {
    "originalMaxAge": 172800000,
    "expires": "2012-08-03T18:48:45.144Z",
    "httpOnly": true,
    "path": "/"
  },
  "user": { 
    "name":"waylon",
    "status":"pro"
  }
}

userक्षेत्र रिवाज है। बाकी सब सत्र प्रबंधन का हिस्सा है।

इसका उदाहरण एक्सप्रेस 2.5 है।


1
कंसोल के साथ कुकी मान को प्रिंट करते समय। यह एन्कोडेड (हस्ताक्षरित) कुकी देता है। मुझे वास्तविक जानकारी कैसे मिलेगी?
विस्कॉन्सिन

यू का क्या मतलब है - "सत्र कुकी अभी भी चोरी और पुन: उपयोग के लिए असुरक्षित है, अगर []] के किसी भी संशोधन की आवश्यकता नहीं है।" चूंकि SID एक्सप्रेस द्वारा उत्पन्न होता है, इसलिए हम इसे कभी बदल नहीं सकते?
हृषिकेश

2
@WebHrushi I एक मैन-इन-द-मिडल अटैक के बारे में सोच रही थी: en.wikipedia.org/wiki/Man-in-the-middle_attack
Waylon Flinn

किसी को इस सवाल के साथ मेरी मदद कर सकते हैं: stackoverflow.com/questions/21982791/…
roundrobin

मैं किसी विशेष सत्र_ के लिए टोकन कैसे बनाऊं ??
अमन वर्मा

9

मैं उत्सुक हूं कि वे वास्तव में कैसे काम करते हैं।

इस उत्तर और विकी सामान को देखने का प्रयास करें ।

क्या यह क्लाइंट पर कुछ कुकी संग्रहीत करता है?

हां, यह आमतौर पर निर्दिष्ट सत्र आईडी के साथ एक कुकी है, जिसे फर्जीवाड़े को रोकने के लिए एक रहस्य के साथ हस्ताक्षरित किया जाना चाहिए।

यदि हां, तो मुझे वह कुकी कहां मिल सकती है? यदि आवश्यक हो, तो मैं इसे कैसे डिकोड करूं?

आपको क्लाइंट साइड पर सत्र कुकी के साथ गड़बड़ नहीं करनी चाहिए। यदि आप सर्वर साइड पर सत्र के साथ काम करना चाहते हैं तो आपको संबंधित एक्सप्रेस की जाँच करनी चाहिए । डॉक्स और कनेक्ट डॉक्स।


महोदय, क्या हम बात कर सकते हैं मुझे इस सब के बारे में कुछ संदेह है।
सूरज जैन

0

पहले से ही उत्कृष्ट उत्तरों के अलावा, यहाँ 2 डायग्राम मैंने एक्सप्रेशन सेशन, कुकीज़ और स्टोर के साथ उनके लिंक को समझाने के लिए बनाए हैं:

  • चॉकलेट कुकी: चॉकलेट
  • स्ट्रॉबेरी कुकी: स्ट्रॉबेरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.