क्या कुकीज़ को RESTful API में उपयोग किया जाना चाहिए?


77

मुझे विशेष रूप से दिलचस्पी है कि उपयोगकर्ता किसी वेब एपीआई पर अधिकृत / प्रमाणित संचालन कैसे करते हैं।

प्रमाणीकरण कुकीज़ REST दर्शन के साथ संगत हैं, और क्यों?




1
@JarrodRoberson मेरी समझ यह थी कि किसी अन्य साइट पर उत्तर यहां प्रश्न के रूप में डुप्लिकेट के रूप में योग्य नहीं होंगे
टॉम स्क्वायर्स

5
प्रत्येक साइट के अक्सर पूछे जाने वाले प्रश्नों के आधार पर @JarrodRoberson, मैं यह तर्क दूंगा कि यह साइट पर है और स्टैक ओवरफ्लो नहीं है। मैं Restful वास्तुकला के इस पहलू के बारे में डिजाइन कार्यप्रणाली / दर्शन और tradeoffs में रुचि रखता हूं। स्टैक ओवरफ्लो कार्यान्वयन के सवालों के लिए है, जहां यह साइट डिजाइन के तरीके और ट्रेडऑफ़ के बारे में अधिक है।
ब्रैंडन लिंटन

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

जवाबों:


81

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

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

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

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

संपादित करें: नीचे @ कोनराड की टिप्पणी में आरई:

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

एर ... आप सर्वर साइड पर कुकीज़ को मान्य कर रहे हैं, है ना? सिर्फ इसलिए कि आपने ब्राउज़र को 24 घंटे के बाद कुकी छोड़ने के लिए कहा था इसका मतलब यह नहीं है। उस कुकी को एक उच्च तकनीकी उपयोगकर्ता द्वारा बचाया जा सकता है और "एक्सपायर" होने के लंबे समय बाद पुन: उपयोग किया जा सकता है।

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


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

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

1
@Konrad सिर्फ इसलिए कि यह कुछ गैर-ब्राउज़र क्लाइंट में आसान है, इसका मतलब यह नहीं है कि यह उन सभी में आसान है। यह ठीक है अगर आपको केवल उस विशेष ग्राहक का समर्थन करने की आवश्यकता है जिसे आप उपयोग करने के लिए करते हैं, लेकिन मैंने सार्वजनिक रूप से एपीआई के सामना करने के बारे में प्रश्न की व्याख्या की। में curlया wget, कुकी प्रबंधित सुंदर रफ़ू असुविधाजनक है और आप वास्तव में उनके बारे में एक गुच्छा लगता है की क्या ज़रूरत है। मैंने अपना उत्तर संपादित करके आपके दूसरे बिंदु पर जवाब दिया।
सिंगलनेगलाइजेशन आर्मी

बस इस बात से सावधान रहें कि कुकीज़ स्वीकार करने से CSRF की कमजोरियाँ खुल जाती हैं। सुरक्षा
।stackexchange.com/a/166798

14

हां और नहीं - यह निर्भर करता है कि आप इसका उपयोग कैसे करते हैं।

कुकीज़ अगर क्लाइंट के लिए, क्लाइंट के लिए और क्लाइंट द्वारा क्लाइंट की स्थिति बनाए रखने के लिए उपयोग की जाती हैं, तो वे आराम कर रहे हैं।

यदि आप सर्वर स्टेट को कुकी में स्टोर कर रहे हैं तो आप मूल रूप से लोड को क्लाइंट को शिफ्ट कर रहे हैं - जो कि आरामदायक नहीं है।

तो कुछ उदाहरण क्या हैं?

शोकहारा:

  • प्रमाणीकरण विवरण या 'थोड़े सामान में लॉग किया गया है
  • अंतिम देखे गए पृष्ठ या आवेदन आदि में जगह

आराम नहीं:

  • भंडारण सत्र की जानकारी

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


10
यदि आप क्लाइंट पर ".LoggedIn" ध्वज संग्रहीत करते हैं, तो आप किसी भी प्रमाणीकरण का उपयोग नहीं कर सकते हैं।
tdammers

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

1
मैं जोड़ना चाहता हूं कि कुकीज़ के पत्तों में प्रमाणीकरण जानकारी डालने से क्रॉस-साइट अनुरोध जालसाजी के हमलों की संभावना खुल जाती है। बेहतर तरीके हैं, मैं अमेज़न की नकल करने का सुझाव देता हूं: docs.aws.amazon.com/AmazonS3/latest/API/…
Dobes Vandermeer

@Dammers अगर JLT में ".LoggedIn" झंडा है तो क्या होगा? फिर उसे सुरक्षित किया जाना चाहिए, बशर्ते कि JWT जारी और ठीक से सत्यापित हो।
आरोन जे स्पेटनर


12

एक कुकीज़ का उपयोग कर सकते हैं। REST उन्हें अनुमति देता है।

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

मेरे एक ब्लॉग पोस्ट से , एक सामान्य सहमति है कि प्रमाणीकरण डेटा को REST के बारे में गुंजाइश से बाहर माना जाता है। इसलिए, इस सत्र के कुछ आंकड़ों को अपनी ओर रखना सर्वरों के लिए ठीक है।

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