2016-01-08 8 views
6

मैं इन दिनों token-based authentication को समझने की कोशिश कर रहा हूं, जो stateless authentication विधि होने का दावा करता है। और मैं stateless web application की अवधारणा से मुलाकात की।स्टेटलेस वेब एप्लिकेशन, एक शहरी किंवदंती?

नीचे कुछ धागे मैं के बारे में पढ़ा रहे हैं:

सबसे पहले, मैं इस पर रोमांचित थे विचार। लेकिन अधिक से अधिक मुझे लगता है कि stateless एक pseudo-proposition है।

उदाहरण के लिए, मान लीजिए कि हम प्रमाणीकरण के लिए क्लाइंट-संग्रहीत टोकन का उपयोग करते हैं, हम ऑनलाइन उपयोगकर्ताओं की एक सांख्यिकीय कैसे बना सकते हैं (मान लीजिए कि कोई लॉग नहीं है)? क्या हम डीबी में टोकन स्टोर करेंगे? इसका मतलब यह नहीं है कि हम सर्वर पर राज्य की जानकारी स्टोर करते हैं? और भी, क्या डीबी में नाम, आयु इत्यादि जैसी सादा उपयोगकर्ता जानकारी भी किसी प्रकार की राज्य जानकारी है?

मुझे लगता है कि यहाँ असली सवाल को वेब एप्लिकेशन राज्यविहीन बनाने के लिए है, लेकिन वेब अनुप्रयोग ठीक से राज्य की जानकारी ऐसी है कि वह scalability ख़तरे में डालना नहीं होगा संभाल करने के लिए नहीं है।

कि कैसे शब्द stateless व्याख्या करने के लिए पर निर्भर करता है:

  1. वेब एप्लिकेशन राज्य नहीं है।
  2. या वेब ऐप राज्य स्वयं स्टोर नहीं करता है।

मैं 2 पसंद करता हूं क्योंकि हमेशा कुछ inevitable global state (@ धोखे की टिप्पणी से उनके उत्तर में उद्धृत) हो सकते हैं। और इससे कोई फर्क नहीं पड़ता कि हम राज्य की जानकारी एचटीएमएल 5 वेब स्टोरेज, या HTTP हेडर, या छिपे हुए फॉर्म फ़ील्ड, या कुकी के रूप में संग्रहीत करते हैं, फिर भी राज्य मौजूद है। केवल यह कि सर्वर के अलावा कहीं और संग्रहीत है।

क्या मुझे कुछ अच्छा याद आ रहा है? क्या कोई इस पर कुछ प्रकाश डाल सकता है ताकि मुझे इस मानसिक संघर्ष से मुक्त किया जा सके?

जोड़ें 1

बस Leonard Richardson द्वारा पुस्तक RESTful Web Services बारे में पढ़ा। अध्याय 4 में, धारा Statelessness के अंत में, यह राज्य को Application State और Resource State में वर्गीकृत करता है। तो छवियों, आदि जैसे पहले उल्लेख की गई सादे उपयोगकर्ता जानकारी और डेटा को Resource State के रूप में वर्गीकृत किया जा सकता है। और stateless का संदर्भ Application State है। तो यह सर्वर पर resource state स्टोर करने के लिए स्टेटलेस के कोड को तोड़ नहीं देता है।

लेकिन पुस्तक में परिदृश्य का उल्लेख भी है जहां an application key is used to restrict how many times a user can invoke a web service. यह स्वीकार करता है कि ऐसी जानकारी क्लाइंट साइड पर संग्रहीत नहीं की जा सकती है। और सर्वर पक्ष पर इसे स्टोर करने के लिए स्टेटलेस के कोड को तोड़ता है और सत्र संबंध के मुद्दे को पेश करता है। यह दावा करता है कि स्टेटलेस सत्र एफ़िनिटी मुद्दे से बच सकता है लेकिन यह समझाता नहीं है कि कैसे।मैं वास्तव में नहीं देखता कि इस परिदृश्य को कैसे बेकार कर सकते हैं। कोई भी यहाँ कुछ प्रकाश डाल सकता है?

+1

स्टेटलेस वेब एप्लिकेशन क्या है? आपको वह शब्द कहां से मिला? मुझे केवल स्टेटलेस कनेक्शन/प्रोटोकॉल पता है। – freakish

+0

@freakish उत्तर के लिए धन्यवाद। मैंने इसे कई धागे से पढ़ा। मैंने यहां कुछ लोगों का सारांश दिया: http://stackoverflow.com/questions/34651801/how-to-make-stateless-web-applications- विशेष रूप से-with-spring-mvc – smwikipedia

+0

मुझे लगता है कि यदि आप नुकसान की सूची लिखते हैं क्या आप परिभाषित करने में सक्षम होंगे कि कौन सा स्टेटलेस होना चाहिए, है ना? लेकिन वे नुकसान व्यक्तिपरक हैं, यही कारण है कि कोई स्पष्ट परिभाषा नहीं है। –

उत्तर

10

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

क्या "स्टेटलेस" है जो सर्वर किसी विशेष समय पर किसी विशेष ग्राहक को किसी विशेष ग्राहक को एक विशेष अनुरोध भेजने की अनुमति देता है।

पर विचार करें: एक पारंपरिक कुकी-आधारित लॉगिन सत्र के साथ, सर्वर एक राज्य एक सीमित समय खिड़की के लिए ग्राहक से अनुरोध स्वीकार करने में केवल है; जब तक वर्तमान सत्र मान्य है। क्लाइंट भविष्यवाणी नहीं कर सकता कि यह कितना समय है। किसी भी समय, क्लाइंट से अनुरोध विफल हो सकता है, क्योंकि सर्वर पर कुछ राज्य समय समाप्त हो गया है। इस मामले में, क्लाइंट को फिर से लॉग इन करके सर्वर के राज्य को रीसेट करने की आवश्यकता होती है।

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

कारण है कि आप उपयोगकर्ता नाम और पासवर्ड के बजाय टोकन का उपयोग दोहरा है:

  1. आप एक ही खाते का उपयोग कर कई ग्राहकों को अधिकृत कर सकते हैं, लेकिन उनकी व्यक्तिगत रूप से प्रबंधित पहचान के साथ प्रत्येक
  2. आप नहीं करना चाहते हैं प्रत्येक अनुरोध

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

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


अधिक आम तौर पर बोलना: स्टेटस प्रोटोकॉल को एफ़टीपी जैसे प्रोटोकॉल के साथ विपरीत करें। एफ़टीपी में, सर्वर और क्लाइंट को साझा स्थिति को सिंक में रखना होगा। उदाहरण के लिए, एफ़टीपी प्रोटोकॉल में कई अन्य चीजों के बीच CWD कमांड पर मौजूदा कार्यशील निर्देशिका बदल गया है। यानी, किसी भी समय किसी क्लाइंट "निर्देशिका में" निर्देशिका की एक धारणा है। बाद के आदेश अलग-अलग व्यवहार करते हैं कि किस निर्देशिका में है। यह राज्यपूर्ण है। आप मनमाने ढंग से उस राज्य से अवगत किए बिना आदेश भेज नहीं सकते हैं, अन्यथा आप भविष्यवाणी करने में सक्षम नहीं होंगे कि परिणाम क्या होगा।


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


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

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

+0

आपके उत्तर के लिए धन्यवाद। अब तक, मुझे लगता है कि कुछ ** अनिवार्य ** स्केलेबिलिटी के लिए कीमत है। स्टेटलेस होने से केवल कीमत कम हो सकती है लेकिन इसे हटाया नहीं जा सकता है। यदि ऐप को स्टेटलेस के रूप में डिज़ाइन किया गया है (टोकन भाग को छोड़कर), केवल टोकन जानकारी को स्केलिंग करते समय देखभाल की आवश्यकता होती है, जो क्षणिक सत्र डेटा को दोहराने से कहीं अधिक सरल है। (बीटीडब्ल्यू, मैंने आपके उत्तर के कुछ हिस्से को हाइलाइट किया)। – smwikipedia

+1

ठीक है, किसी भी "वैश्विक स्थिति" आमतौर पर मापनीयता में बाधा है। इसका मतलब है डेटा भंडारण जो वैश्विक रूप से सुसंगत होना चाहिए। उस स्टोर में जितनी अधिक बार डेटा बदलता है, उतना कठिन है कि इसे सभी मामलों में अद्यतित रखें। इसलिए, यथासंभव अधिक से अधिक स्टेटलेस घटकों के साथ रहने के लिए जितना संभव हो उतना हटा दें। – deceze

4

ठीक है, मुझे नहीं लगता कि शब्द स्टेटलेस वेब एप्लिकेशन कोई समझ में आता है। समझ में आता है स्टेटलेस प्रोटोकॉल है। और स्टेटलेस प्रोटोकॉल वह है जो स्वतंत्र रूप से प्रत्येक अनुरोध का इलाज करता है।

तो यदि आप प्रत्येक अनुरोध के साथ एक ऑथ टोकन भेजते हैं तो यह स्टेटलेस है। इस तरह HTTP प्रमाणीकरण काम करना चाहिए।

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

स्टेटलेस प्रोटोकॉल पैमाने पर करने के लिए आसान, प्रॉक्सी के लिए आसान, आदि वेब अनुप्रयोगों अवधि या परिभाषा के आधार पर कोई मतलब नहीं हो सकता है के लिए के रूप में

अब कर रहे हैं। हालांकि मुझे कोई उचित जानकारी नहीं है।

साइड नोट: राज्य/स्टेटलेस होने के नाते ग्राहक और सर्वर के बीच डेटा साझा करने से संबंधित नहीं है।

1

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

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

स्टेटलेस वेब एप्लिकेशन? बेशक, वे संभव हैं, लेकिन यह पूरी तरह से निर्भर करता है कि उपयोगकर्ता डेटा जारी रखा जाना चाहिए या नहीं, यह वास्तव में प्रश्न में आवेदन पर निर्भर करता है।

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