पहले-पक्ष की कुकी बनाने की रेसिपी

सुरक्षा, क्रॉस-ब्राउज़र के साथ काम करने की सुविधा, और तीसरे पक्ष की कुकी के बंद होने के बाद उनके क्रैश होने की संभावना को कम करने के लिए, पहले-पक्ष की कुकी सेट करने का तरीका जानें.

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

मौजूदा साइट के अलावा, दूसरे डोमेन की कुकी को आम तौर पर तीसरे पक्ष की कुकी कहा जाता है.

उदाहरण के लिए, अगर आपकी सेट की जा रही कुकी का इस्तेमाल सभी साइटों पर नहीं किया जाता. उदाहरण के लिए, इसका इस्तेमाल आपकी साइट पर सेशन को मैनेज करने के लिए किया जाता है और क्रॉस-साइट iframe में इसका इस्तेमाल कभी नहीं किया जाता. ऐसे में, उस कुकी का इस्तेमाल हमेशा पहले पक्ष के कॉन्टेक्स्ट में किया जाता है.

डिफ़ॉल्ट रूप से, कुकी को साइटों के बीच शेयर किया जा सकता है, JavaScript से ऐक्सेस किया जा सकता है, और एचटीटीपी कनेक्शन पर भेजा जा सकता है. इससे निजता और सुरक्षा को लेकर कुछ जोखिम हो सकते हैं. डिफ़ॉल्ट व्यवहार को बेहतर बनाने के लिए, लगातार काम किया जा रहा है. इसके लिए, प्राइवसी सैंडबॉक्स और ऑरिजिन से जुड़ी कुकी जैसे अन्य प्रपोज़ल की मदद से, अपनी कुकी पर अतिरिक्त एट्रिब्यूट सेट करके, बहुत कुछ किया जा सकता है.

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

रेसिपी

Set-Cookie:
__Host-cookie-name=cookie-value;
Secure;
Path=/;
HttpOnly;
Max-Age=7776000;
SameSite=Lax;
ब्यौरा

Host एक वैकल्पिक प्रीफ़िक्स है, जो कुछ एट्रिब्यूट को ज़रूरी बनाता है और अन्य एट्रिब्यूट पर रोक लगाता है:

  • Secure मौजूद होना चाहिए
  • Domain को शामिल नहीं किया जाना चाहिए
  • Path, / होनी चाहिए

Host जोड़ने के बाद, ब्राउज़र पर भरोसा किया जा सकता है कि ये एट्रिब्यूट __Host नियमों के मुताबिक सेट हैं या नहीं. अगर ऐसा नहीं है, तो कुकी को अस्वीकार कर दें.

Secure असुरक्षित नेटवर्क पर कुकी को चोरी होने से बचाता है, क्योंकि यह सिर्फ़ एचटीटीपीएस कनेक्शन पर कुकी भेजने की अनुमति देता है. अगर आपने अपनी साइट को एचटीटीपीएस पर पूरी तरह से माइग्रेट नहीं किया है, तो इस प्रक्रिया को प्राथमिकता दें.

Domain एट्रिब्यूट से यह तय होता है कि किन होस्ट को कुकी मिल सकती है. इसे हटाने से कुकी, मौजूदा दस्तावेज़ होस्ट तक सीमित हो जाएगी, लेकिन सबडोमेन शामिल नहीं होंगे: example.com की कुकी, example.com को किए गए हर अनुरोध पर भेजी जाएगी, लेकिन images.example.com के अनुरोध पर नहीं. अगर आपके अलग-अलग सबडोमेन पर अलग-अलग ऐप्लिकेशन चल रहे हैं, तो इससे एक डोमेन के हैक होने का जोखिम कम हो जाता है और दूसरे डोमेन तक पहुंचा जा सकता है.

Path से पता चलता है कि Cookie हेडर भेजने के लिए, ब्राउज़र के अनुरोध किए गए यूआरएल में उसी पाथ का होना ज़रूरी है. Path=/ को सेट करने का मतलब है कि कुकी को उस डोमेन के सभी यूआरएल पाथ पर भेजा जाता है. Domain और Path=/ का कॉम्बिनेशन, कुकी को ऑरिजिन से सबसे करीब से जोड़ता है. इसलिए, यह अन्य क्लाइंट-साइड स्टोरेज, जैसे कि LocalStorage की तरह ही काम करता है. example.com/a को example.com/b के लिए अलग-अलग वैल्यू मिल सकती हैं. इसलिए, इस बात को लेकर कोई भ्रम नहीं होता.

HttpOnly एट्रिब्यूट, JavaScript के ऐक्सेस को सीमित करके आपकी साइटों पर मौजूद तीसरे पक्ष की नुकसान पहुंचाने वाली स्क्रिप्ट से कुछ सुरक्षा देता है. यह किसी कुकी को सिर्फ़ अनुरोध हेडर में भेजने की अनुमति देता है और उन्हें document.cookie का इस्तेमाल करके JavaScript के लिए उपलब्ध नहीं कराता है.

Max-Age कुकी के इस्तेमाल को सीमित करता है, क्योंकि ब्राउज़र सेशन लंबे समय तक चलते हैं. साथ ही, आपको ऐसी पुरानी कुकी नहीं चाहिए जो हमेशा के लिए बनी रहे. यह कुछ समय के लिए इस्तेमाल होने वाली कुकी, जैसे कि उपयोगकर्ता के सेशन या फ़ॉर्म सबमिशन के लिए टोकन जैसी छोटी कुकी के लिए भी अच्छा है. Max-Age की जानकारी सेकंड में दी गई है. पिछले उदाहरण में, इसे 7776,000 सेकंड, यानी 90 दिन पर सेट किया गया है. यह एक उचित डिफ़ॉल्ट है, जिसे अपने इस्तेमाल के उदाहरण के हिसाब से बदला जा सकता है.

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

कुकी के अलग-अलग एट्रिब्यूट के बारे में ज़्यादा जानने के लिए, एमडीएन से जुड़ा Set-Cookie दस्तावेज़ देखें.

अगर आपके पास सबडोमेन वाली कोई साइट है और आपको उन सभी पर एक ही सेशन रखना है, तो Host प्रीफ़िक्स बहुत सीमित हो सकता है. उदाहरण के लिए, news.site में finance.news.site और sport.news.site जैसे विषयों के लिए सबडोमेन हो सकते हैं. साथ ही, आपको उन सभी के लिए एक उपयोगकर्ता सेशन की ज़रूरत होगी. ऐसे मामले में, __Host के बजाय __Secure प्रीफ़िक्स का इस्तेमाल करें और Domain बताएं.

रेसिपी

Set-Cookie:
__Secure-cookie-name=cookie-value;
Secure;
Domain=news.site;
Path=/;
HttpOnly;
Max-Age=7776000;
SameSite=Lax;
ब्यौरा

Secure एक वैकल्पिक प्रीफ़िक्स है, जो Host से कम ज़रूरी शर्तों का दावा करता है: इसके लिए, सिर्फ़ कुकी को Secure एट्रिब्यूट के साथ सेट करना ज़रूरी है.

SameSite=Lax कुकी, क्रॉस-साइट सबअनुरोधों (उदाहरण के लिए, किसी तीसरे पक्ष की साइट पर एम्बेड की गई इमेज या iframes लोड करते समय) पर नहीं भेजी जाती हैं. ये कुकी तब भेजी जाती हैं, जब कोई उपयोगकर्ता मूल साइट पर नेविगेट करता है. उदाहरण के लिए, किसी दूसरी साइट से लिंक फ़ॉलो करते समय.

आपके पास कुकी के ऐक्सेस पर पाबंदी लगाने और उन्हें SameSite=Strict की मदद से तीसरे पक्ष की वेबसाइटों से किए गए अनुरोधों के साथ भेजने पर पाबंदी लगाने का भी विकल्प है. यह तब काम आता है, जब आपके पास फ़ंक्शन से जुड़ी ऐसी कुकी हों जो हमेशा शुरुआती नेविगेशन के पीछे रहेंगी, जैसे कि पासवर्ड बदलना या खरीदारी करना.

रेसिपी

Set-Cookie:
__Host-cookie-name=cookie-value;
Secure;
Path=/;
HttpOnly;
Max-Age=7776000;
SameSite=Strict;