एक ही नाम के साथ कई कुकीज़ कैसे संभालें?


92

उदाहरण के लिए कहें कि मेरे पास एक एप्लिकेशन है जो निम्नलिखित HTTP हेडर को कुकी नाम पर सेट करने के लिए भेज रहा है जिसका नाम "a" है:

Set-Cookie: a=1;Path=/;Version=1
Set-Cookie: a=2;Path=/example;Version=1

अगर मैं /exampleसर्वर पर पहुँचता हूँ तो दोनों रास्ते वैध हैं, इसलिए मेरे पास "a" नाम की दो कुकीज़ हैं! चूंकि ब्राउज़र कोई पथ जानकारी नहीं भेजता है, इसलिए दो कुकीज़ को प्रतिष्ठित नहीं किया जा सकता है।

Cookie: a=2; a=1

इस मामले को कैसे संभाला जाना चाहिए? पहले वाला चुनें? सभी कुकी मानों के साथ एक सूची बनाएं? या फिर ऐसे मामले को डेवलपर की गलती माना जाना चाहिए?


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

वेबसाइट केवल अपनी स्वयं की कुकी पढ़ सकती है। यह दूसरी वेबसाइट / डोमेन की कुकी को नहीं पढ़ सकता है। यह सुरक्षा ब्राउज़र द्वारा सुनिश्चित की जाती है। यह पूर्ण शुरुआती के लिए एक टिप हो सकता है (मुझे यह भ्रम था)
अरुण

जवाबों:


38

SitePoint पर इस लेख से :

यदि एक ही नाम के कई कुकी दिए गए अनुरोध URI से मेल खाते हैं, तो एक ब्राउज़र द्वारा चुना जाता है।

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

संपादित करें: 2010 की यह जानकारी पुरानी प्रतीत होती है, ऐसा लगता है कि ब्राउज़र अब बदले में कई कुकीज़ भेज सकते हैं, विवरण के लिए नीचे @ नोट द्वारा उत्तर देखें


8
तो कोई एक से अधिक समान कुकीज़ कैसे हटा सकता है? मैंने अब दो दिनों तक इस पर काम किया है और डुप्लिकेट कुकीज़ अविनाशी लगती हैं।
बॉब जोन्स

13
@ यह लेख थोड़ा गलत हो सकता है - मैंने सिर्फ क्रोम को एक ही नाम (लेकिन अलग-अलग रास्तों) के दो कुकीज भेजने के लिए देखा था, इसलिए "ब्राउज़र द्वारा चुना गया" जरूरी नहीं है। सबसे गहरी पथ कुकी पहले भेजी गई थी, BTW, जो उचित लगती है। और एक और कुकी ने इसे बीच में भी बना दिया।
जोनास एन

3
फ़ायरफ़ॉक्स (15) भी इसी नाम से दो कुकीज़ भेजता है! यदि यह डोमेन .a.comऔर होस्ट के लिए दो कुकीज़ के साथ सामना करता हैa.com
ताहा जहांगीर

वास्तव में यह जानकारी गलत है। @ उत्तर का उत्तर मुझे सही के रूप में चिह्नित करना चाहिए।
दान मिलन

4
404: प्रसिद्ध @ नैट का उत्तर नहीं मिला है।
d.popov

90

साइटप्वाइंट पर एक लेख का संदर्भ देने वाला उत्तर पूरी तरह से पूरा नहीं है। कृपया RFC 6265 देखें (निष्पक्ष होने के लिए, इस सवाल के पोस्ट होने के बाद 2011 में इस RFC को जारी किया गया था, जिसने 2000 से पिछले RFC 2965 और 1997 से RFC 2109 को पार कर लिया था)।

धारा 5.4 , उपधारा 2 में यह कहना है:

उपयोगकर्ता एजेंट SHOULD निम्न क्रम में कुकी-सूची को सॉर्ट करता है:

  • छोटे रास्तों वाले कुकीज़ से पहले लंबे पथ वाले कूकीज़ सूचीबद्ध हैं।

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

धारा 4.2.2 में यह छोटा रत्न भी है :

... सर्वर क्रमबद्धता क्रम पर भरोसा नहीं करते। विशेष रूप से, यदि कुकी शीर्षलेख में एक ही नाम के साथ दो कुकीज होती हैं (जैसे, जो अलग-अलग पथ या डोमेन विशेषताओं के साथ सेट की गई थीं), सर्वर SHOULD उस क्रम पर भरोसा नहीं करते हैं जिसमें ये कुकीज़ हेडर में दिखाई देते हैं।

अपने उदाहरण अनुरोध कुकी में ( कुकी: एक = 2; एक = 1 ) कृपया ध्यान दें कि पथ के साथ कुकी सेट / उदाहरण ( एक = 2 ) पथ के साथ एक से एक लंबे समय तक मार्ग होता है / ( एक = 1 ) और इसलिए यह आपको पहले पंक्ति में वापस भेजा जाता है, जो युक्ति की अनुशंसा से मेल खाता है। इस प्रकार आप अपनी धारणा में कम या ज्यादा सही हैं कि आप पहले मूल्य का चयन कर सकते हैं।

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

यदि आप कुकी के मूल्य को नियंत्रित करने की स्थिति में हैं और आप अपने समाधान को मूर्ख बनाना चाहते हैं, तो आप सबसे अच्छे हैं:

  1. कुछ पथों में ओवरराइड करने के लिए एक अलग कुकी नाम का उपयोग करना, जैसे:

    • सेट-कुकी: एक वैश्विक-वैश्विक = 1; पथ = /; संस्करण = 1
    • सेट-कुकी: एक-उदाहरण = 2; पथ = / उदाहरण; संस्करण = 1
  2. कुकी मान में आपको जिस पथ की आवश्यकता है, उसे संग्रहीत करना:

    • सेट-कुकी: a = 1 और पथ = /; पथ = /; संस्करण = 1
    • सेट-कुकी: a = 2 और पथ = / उदाहरण; पथ = / उदाहरण; संस्करण = 1

इन दोनों वर्कअराउंड में उपलब्ध कुकी की सूची के विरुद्ध अनुरोधित URL की तुलना करके, वांछित कुकी मान लेने के लिए सर्वर पर अतिरिक्त तर्क की आवश्यकता होती है। यह बहुत सुंदर नहीं है। यह दुर्भाग्यपूर्ण है कि आरएफसी के पास यह आवश्यकता नहीं थी कि एक लंबा रास्ता पूरी तरह से एक छोटे रास्ते के साथ एक कुकी को ओवरराइड करता है (जैसे: आपके उदाहरण में, आपको कुकी प्राप्त होगी : a = 2 केवल )।


2
इन लानत RFC से इसे खोदने के लिए धन्यवाद! // अगर कोई भी इन सिफारिशों का पालन नहीं कर रहा है, तो उन्हें पढ़ने में भी क्यों परेशान किया जाए? ..
रास्ट

3
ऐसा लगता है कि Wildfly 8.0 कुकीज़ के क्रम पर ध्यान दे रहा है और पहले वाले का उपयोग करता है। यह हमें 'नेस्टेड' संदर्भ में एक और ऐप चलाने की अनुमति देता है। हालाँकि, यह विफल होगा यदि कुछ ब्राउज़र RFC की अनुशंसा का पालन नहीं करते हैं। JSESSIONID2 जैसे सत्र कुकी के विभिन्न नाम सेट करने के लिए ऐसा करने का सही तरीका।
होनजजड़े

2
मैंने आपके उत्तर को पढ़ने के बाद प्रमुख ब्राउज़रों का परीक्षण किया: क्रोम 63 / ओपेरा 55 / IE11 / एज 16 / सफारी 11 / फ़ायरफ़ॉक्स 58 और वे सभी इसे सही ढंग से संभालते दिख रहे हैं कि कुकी लंबे पथ के साथ कम पथ के साथ हैं। और PHP (संस्करण 7 पर परीक्षण) में यह केवल पहली कुकी को पढ़ता है जो $ _COOKIE चर पर सेट है।
अलेक्जेंडर श्रेंज

1
क्या path=/;Path=/विनिर्देश FRC-6265 के अनुरूप है? ऐसा उल्लेख मुझे नहीं मिला। टॉमकैट खतरा किसी भी ";" गलत प्रतीक के रूप में पथ पर
हबबिटस

1
@ हबीबेटस ध्यान दें, ऐसा a=2&path=/example;Path=/exampleइसलिए है कि कोई ;रास्ता नहीं है।
फ्रैंकलिन यू

2

एक ही नाम के लिए कई मान होने के साथ कुछ भी गलत नहीं है ... यदि आप उन्हें चाहते हैं। आप मान में अतिरिक्त संदर्भ भी एम्बेड कर सकते हैं।

यदि आप नहीं करते हैं, तो निश्चित रूप से विभिन्न नाम एक समाधान हैं यदि आप दोनों संदर्भों को चाहते हैं।

विकल्प यह है कि अधिक विशिष्ट पथों से समान पथ (और डोमेन) के साथ एक ही कुकी नाम भेजें। कुकी निर्देश सेट करने से उस कुकी का मान समाप्त हो जाएगा।

अब जब आप सबसे महत्वपूर्ण भाग जानते हैं (वे कैसे काम करते हैं), और यह कि आप कुछ अलग-अलग तरीकों से अपनी ज़रूरतों को पूरा कर सकते हैं, तो आपके प्रश्न का मेरा उत्तर है: यह एक डेवलपर मुद्दा है।


0

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

मैं दृढ़ता से अनुशंसा करूंगा कि इस अभ्यास से बचा जाए।

हालाँकि यदि आप वास्तव में जानना चाहते हैं कि ब्राउज़र (और ऐप्स) इस परिदृश्य को कैसे संभालते हैं, तो टेस्ट रिग का निर्माण क्यों न करें और इसे आज़माएं।


2
एक सर्वर का ब्राउज़र द्वारा इसे भेजे जाने पर कोई नियंत्रण नहीं है। इसे अभी भी संभालने की जरूरत है।
मार्टिन ओकोनर

0

यदि आप जावा / स्काला फ्रेमवर्क का उपयोग करते हैं: बाहर देखें! यदि अनुरोध में एक ही नाम के साथ कई कुकीज़ हैं, तो Play केवल उनमें से 1 को आपके कोड में प्रस्तुत करेगा।


-2

यदि आपको उन्हें अलग करने की आवश्यकता है, तो आपको उन्हें अलग-अलग महत्वपूर्ण मूल्य देने होंगे।

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