प्रमाणीकरण: JWT उपयोग बनाम सत्र


122

प्रमाणीकरण जैसी स्थितियों में सत्रों पर JWTs का उपयोग करने का क्या फायदा है?

क्या इसे स्टैंडअलोन दृष्टिकोण के रूप में उपयोग किया जाता है या सत्र में इसका उपयोग किया जाता है?

जवाबों:


213

JWT के अनुसार "सत्र" का उपयोग करने पर कोई लाभ नहीं है। JWTs क्लाइंट पर सेशन स्टेट को बनाए रखने का एक साधन प्रदान करता है।

यह पूछने पर कि अक्सर लोगों का क्या मतलब है " सर्वर-साइड सत्रों का उपयोग करने पर JWTs का उपयोग करने के क्या लाभ हैं "

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

इन-मेमोरी समाधान के साथ आप अपने क्षैतिज स्केलिंग को सीमित करते हैं, और सत्र नेटवर्क के मुद्दों (वाईफ़ाई और मोबाइल डेटा, सर्वर रिबूटिंग, आदि के बीच घूमने वाले ग्राहकों) से प्रभावित होंगे।

सत्र को क्लाइंट में ले जाने का मतलब है कि आप सर्वर-साइड सत्र पर निर्भरता को हटाते हैं, लेकिन यह चुनौतियों का अपना सेट लगाता है।

  • टोकन को सुरक्षित रूप से संग्रहीत करना
  • इसे सुरक्षित रूप से परिवहन करना
  • JWTs सत्र को कभी-कभी अमान्य करना कठिन हो सकता है।
  • ग्राहक के दावे पर भरोसा करना।

ये मुद्दे JWTs और अन्य क्लाइंट-साइड सत्र तंत्रों द्वारा समान रूप से साझा किए गए हैं।

JWT विशेष रूप से इनमें से अंतिम को संबोधित करता है। यह समझने में मदद कर सकता है कि JWT क्या है:

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

टोकन पर हस्ताक्षर किए गए हैं और इसलिए सर्वर इसकी उत्पत्ति को सत्यापित कर सकता है। हम मान लेंगे कि सर्वर सुरक्षित रूप से साइन करने की अपनी क्षमता पर भरोसा करता है (आपको एक मानक पुस्तकालय का उपयोग करना चाहिए: इसे स्वयं करने की कोशिश न करें, और सर्वर को ठीक से सुरक्षित करें)

उत्तर टोकन को सुरक्षित रूप से ले जाने के साथ इस मुद्दे पर आमतौर पर एक एन्क्रिप्टेड चैनल, आमतौर पर httpS के माध्यम से भेजा जाता है।

क्लाइंट में टोकन को सुरक्षित रूप से संग्रहीत करने के बारे में, आपको यह सुनिश्चित करने की आवश्यकता है कि बुरे लोग इसे प्राप्त नहीं कर सकते। यह (अधिकतर) जेएस को खराब वेब साइटों को टोकन को पढ़ने से रोकने के लिए उन्हें वापस भेजने से रोकता है। यह उसी प्रकार की रणनीतियों का उपयोग करके कम किया जाता है जो अन्य प्रकार के XSS हमलों को कम करने के लिए उपयोग किया जाता है।

यदि आपको JWT को अमान्य करने की आवश्यकता है, तो निश्चित रूप से ऐसे तरीके हैं जिनसे इसे प्राप्त किया जा सकता है। केवल उन उपयोगकर्ताओं के लिए प्रति-उपयोगकर्ता युग को संग्रहीत करना, जिन्होंने अपने "अन्य सत्रों को समाप्त करने" का अनुरोध किया है, यह एक बहुत ही कुशल तरीका है जो संभवतः काफी अच्छा होगा। यदि किसी एप्लिकेशन को प्रति-सत्र अमान्यकरण की आवश्यकता है, तो एक सत्र आईडी उसी तरह से बनाए रखा जा सकता है और "मारे गए टोकन" तालिका को अभी भी पूर्ण उपयोगकर्ता तालिका से बहुत छोटा रखा जा सकता है (आपको केवल रिकॉर्ड को नए से बनाए रखने की आवश्यकता है सबसे लंबे समय तक टोकन जीवनकाल की अनुमति दी।) इसलिए टोकन को अमान्य करने की क्षमता आंशिक रूप से क्लाइंट-साइड सत्रों के लाभ को नकारती है, जिसमें आपको इस सत्र में मारे गए राज्य को बनाए रखना होगा। यह मूल सत्र राज्य तालिका की तुलना में संभवतः अधिक छोटी तालिका होगी, इसलिए लुकअप अभी भी अधिक कुशल हैं।

JWT टोकन का उपयोग करने का एक अन्य लाभ यह है कि यह संभवत: उपलब्ध पुस्तकालयों का उपयोग करके कार्यान्वित करना आसान है, शायद हर भाषा जो आप इसे करने की उम्मीद कर सकते हैं। यह आपकी प्रारंभिक उपयोगकर्ता प्रमाणीकरण योजना से पूरी तरह से तलाकशुदा है - यदि आप एक फिंगर प्रिंट आधारित प्रणाली में चले जाते हैं, तो आपको सत्र प्रबंधन योजना में कोई बदलाव करने की आवश्यकता नहीं है।

एक और अधिक सूक्ष्म लाभ: क्योंकि JWT "सूचना" ले सकता है और इसे क्लाइंट द्वारा एक्सेस किया जा सकता है जिसे आप अब कुछ स्मार्ट चीजें शुरू कर सकते हैं। उदाहरण के लिए, उपयोगकर्ता को याद दिलाएं कि उनका सत्र लॉग आउट होने से कुछ दिन पहले समाप्त हो रहा होगा, जिससे उन्हें टोकन में समाप्ति तिथि के आधार पर फिर से प्रमाणित करने का विकल्प मिलेगा। आप जो भी कल्पना कर सकते हैं।

तो संक्षेप में: JWTs अन्य सत्र तकनीकों के कुछ सवालों और कमियों का जवाब देता है।

  1. "सस्ता" प्रमाणीकरण क्योंकि आप एक डीबी राउंड ट्रिप को खत्म कर सकते हैं (या कम से कम क्वेरी के लिए बहुत छोटी तालिका है!), जो कि क्षैतिज मापनीयता को सक्षम करता है।
  2. छेड़छाड़ करने वाला क्लाइंट-साइड का दावा करता है।

जबकि JWTs सुरक्षित भंडारण या परिवहन जैसे अन्य मुद्दों का जवाब नहीं देता है, यह किसी भी नए सुरक्षा मुद्दों को पेश नहीं करता है।

JWTs के आसपास बहुत सारी नकारात्मकता मौजूद है लेकिन अगर आप उसी सुरक्षा को लागू करते हैं जो आप अन्य प्रकार के प्रमाणीकरण के लिए करेंगे, तो आप ठीक हो जाएंगे।

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


4
यह ध्यान देने योग्य है कि सर्वर-साइड सत्र को सर्वर पर किसी भी जानकारी को संग्रहीत करने की आवश्यकता नहीं है। सर्वर क्लाइंट का उपयोग उसी तरह से कर सकता है जैसे कि JWT करता है। वास्तविक अंतर 1 में है) कुकी हेडर के अलावा अनुरोध हेडर के रूप में मान पास करके ब्राउज़र सुरक्षा नियमों से बचना, और 2) JWT के साथ एक मानकीकृत प्रारूप होना।
Xeoncross

1
क्या आप कहेंगे कि स्थानीय स्टोरेज में jwt स्टोर करना सुरक्षित है? यदि नहीं, तो इसे सहेजने के लिए एक सुरक्षित स्थान कहाँ है ताकि उपयोगकर्ता लॉग इन रहे?
जेसिका

1
हां, स्थानीय ग्राहक इसे ग्राहक पक्ष में संग्रहीत करने के लिए आम तौर पर सबसे सही जगह है। आपको XSS से निपटने की आवश्यकता है - मैं एक वेब प्रोग्रामिंग विशेषज्ञ नहीं हूं, लेकिन इस उत्तर को देखें stackoverflow.com/a/40376819/1810447 और "XSS के खिलाफ सुरक्षा कैसे करें" के लिए खोज करें
Tahaan

1
अपनी टिप्पणी में आप कैश आधारित समाधान + सत्र टोकन के बारे में बात नहीं करते हैं। यह मुझे JWT + "मारे गए टोकन" तालिका की तुलना में "बेहतर" लगता है, क्योंकि इस "मारे गए टोकन" तालिका के साथ, आपको वैसे भी एक डीबी एक्सेस की आवश्यकता है, जो कि आपके पास सत्र + कैश (जो छोटा भी है) के साथ होगा। और लगातार JWT को जारी सत्रों की तुलना में लागू करने के लिए अधिक पीड़ादायक है, क्योंकि आपको एक ताज़ा करने के लिए खेलने की जरूरत है (इसलिए बनाए रखने के लिए दो टोकन) ... किसी भी टिप्पणी की वास्तव में सराहना की जाएगी ... खासकर यदि आपके पास कुछ संख्या है जो यह दिखाने के लिए कि JTT + Kill_table सत्र + कैश की तुलना में अधिक कुशल है ;-)
TobiasBora

2
@ थाना लोकलस्टोरेज को JWTs को स्टोर करने की अनुशंसा नहीं की जाती है। आपके द्वारा साझा किए गए लिंक में भी इसका उल्लेख है। इस ब्लॉग की अच्छी व्याख्या है कि क्यों JWT को लोकलस्टोरेज में स्टोर नहीं किया जाना चाहिए।
हरके

40

संक्षिप्त उत्तर है: कोई नहीं।

एक लंबा संस्करण है:

मैंने ग्राफक्यूएल डॉक्स में इस सिफारिश को पढ़ने के बाद सत्र प्रबंधन के लिए JWT को लागू किया :

यदि आप इनमें से किसी भी प्रमाणीकरण तंत्र से परिचित नहीं हैं, तो हम एक्सप्रेस-जेड का उपयोग करने की सलाह देते हैं क्योंकि यह भविष्य के लचीलेपन का त्याग किए बिना सरल है।

कार्यान्वयन वास्तव में सरल था क्योंकि इसमें केवल थोड़ा सा जटिलता जोड़ा गया था। हालांकि थोड़ी देर के बाद, मैं (आप की तरह) आश्चर्य करने लगा कि क्या लाभ थे। यह पता चलता है कि JWT के लिए बहुत कम (या संभवतः कोई भी) सत्र प्रबंधन जाता है, क्योंकि यह ब्लॉग पोस्ट विस्तार से बताता है:

सत्र के लिए JWT का उपयोग करना बंद करें


0

मेरे दो सेंट, जो रास्ते में joepie91 के प्रसिद्ध ब्लॉग पोस्ट के कुछ विपरीत जोड़ते हैं।

यह देखते हुए कि आज (और कल) के अनुप्रयोग (अधिकतर) क्लाउड नेटिव हैं , स्टेटलेस JWT ऑथेंटिकेशन के
लिए एक आर्थिक लाभ है , जो कि आवेदन तराजू के रूप में होता है: क्लाउड एप्लिकेशन को प्रत्येक सांस के साथ खर्च होता है । यह लागत कम हो जाती है जब उपयोगकर्ताओं को अब सत्र स्टोर के खिलाफ "प्रमाणित" नहीं करना पड़ता है।

प्रसंस्करण
एक सत्र की दुकान चल रहा है 24/7 पैसे खर्च होते हैं।
आप K8S की दुनिया में मेमोरी आधारित समाधानों से दूर नहीं हो सकते हैं, क्योंकि फली अल्पकालिक है।
स्टिकी सत्र ठीक उसी कारण से अच्छा नहीं होगा।

स्टोरेज
स्टोरेज डेटा में पैसे खर्च होते हैं। SSD में डेटा संग्रहीत करना और भी अधिक खर्च होता है।
सत्र से संबंधित कार्यों को जल्दी से हल करने की आवश्यकता है, इसलिए एक ऑप्टिकल ड्राइव एक विकल्प नहीं है।

I / O
कुछ क्लाउड प्रदाता डिस्क से संबंधित I / O के लिए पैसे लेते हैं।

बैंडविड्थ
कुछ क्लाउड प्रदाता सर्वर इंस्टेंस के बीच नेटवर्क गतिविधि के लिए चार्ज करते हैं।
यह लागू होता है क्योंकि यह लगभग निश्चित है कि एपीआई और सत्र स्टोर अलग-अलग उदाहरण हैं।

सत्र स्टोर को क्लस्टर करना
लागत सभी उपरोक्त लागतों को आगे भी बढ़ाता है।


"आप K8S की दुनिया में मेमोरी आधारित समाधानों से दूर नहीं हो सकते हैं, क्योंकि फली अल्पकालिक है" निश्चित रूप से आप इसका क्या मतलब है। Redis निश्चित रूप से K8S वातावरण में काम करता है, और अपने उपयोगकर्ताओं को प्रभावित करने के लिए अक्सर पर्याप्त रूप से विफल होने वाला एक रेडिस पॉड बहुत संभावना नहीं है।
चुपचाप

@quietContest सॉफ्टवेयर बनाते समय मैं व्यक्तिगत रूप से संभावना से निपटने के लिए नहीं पसंद करता हूं। BTW, समाधान स्थिरता एक तरफ, एक हमले के कारण सॉफ्टवेयर विफल हो सकता है और पॉड्स फिर से शुरू हो सकते हैं - जिसके परिणामस्वरूप सत्र हानि हो सकती है। मैं उस कारण के लिए JWT आधारित समाधान चुनूंगा।
एलियल पेरी

1
"मैं व्यक्तिगत रूप से सॉफ्टवेयर के निर्माण के दौरान संभावना से निपटने के लिए नहीं पसंद करता हूं"। मुझे लगता है कि हम सभी इसे पसंद करेंगे, यही वजह है कि हमें उन वास्तु प्रणालियों को नहीं करना चाहिए जो इन-मेमोरी डेटा स्टोर पर भरोसा नहीं करते हैं, कभी भी विफल नहीं होते हैं, क्योंकि इसकी संभावना काफी अधिक लगती है। आपके अन्य बिंदु के अनुसार, यदि आपके पास एक हमलावर है जो लगातार आपके रेडिस उदाहरण को बंद करने में सक्षम है, तो इसका समाधान संभवतः JWTs का उपयोग करने की आवश्यकता नहीं है।
शांतचित्त

@quietContest लगातार या जीवनकाल में एक बार इस पहलू में मेरे लिए समान हैं। यानी एक अच्छी तरह से रखा DDoS हमला सर्वर "उपयोगकर्ताओं को लॉग आउट" करने का कारण बन सकता है। यह सॉफ्टवेयर की विश्वसनीयता प्रतिष्ठा के लिए अच्छा नहीं है। मुझे लगता है कि रेडिस सत्र प्रबंधन के लिए वैसे भी ओवरकिल है। इसकी लागत और आवश्यकता होती है, जबकि कुकी में JWT का भंडारण करना (सुरक्षित रूप से) नहीं होता है।
ईयाल पेरी

1
@quietContest आपके इनपुट के लिए धन्यवाद, चर्चा से प्यार है!
ईयाल पेरी

0

उपयोगकर्ता प्रमाणीकरण के लिए मुझे JWT और टोकन + कैश के बीच चयन करने का समान प्रश्न था।

इन लेखों को पढ़ने के बाद, मेरे लिए यह स्पष्ट है कि JWT के वादे उन समस्याओं को दूर नहीं करते हैं जो इसे लाती हैं। तो टोकन + कैश (रेडिस / मेमकेड) मेरे लिए जाने का रास्ता है।

प्रामाणिक हेडर बनाम जेडब्ल्यूटी बनाम सत्र - एपीआई के लिए सही प्रामाणिक तकनीक कैसे चुनें

एपीआई के लिए प्रमाणीकरण तकनीक

सत्र के लिए jwt का उपयोग करना बंद करें

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