- HTTP cookies: वेब की state बनाए रखने के लिए इस्तेमाल होने वाले छोटे data pieces, जिन्हें browser सेट करने के बाद expiry तक हर HTTP request में शामिल करता है.
- समस्या: एक खास JavaScript code, Go standard library में cookies parse नहीं कर पा रहा था, जिससे error हुआ.
स्पेसिफिकेशन
- RFC 2109, 2965, 6265: cookies की शुरुआती परिभाषा और updates. cookie values के लिए स्पेसिफिकेशन server और browser के बीच मेल नहीं खाते.
- समस्याएँ:
- server को क्या भेजना चाहिए और browser को क्या स्वीकार करना चाहिए, यह एक जैसा नहीं है.
- browser server को जो cookie values भेजता है, उन पर कोई सीमा नहीं है.
- standard library को cookie headers कैसे संभालने चाहिए, इस पर स्पष्ट मार्गदर्शन नहीं है.
वेब ब्राउज़र
- Firefox: RFC जिन कुछ characters की सिफारिश नहीं करता, उन्हें स्वीकार करता है.
- Chromium: Firefox से थोड़ा अधिक restrictive है, लेकिन फिर भी कई characters स्वीकार करता है.
- Safari: अमान्य character मिलने पर cookie processing रोकता नहीं है, बल्कि उस character तक की value स्वीकार कर लेता है.
standard library
- Golang: RFC के समान व्यवहार करता है, लेकिन spaces और commas स्वीकार करता है.
- PHP: कुछ control characters पर error देता है.
- Python: जिन cookies को समझ नहीं पाता, उन्हें ignore करता है और आगे की cookies लोड करना रोक देता है.
- Ruby: सभी characters स्वीकार करता है और percent-encoding करता है.
- Rust: सभी UTF-8 strings स्वीकार करता है.
वेब के लिए महत्व
- वास्तविक समस्या: स्पेसिफिकेशन की अस्पष्टता के कारण कई websites आसानी से errors पैदा कर सकती हैं.
- समाधान: IETF HTTP Working Group को cookie specification अपडेट करनी चाहिए, और browsers व programming languages cookies को कैसे संभालते हैं, यह स्पष्ट करना चाहिए.
सारांश तालिका
- ब्राउज़र और भाषाओं में cookie handling: हर browser और language cookies को अलग तरीके से संभालते हैं. RFC के साथ उनका मेल भी अलग-अलग है.
1 टिप्पणियां
Hacker News राय
कुकीज़ में अप्रत्याशित समस्याएँ और असुविधाजनक व्यवहार शामिल होते हैं, फिर भी वे 99.95% मामलों में काम करते हैं। Cookie shadowing वह समस्या है जो तब होती है जब एक ही नाम लेकिन अलग key attributes (domain, path आदि) वाली कुकीज़ सेट की जाती हैं, और backend या JS यह नहीं पहचान पाता कि कौन-सी कुकी कौन-सी है
Rust में standard library में cookie handling की सुविधा नहीं है, और यह third-party
cookiecrate के व्यवहार का संदर्भ लेता है। इसमें Ruby की तरह percent encoding option शामिल हैHTTP protocol अपने भीतर असंख्य दूसरे protocol समेटे हुए है, और browser तथा web server तरह-तरह की सुविधाएँ जोड़ते रहते हैं। इन सुविधाओं के लिए स्पष्ट specification नहीं है, और client तथा server compatibility को निर्दिष्ट नहीं कर सकते। इसलिए अतीत के गलत फैसलों को ढोते रहना पड़ता है
लगभग 10 साल पहले, जब एक प्रोजेक्ट में cookie-based session लागू किया था, तो Safari में वह काम करता था लेकिन Chrome में नहीं। इसकी वजह यह थी कि अगर format सही न हो तो browser कुकी सेट नहीं करते, और इस मामले में उनके व्यवहार अलग थे
कुकी का एकमात्र उचित उपयोग यह है कि server client को पहचानने के लिए एक opaque token सेट करे। यह समस्या नहीं है कि client ऐसे values को संभाल सकता है जिन्हें server कभी भेजेगा ही नहीं
कुकीज़ एक जटिल समस्या हैं, और backward compatibility issues के कारण इन्हें बदलना लगभग असंभव है। एक नया mechanism बनाने की ज़रूरत है। उदाहरण के लिए, NewCookie mechanism में आधुनिक security measures और सख्त specification हो सकती है
कुकीज़ को समाप्त हो जाना चाहिए, और उनकी जगह authentication headers ले सकते हैं। अच्छा होता अगर browser में websites के लिए standard तरीके से authentication किया जा सकता। अफसोस है कि Basic और Digest authentication पर्याप्त साबित नहीं हुए
Safari का networking code open source नहीं है, इसलिए Swift का Foundation port एक अच्छा विकल्प हो सकता है। वहाँ control और deletion characters की जाँच की जा सकती है
Cookie header parsing उलझाऊ है। "standard" वास्तव में मौजूद चीज़ों को प्रतिबिंबित नहीं करता, और हर backend server, library, या framework अलग-अलग चीज़ों को स्वीकार करता है। अगर आप frontend और backend दोनों को पूरी तरह नियंत्रित कर सकते हैं तो यह बड़ी समस्या नहीं है, लेकिन जब दूसरे सिस्टमों के साथ interoperate करना पड़े तो यह बहुत जटिल हो जाता है
Crystal भाषा के साथ प्रयोग करते समय भी ऐसा ही मुद्दा आया। एक साधारण web scraper बनाने की कोशिश की, लेकिन default HTTP client response में सेट की गई कई कुकीज़ को parse नहीं कर पाया और रुक गया