session क्या सत्र वास्तव में भरोसेमंदता का उल्लंघन करते हैं?




rest cookies (5)

असल में, पुनर्वितरण केवल संसाधनों पर लागू होता है, जैसा कि एक सार्वभौमिक संसाधन पहचानकर्ता द्वारा दर्शाया गया है। तो आरईएसटी के संबंध में हेडर, कुकीज़ इत्यादि जैसी चीज़ों के बारे में भी बात करना वास्तव में उचित नहीं है। आरईएसटी किसी भी प्रोटोकॉल पर काम कर सकता है, भले ही यह नियमित रूप से HTTP पर किया जाता है।

मुख्य निर्धारक यह है: यदि आप एक आरईएसटी कॉल भेजते हैं, जो एक यूआरआई है, तो एक बार जब कॉल सर्वर को सफलतापूर्वक बनाता है, तो क्या यूआरआई एक ही सामग्री लौटाता है, मानते हैं कि कोई संक्रमण नहीं किया गया है (PUT, POST, DELETE) ? यह परीक्षण त्रुटियों या प्रमाणीकरण अनुरोधों को वापस लौटाएगा, क्योंकि उस मामले में, अनुरोध ने इसे अभी तक सर्वर पर नहीं बनाया है, जिसका अर्थ है सर्वलेट या एप्लिकेशन जो दिए गए यूआरआई से संबंधित दस्तावेज़ को वापस कर देगा।

इसी प्रकार, पोस्ट या पुट के मामले में, क्या आप एक यूआरआई / पेलोड भेज सकते हैं, और इस पर ध्यान दिए बिना कि आप कितनी बार संदेश भेजते हैं, यह हमेशा एक ही डेटा अपडेट करेगा, ताकि बाद के जीईटी एक सतत परिणाम लौटाएंगे?

आरईएसटी डेटा डेटा के बारे में है, उस डेटा को स्थानांतरित करने के लिए आवश्यक निम्न-स्तर की जानकारी के बारे में नहीं।

निम्नलिखित ब्लॉग पोस्ट में, रॉय फील्डिंग ने पूरे आरईएसटी विचार का एक अच्छा सारांश दिया:

http://groups.yahoo.com/neo/groups/rest-discuss/conversations/topics/5841

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

प्रमाणीकरण के मुद्दे पर जाकर, चाहे वह कुकीज़ या हेडर के माध्यम से पूरा हो जाए, जब तक कि जानकारी यूआरआई और पीओएसटी पेलोड का हिस्सा न हो, वास्तव में आरईएसटी के साथ इसका कोई लेना-देना नहीं है। इसलिए, स्टेटलेस होने के संबंध में, हम केवल आवेदन डेटा के बारे में बात कर रहे हैं।

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

इसलिए, ग्राहक ट्रैक करता है कि उपयोगकर्ता क्या कर रहा है, और केवल सर्वर पर तार्किक रूप से पूर्ण राज्य संक्रमण भेजता है।

एक विश्वसनीय एपीआई में सत्रों का उपयोग वास्तव में पुनर्वास का उल्लंघन कर रहा है? मैंने कई विचारों को किसी भी दिशा में देखा है, लेकिन मुझे विश्वास नहीं है कि सत्र बेकार हैं । मेरे नज़रिये से:

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

तो सत्र कैसे इसका उल्लंघन करते हैं?

  • क्लाइंट-साइड, सत्र कुकीज़ का उपयोग करके महसूस किया जाता है
  • कुकीज़ बस एक अतिरिक्त HTTP शीर्षलेख हैं
  • एक सत्र कुकी प्राप्त की जा सकती है और किसी भी समय निरस्त कर दी जा सकती है
  • आवश्यकता होने पर सत्र कुकीज़ में अनंत जीवन समय हो सकता है
  • सत्र आईडी (प्रमाणीकरण टोकन) सर्वर-साइड मान्य है

इस प्रकार, क्लाइंट के लिए, एक सत्र कुकी बिल्कुल अन्य HTTP शीर्षलेख आधारित प्रमाणीकरण तंत्र के समान होती है, सिवाय इसके कि यह Authorization या किसी अन्य मालिकाना शीर्षलेख के बजाय Cookie हेडर का उपयोग करती है। यदि कुकी मूल्य सर्वर-साइड से कोई सत्र संलग्न नहीं हुआ है, तो इससे कोई फर्क क्यों पड़ता है? जब तक सर्वर रीस्टफुल व्यवहार करता है तब तक सर्वर साइड कार्यान्वयन को क्लाइंट को चिंता करने की आवश्यकता नहीं होती है। इस प्रकार, स्वयं द्वारा कुकीज़ को एपीआई रीस्टलेस नहीं बनाना चाहिए, और सत्र क्लाइंट को बस कुकीज़ हैं।

क्या मेरी धारणाएं गलत हैं? क्या सत्र कुकीज़ रीस्टलेस बनाता है?


सबसे पहले, आरईएसटी एक धर्म नहीं है और इस तरह से संपर्क नहीं किया जाना चाहिए। जबकि रीस्टफुल सेवाओं के फायदे हैं, आपको केवल आरईएसटी के सिद्धांतों का पालन करना चाहिए, जहां तक ​​वे आपके आवेदन के लिए समझ में आते हैं।

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

Google की वेब सेवाएं एक विश्वसनीय प्रणाली का शानदार उदाहरण हैं। उन्हें प्रत्येक अनुरोध पर पारित होने के लिए उपयोगकर्ता की प्रमाणीकरण कुंजी के साथ प्रमाणीकरण शीर्षलेख की आवश्यकता होती है। यह आरईएसटी सिद्धांतों का थोड़ा सा उल्लंघन करता है, क्योंकि सर्वर प्रमाणीकरण कुंजी की स्थिति को ट्रैक कर रहा है। इस कुंजी की स्थिति को बनाए रखा जाना चाहिए और इसमें किसी प्रकार की समाप्ति तिथि / समय है जिसके बाद यह अब तक पहुंच प्रदान नहीं करता है। हालांकि, जैसा कि मैंने अपनी पोस्ट के शीर्ष पर उल्लेख किया है, आवेदन को वास्तव में काम करने की अनुमति देने के लिए बलिदान किया जाना चाहिए। उस ने कहा, प्रमाणीकरण टोकन को इस तरह से संग्रहीत किया जाना चाहिए जो सभी संभावित ग्राहकों को उनके वैध समय के दौरान पहुंच प्रदान करना जारी रखे। यदि एक सर्वर उस बिंदु पर प्रमाणीकरण कुंजी की स्थिति का प्रबंधन कर रहा है कि एक और लोड संतुलित सर्वर उस कुंजी के आधार पर अनुरोधों को पूरा नहीं कर सकता है, तो आपने वास्तव में REST के सिद्धांतों का उल्लंघन करना शुरू कर दिया है। Google की सेवाएं सुनिश्चित करती हैं कि, किसी भी समय, आप एक लोड प्रमाणीकरण टोकन ले सकते हैं जिसका उपयोग आप अपने फोन पर लोड बैलेंस सर्वर ए और हिट लोड बैलेंस सर्वर बी के खिलाफ अपने डेस्कटॉप से ​​कर रहे थे और अभी भी सिस्टम तक पहुंच है और उसी संसाधन को निर्देशित किया जा सकता है अनुरोध समान थे।

यह सब क्या उबालता है कि आपको यह सुनिश्चित करने की ज़रूरत है कि आपके प्रमाणीकरण टोकन किसी प्रकार की बैकिंग स्टोर (डेटाबेस, कैश, जो कुछ भी) के खिलाफ मान्य हैं, यह सुनिश्चित करने के लिए कि आप यथासंभव आरईएसटी गुणों को संरक्षित करते हैं।

मुझे उम्मीद है कि यह सब समझ में आया है। यदि आप पहले से नहीं हैं तो आपको wikipedia की बाधाओं को भी देखना चाहिए। यह विशेष रूप से प्रबुद्ध है कि आरईएसटी के सिद्धांत वास्तव में बहस कर रहे हैं और क्यों।


  1. सत्र अस्थिर नहीं हैं
  2. क्या आपका मतलब है कि केवल http-use के लिए आरईएसटी सेवा या मुझे गलत गड़बड़ है? कुकी-आधारित सत्र केवल अपने (!) Http- आधारित सेवाओं के लिए उपयोग किया जाना चाहिए! (यह कुकी के साथ काम करने में एक समस्या हो सकती है, उदाहरण के लिए मोबाइल / कंसोल / डेस्कटॉप / आदि से)
  3. यदि आप 3 डी पार्टी डेवलपर्स के लिए रीस्टफुल सेवा प्रदान करते हैं, तो कुकी-आधारित सत्र का उपयोग न करें, सुरक्षा के साथ समस्याओं से बचने के लिए टोकन का उपयोग करें।

कुकीज़ प्रमाणीकरण के लिए नहीं हैं। एक पहिया reinvent क्यों? HTTP में अच्छी तरह से डिज़ाइन प्रमाणीकरण तंत्र हैं। यदि हम कुकीज़ का उपयोग करते हैं, तो हम केवल एक ट्रांसपोर्ट प्रोटोकॉल के रूप में HTTP का उपयोग करने में पड़ते हैं, इस प्रकार हमें अपनी खुद की सिग्नलिंग सिस्टम बनाने की आवश्यकता है, उदाहरण के लिए, उपयोगकर्ताओं को यह बताने के लिए कि उन्होंने गलत प्रमाणीकरण की आपूर्ति की है (HTTP 401 का उपयोग करना गलत होगा क्योंकि हम शायद नहीं करेंगे एक क्लाइंट को Www-Authenticate आपूर्ति करें, क्योंकि HTTP चश्मा की आवश्यकता है :))। यह भी ध्यान दिया जाना चाहिए कि Set-Cookie केवल ग्राहक के लिए एक सिफारिश है। इसकी सामग्री सहेजी जा सकती है या नहीं हो सकती है (उदाहरण के लिए, यदि कुकीज़ अक्षम हैं), जबकि Authorization शीर्षलेख प्रत्येक अनुरोध पर स्वचालित रूप से भेजा जाता है।

एक और मुद्दा यह है कि, एक प्राधिकरण कुकी प्राप्त करने के लिए, शायद आप कहीं पहले अपने क्रेडेंशियल्स की आपूर्ति करना चाहते हैं? यदि ऐसा है, तो यह फिर से नहीं होगा? सरल उदाहरण:

  • आप कुकी के बिना GET /a कोशिश GET /a
  • आपको किसी भी तरह से प्राधिकरण अनुरोध मिलता है
  • आप POST /auth जैसे किसी भी तरह से जाते हैं और अधिकृत करते हैं
  • आपको Set-Cookie मिलती है
  • आप कुकी के साथ GET /a कोशिश GET /a । लेकिन क्या इस मामले में बेकार GET /a व्यवहार किया जाता है?

इसे समेटने के लिए, मेरा मानना ​​है कि यदि हम कुछ संसाधनों तक पहुंचते हैं और हमें प्रमाणीकृत करने की आवश्यकता है, तो हमें उसी संसाधन पर प्रमाणीकरण करना होगा, कहीं और नहीं।


HTTP लेनदेन, मूल पहुंच प्रमाणीकरण, आरबीएसी के लिए उपयुक्त नहीं है, क्योंकि मूल पहुंच प्रमाणीकरण एन्क्रिप्टेड उपयोगकर्ता नाम का उपयोग करता है: पहचानने के लिए हर बार पासवर्ड, जबकि आरबीएसी में क्या आवश्यक है वह भूमिका है जिसे उपयोगकर्ता एक विशिष्ट कॉल के लिए उपयोग करना चाहता है। आरबीएसी उपयोगकर्ता नाम पर अनुमतियों को मान्य नहीं करता है, बल्कि भूमिकाओं पर।

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

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

इस समस्या को हल करने के लिए, सत्र-रखरखाव आवश्यक है, और ऐसा लगता है, कुछ उत्तरों के अनुसार, आरईएसटी के विरोधाभास में।

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

मेरे लिए HTTP पर सत्र बनाए रखने के कई तरीके नहीं हैं। कोई कुकीज का उपयोग कर सकता है, सत्र आईडी के साथ, या sessionId वाला हेडर।

अगर किसी के पास कोई और विचार है तो मुझे यह सुनकर खुशी होगी।





restful-authentication