ऑरिजिन-एजेंट-क्लस्टर हेडर की मदद से, परफ़ॉर्मेंस आइसोलेशन का अनुरोध करना

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

Domenic Denicola
Domenic Denicola

Origin-Agent-Cluster एक नया एचटीटीपी रिस्पॉन्स हेडर है. यह ब्राउज़र को निर्देश देता है कि वह एक ही साइट के क्रॉस-ऑरिजिन पेजों के बीच, सिंक्रोनस स्क्रिप्टिंग ऐक्सेस को रोके. ब्राउज़र, Origin-Agent-Cluster का इस्तेमाल इस बात के संकेत के तौर पर भी कर सकते हैं कि आपके ऑरिजिन को अलग से रिसॉर्स मिलना चाहिए. जैसे, कोई खास प्रोसेस.

ब्राउज़र के साथ काम करना

फ़िलहाल, Origin-Agent-Cluster हेडर सिर्फ़ Chrome 88 और उसके बाद के वर्शन में लागू किया गया है. इसे Mozilla Firefox के प्रतिनिधियों के साथ मिलकर डिज़ाइन किया गया है. उन्होंने इसे प्रोटोटाइप के तौर पर इस्तेमाल करने लायक के तौर पर मार्क किया है. साथ ही, Safari में इस्तेमाल होने वाले ब्राउज़र इंजन, WebKit के प्रतिनिधियों ने इसे शुरुआती तौर पर अच्छा रेस्पॉन्स दिया है.

हालांकि, इस बीच, अपने सभी उपयोगकर्ताओं के लिए Origin-Agent-Cluster हेडर को डिप्लॉय करने में कोई समस्या नहीं है. जो ब्राउज़र इसे समझ नहीं पाते वे इसे अनदेखा कर देंगे. साथ ही, ऑरिजिन-की वाले एजेंट क्लस्टर के पेज, साइट-की वाले पेजों (डिफ़ॉल्ट) के मुकाबले कम काम कर सकते हैं. इसलिए, इंटरऑपरेबिलिटी से जुड़ी कोई समस्या नहीं है.

ब्राउज़र, एक ही साइट के ऑरिजिन को अपने-आप अलग क्यों नहीं कर सकते

वेब, एक ही ऑरिजिन से जुड़ी नीति पर आधारित है. यह एक सुरक्षा सुविधा है, जो दस्तावेज़ों और स्क्रिप्ट को किसी दूसरे ऑरिजिन के रिसॉर्स के साथ इंटरैक्ट करने के तरीके पर पाबंदी लगाती है. उदाहरण के लिए, https://a.example पर होस्ट किया गया पेज, https://b.example या https://sub.a.example पर होस्ट किए गए पेज से अलग ऑरिजिन पर होता है.

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

इन दिनों ब्राउज़र ज़्यादा बेहतर हैं और अलग-अलग ऑरिजिन को अलग-अलग प्रोसेस में बांटने की कोशिश करते हैं. यह प्रोसेस हर ब्राउज़र में अलग-अलग तरीके से काम करती है: ज़्यादातर ब्राउज़र में टैब के बीच कुछ लेवल का बंटवारा होता है. हालांकि, एक ही टैब में मौजूद अलग-अलग iframe, एक ही प्रोसेस शेयर कर सकते हैं. साथ ही, प्रोसेस में कुछ मेमोरी खर्च होती है. इसलिए, वे बहुत ज़्यादा प्रोसेस बनाने से बचने के लिए, हेयुरिस्टिक्स का इस्तेमाल करते हैं: उदाहरण के लिए, Firefox में उपयोगकर्ता के हिसाब से प्रोसेस की सीमा तय की जा सकती है. साथ ही, Chrome अपने व्यवहार में डेस्कटॉप (जहां मेमोरी ज़्यादा होती है) और मोबाइल (जहां मेमोरी कम होती है) के बीच अंतर करता है.

ये हेयुरिस्टिक्स सटीक नहीं हैं. साथ ही, इनमें एक अहम सीमा है: एक ही ऑरिजिन की नीति में कुछ अपवाद हैं, जिनकी वजह से https://sub.a.example और https://a.example जैसे सबडोमेन एक-दूसरे से बात कर सकते हैं. इसलिए, ब्राउज़र अपने-आप सबडोमेन को एक-दूसरे से अलग नहीं कर सकते.

इस डिफ़ॉल्ट व्यवहार को "साइट के हिसाब से बने एजेंट क्लस्टर" कहा जाता है: इसका मतलब है कि ब्राउज़र, पेजों को उनकी साइट के आधार पर ग्रुप करता है. नया Origin-Agent-Cluster हेडर, ब्राउज़र से किसी पेज के लिए इस डिफ़ॉल्ट व्यवहार को बदलने के लिए कहता है. इसके बाद, उसे ऑरिजिन के हिसाब से बने एजेंट क्लस्टर में डालता है, ताकि उसे सिर्फ़ उन पेजों के साथ ग्रुप किया जा सके जिनका ऑरिजिन एक जैसा है. खास तौर पर, एक ही साइट के क्रॉस-ऑरिजिन पेजों को एजेंट क्लस्टर से बाहर रखा जाएगा.

ऑप्ट-इन करने पर, ब्राउज़र इन नए ऑरिजिन के हिसाब से बने एजेंट क्लस्टर को अपने खास संसाधन दे सकते हैं. इन संसाधनों को अन्य ऑरिजिन के संसाधनों के साथ नहीं जोड़ा जाता. उदाहरण के लिए, ऐसे पेजों के लिए अपनी प्रोसेस तय की जा सकती है या उन्हें अलग-अलग थ्रेड पर शेड्यूल किया जा सकता है. अपने पेज में Origin-Agent-Cluster हेडर जोड़कर, ब्राउज़र को यह बताया जा रहा है कि पेज को ऐसे खास रिसॉर्स से फ़ायदा मिलेगा.

हालांकि, अलग करने और इन फ़ायदों को पाने के लिए, ब्राउज़र को कुछ लेगसी सुविधाओं को बंद करना होगा.

ऑरिजिन-की वाले पेज क्या नहीं कर सकते

जब आपका पेज, ऑरिजिन-की वाले एजेंट क्लस्टर में होता है, तो आपको एक ही साइट के क्रॉस-ऑरिजिन पेजों से बात करने की कुछ सुविधाएं नहीं मिलतीं. ये सुविधाएं पहले उपलब्ध थीं. खास तौर पर:

  • अब document.domain को सेट नहीं किया जा सकता. यह एक लेगसी सुविधा है. आम तौर पर, इसकी मदद से एक ही साइट के क्रॉस-ऑरिजिन पेज, एक-दूसरे के डीओएम को सिंक करके ऐक्सेस कर सकते हैं. हालांकि, ऑरिजिन के हिसाब से बने एजेंट क्लस्टर में यह सुविधा बंद रहती है.

  • अब postMessage() की मदद से, एक ही साइट के दूसरे क्रॉस-ऑरिजिन पेजों पर WebAssembly.Module ऑब्जेक्ट नहीं भेजे जा सकते.

  • (सिर्फ़ Chrome के लिए) अब एक ही साइट के दूसरे क्रॉस-ऑरिजिन पेजों पर, SharedArrayBuffer या WebAssembly.Memory ऑब्जेक्ट नहीं भेजे जा सकते.

ऑरिजिन-की एजेंट क्लस्टर का इस्तेमाल कब करना चाहिए

Origin-Agent-Cluster हेडर से सबसे ज़्यादा फ़ायदा पाने वाले ऑरिजिन ये हैं:

  • जब भी हो सके, अपने खास संसाधनों का इस्तेमाल करके बेहतरीन परफ़ॉर्म करें. उदाहरण के लिए, बेहतर परफ़ॉर्मेंस वाले गेम, वीडियो कॉन्फ़्रेंसिंग साइटें या मल्टीमीडिया क्रिएशन ऐप्लिकेशन.

  • इसमें ज़्यादा संसाधनों वाले ऐसे iframe शामिल हैं जो अलग-अलग ऑरिजिन के हैं, लेकिन एक ही साइट के हैं. उदाहरण के लिए, अगर https://mail.example.com, https://chat.example.com iframes को एम्बेड करता है, तो ऑरिजिन-कीइंग https://mail.example.com/ यह पक्का करता है कि चैट टीम के लिखे गए कोड से, मेल टीम के लिखे गए कोड में गलती से कोई रुकावट न आए. साथ ही, यह ब्राउज़र को अलग-अलग प्रोसेस देने का सुझाव दे सकता है, ताकि उन्हें अलग से शेड्यूल किया जा सके और परफ़ॉर्मेंस पर एक-दूसरे का असर कम हो.

  • इनका इस्तेमाल, एक ही साइट के अलग-अलग ऑरिजिन वाले पेजों पर किया जा सकता है. हालांकि, इनमें ज़्यादा संसाधनों की ज़रूरत होती है. उदाहरण के लिए, अगर https://customerservicewidget.example.com को वीडियो चैट के लिए कई संसाधनों का इस्तेमाल करना है और उसे https://*.example.com में अलग-अलग ऑरिजिन पर एम्बेड किया जाएगा, तो उस विजेट को मैनेज करने वाली टीम, Origin-Agent-Cluster हेडर का इस्तेमाल करके, एम्बेड करने वालों पर उसकी परफ़ॉर्मेंस के असर को कम कर सकती है.

इसके अलावा, आपको यह भी पक्का करना होगा कि आपने ऊपर बताई गई अक्सर इस्तेमाल न की जाने वाली, क्रॉस-ऑरिजिन कम्यूनिकेशन की सुविधाओं को बंद करने की अनुमति दी है. साथ ही, यह भी पक्का करें कि आपकी साइट एचटीटीपीएस का इस्तेमाल कर रही हो.

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

यह क्रॉस-ऑरिजिन आइसोलेशन से कैसे जुड़ा है?

Origin-Agent-Cluster हेडर की मदद से एजेंट क्लस्टर को ऑरिजिन के हिसाब से व्यवस्थित करना, Cross-Origin-Opener-Policy और Cross-Origin-Embedder-Policy हेडर की मदद से क्रॉस-ऑरिजिन आइसोलेशन से जुड़ा है, लेकिन यह उससे अलग है.

जो साइट खुद को क्रॉस-ऑरिजिन से अलग करती है वह Origin-Agent-Cluster हेडर का इस्तेमाल करने पर, एक ही साइट के क्रॉस-ऑरिजिन कम्यूनिकेशन की सुविधाओं को भी बंद कर देगी. हालांकि, क्रॉस-ऑरिजिन आइसोलेशन के साथ-साथ, Origin-Agent-Cluster हेडर अब भी काम का हो सकता है. यह ब्राउज़र के लिए, संसाधन के बंटवारे के लिए इस्तेमाल होने वाले हेरिस्टिक में बदलाव करने के लिए एक अतिरिक्त संकेत के तौर पर काम करता है. इसलिए, आपको अब भी Origin-Agent-Cluster हेडर लागू करना चाहिए और नतीजों को मेज़र करना चाहिए. ऐसा उन पेजों पर भी करना चाहिए जो पहले से ही क्रॉस-ऑरिजिन से अलग किए गए हैं.

Origin-Agent-Cluster हेडर का इस्तेमाल करने का तरीका

Origin-Agent-Cluster हेडर का इस्तेमाल करने के लिए, अपने वेब सर्वर को यह एचटीटीपी रिस्पॉन्स हेडर भेजने के लिए कॉन्फ़िगर करें:

Origin-Agent-Cluster: ?1

?1 की वैल्यू, बूलियन true की वैल्यू के लिए स्ट्रक्चर्ड शीर्षक सिंटैक्स है.

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

ब्राउज़र, हेडर का हमेशा पालन क्यों नहीं कर पाता?

इस "मेमोरी" की वजह यह है कि किसी ऑरिजिन के लिए, कुंजी को एक जैसा रखा जा सके. अगर किसी ऑरिजिन के कुछ पेजों को ऑरिजिन-की दी गई थी, जबकि अन्य पेजों को नहीं दी गई थी, तो आपके पास एक ही ऑरिजिन के दो पेज हो सकते थे, जिन्हें अलग-अलग एजेंट क्लस्टर में रखा गया था. इसलिए, उन्हें एक-दूसरे से बात करने की अनुमति नहीं थी. यह वेब डेवलपर और ब्राउज़र के इंटरनल, दोनों के लिए बहुत अजीब होगा. इसलिए, Origin-Agent-Cluster के लिए तय की गई शर्तों के मुताबिक, अगर हेडर किसी ऑरिजिन के लिए पहले से मौजूद हेडर से मेल नहीं खाता है, तो उसे अनदेखा कर दिया जाता है. Chrome में, इसकी वजह से कंसोल पर चेतावनी दिखेगी.

यह एक ब्राउज़िंग कॉन्टेक्स्ट ग्रुप के दायरे में आता है. यह टैब, विंडो या iframe का एक ग्रुप होता है. ये सभी window.opener, frames[0] या window.parent जैसे तरीकों से एक-दूसरे तक पहुंच सकते हैं. इसका मतलब है कि जब किसी ऑरिजिन की ऑरिजिन- या साइट-कीइंग तय हो जाती है (ब्राउज़र को हेडर दिखने या न दिखने पर), तो उसे बदलने के लिए एक नया टैब खोलना पड़ता है. यह टैब, किसी भी तरह से पुराने टैब से कनेक्ट नहीं होता.

Origin-Agent-Cluster हेडर की जांच करने के लिए, यह जानकारी अहम हो सकती है. अपनी साइट पर इसे पहली बार जोड़ते समय, सिर्फ़ पेज को फिर से लोड करने से काम नहीं होगा. आपको टैब बंद करके, नया टैब खोलना होगा.

Origin-Agent-Cluster हेडर लागू है या नहीं, यह देखने के लिए JavaScript window.originAgentCluster प्रॉपर्टी का इस्तेमाल करें. यह वैल्यू true होगी, जब हेडर (या क्रॉस-ऑरिजिन आइसोलेशन जैसे अन्य तरीकों) की वजह से ऑरिजिन-कीइंग हुई हो. यह वैल्यू false होगी, जब ऑरिजिन-कीइंग नहीं हुई हो. साथ ही, यह वैल्यू undefined उन ब्राउज़र में होगी जो Origin-Agent-Cluster हेडर लागू नहीं करते. इस डेटा को अपने Analytics प्लैटफ़ॉर्म पर लॉग करने से, यह जांचने में मदद मिल सकती है कि आपने अपने सर्वर को सही तरीके से कॉन्फ़िगर किया है या नहीं.

आखिर में, ध्यान दें कि Origin-Agent-Cluster हेडर सिर्फ़ सुरक्षित कॉन्टेक्स्ट पर काम करेगा. जैसे, एचटीटीपीएस पेजों या http://localhost पर. Localhost के अलावा अन्य एचटीटीपी पेजों पर, ऑरिजिन-की वाले एजेंट क्लस्टर काम नहीं करते.

ऑरिजिन-कीिंग, सुरक्षा से जुड़ी सुविधा नहीं है

ऑरिजिन-की वाले एजेंट क्लस्टर का इस्तेमाल करने पर, आपके ऑरिजिन को एक ही साइट के क्रॉस-ऑरिजिन पेजों से सिंक्रोनस ऐक्सेस से अलग कर दिया जाता है. हालांकि, इससे आपको सुरक्षा से जुड़े हेडर, जैसे कि Cross-Origin-Resource-Policy और Cross-Origin-Opener-Policy से सुरक्षा नहीं मिलती. खास तौर पर, यह Spectre जैसे साइड चैनल हमलों से सुरक्षा देने में भरोसेमंद नहीं है.

यह थोड़ा हैरान करने वाला हो सकता है, क्योंकि ऑरिजिन-कीइंग की वजह से कभी-कभी आपके ऑरिजिन को अपनी प्रोसेस मिल सकती है. अलग-अलग प्रोसेस, साइड-चैनल अटैक से बचाव के लिए अहम होती हैं. हालांकि, ध्यान रखें कि Origin-Agent-Cluster हेडर सिर्फ़ एक संकेत है. ब्राउज़र पर यह ज़रूरी नहीं है कि वह आपके ऑरिजिन को अलग प्रोसेस दे. ऐसा कई वजहों से हो सकता है:

  • ऐसा हो सकता है कि कोई ब्राउज़र ऐसा करने के लिए टेक्नोलॉजी लागू न करे. उदाहरण के लिए, फ़िलहाल Safari और Firefox, अपनी प्रोसेस में अलग-अलग टैब डाल सकते हैं, लेकिन iframes के लिए ऐसा नहीं कर सकते.

  • ऐसा हो सकता है कि ब्राउज़र यह तय करे कि अलग प्रोसेस की ज़रूरत नहीं है. उदाहरण के लिए, कम मेमोरी वाले Android डिवाइसों या Android वेबव्यू में, Chrome कम से कम प्रोसेस का इस्तेमाल करता है.

  • हो सकता है कि ब्राउज़र, Origin-Agent-Cluster हेडर से मिले अनुरोध का पालन करना चाहे, लेकिन वह प्रोसेस के बजाय अलग तरह की अलगाव तकनीक का इस्तेमाल करके ऐसा कर सकता है. उदाहरण के लिए, Chrome इस तरह के परफ़ॉर्मेंस आइसोलेशन के लिए, प्रोसेस के बजाय थ्रेड का इस्तेमाल करने की परफ़ॉर्मेंस एक्सप्लोर कर रहा है.

  • हो सकता है कि उपयोगकर्ता या किसी दूसरी साइट पर चल रहा कोड, आपके ऑरिजिन पर पहले से ही साइट-की वाले पेज पर जा चुका हो. इस वजह से, एक जैसी जानकारी देने की गारंटी लागू हो जाती है और Origin-Agent-Cluster हेडर को पूरी तरह से अनदेखा कर दिया जाता है.

इन वजहों से, ऑरिजिन के हिसाब से बने एजेंट क्लस्टर को सुरक्षा से जुड़ी सुविधा के तौर पर नहीं देखना चाहिए. इसके बजाय, यह ब्राउज़र को संसाधनों के बंटवारे की प्राथमिकता तय करने में मदद करता है. यह इस बात का संकेत देता है कि आपके ऑरिजिन को खास संसाधनों से फ़ायदा मिलेगा. साथ ही, इसके बदले में आप कुछ सुविधाओं को छोड़ने को तैयार हैं.

सुझाव/राय दें या शिकायत करें

अगर Origin-Agent-Cluster हेडर का इस्तेमाल किया जा रहा है या इसका इस्तेमाल करने पर विचार किया जा रहा है, तो Chrome की टीम को इस बारे में बताएं. आपके सार्वजनिक हित और समर्थन से, हमें सुविधाओं को प्राथमिकता देने में मदद मिलती है. साथ ही, हम ब्राउज़र के अन्य वेंडर को यह दिखा पाते हैं कि ये सुविधाएं कितनी ज़रूरी हैं. @ChromiumDev पर ट्वीट करें और Chrome DevRel को अपने विचार और अनुभव बताएं.

अगर आपको स्पेसिफ़िकेशन या इस सुविधा के काम करने के तरीके के बारे में ज़्यादा सवाल पूछने हैं, तो एचटीएमएल स्टैंडर्ड के GitHub रिपॉज़िटरी पर समस्या दर्ज करें. अगर आपको Chrome में इस सुविधा को लागू करने में कोई समस्या आती है, तो new.crbug.com पर जाकर गड़बड़ी की शिकायत करें. इसके लिए, कॉम्पोनेंट फ़ील्ड को Internals>Sandbox>SiteIsolation पर सेट करें.

ज़्यादा जानें

ऑरिजिन के हिसाब से एजेंट क्लस्टर के बारे में ज़्यादा जानने के लिए, इन लिंक पर जाएं: