COOP और COEP का इस्तेमाल करके, अपनी वेबसाइट को "क्रॉस-ऑरिजिन आइसोलेटेड" बनाना

COOP और COEP का इस्तेमाल करके, क्रॉस-ऑरिजिन आइसोलेटेड एनवायरमेंट को सेट अप करें. साथ ही, SharedArrayBuffer, performance.measureUserAgentSpecificMemory(), और हाई रिज़ॉल्यूशन टाइमर जैसी बेहतरीन सुविधाएं चालू करें. ये सुविधाएं सटीक तरीके से काम करेंगी.

अपडेट

  • 21 जून, 2022: क्रॉस-ऑरिजिन आइसोलेशन चालू होने पर, वर्कर स्क्रिप्ट का भी ध्यान रखने की ज़रूरत होती है. कुछ एक्सप्लेनेशंस जोड़े गए हैं.
  • 5 अगस्त, 2021: JS सेल्फ़-प्रोफ़ाइलिंग एपीआई को एक ऐसे एपीआई के तौर पर बताया गया है जिसे क्रॉस-ऑरिजिन आइसोलेशन की ज़रूरत है. हालांकि, निर्देश में हाल ही में हुए बदलाव को दिखाते हुए, इसे हटा दिया गया है.
  • 6 मई, 2021: हमें मिले सुझावों और समस्याओं के आधार पर, हमने किसी भी क्रॉस-ऑरिजिन आइसोलेटेड साइट पर SharedArrayBuffer के इस्तेमाल की समयावधि में बदलाव करने का फ़ैसला किया है. ऐसा Chrome M92 में नहीं किया जा सकेगा.
  • 16 अप्रैल, 2021: क्रॉस-ऑरिजिन आइसोलेशन के लिए, सीओईपी के बिना क्रेडेंशियल वाले नए मोड और सीओपीपी को एक ही ऑरिजिन वाले अनुमति वाले पॉप-अप के तौर पर कम करने के बारे में जानकारी जोड़ी गई.
  • 5 मार्च, 2021: SharedArrayBuffer,performance.measureUserAgentSpecificMemory(), और डीबग करने की सुविधाओं के लिए सीमाएं हटा दी गई हैं. ये सुविधाएं अब Chrome 89 में पूरी तरह से चालू हैं. आने वाली performance.now() और performance.timeOrigin सुविधाएं जोड़ी गई हैं, जो ज़्यादा सटीक होंगी.
  • 19 फ़रवरी, 2021: DevTools पर सुविधा से जुड़ी नीति allow="cross-origin-isolated" और डीबग करने की सुविधा के बारे में एक जानकारी जोड़ी गई.
  • 15 अक्टूबर, 2020: self.crossOriginIsolated, Chrome 87 पर उपलब्ध है. ध्यान दें कि जब self.crossOriginIsolated, true को दिखाता है, तो document.domain को बदला नहीं जा सकता. performance.measureUserAgentSpecificMemory() का ऑरिजिन ट्रायल खत्म हो रहा है और यह Chrome 89 में डिफ़ॉल्ट रूप से चालू रहता है. Android Chrome पर शेयर किया गया अरे बफ़र, Chrome 88 में उपलब्ध होगा.

कुछ वेब एपीआई से Spectre जैसे साइड-चैनल हमलों का खतरा बढ़ जाता है. इस जोखिम को कम करने के लिए, ब्राउज़र ऑप्ट-इन-आधारित आइसोलेटेड एनवायरमेंट की सुविधा देते हैं जिसे क्रॉस-ऑरिजिन आइसोलेटेड कहा जाता है. क्रॉस-ऑरिजिन आइसोलेटेड स्थिति में, वेबपेज को खास सुविधाओं का इस्तेमाल करने की अनुमति मिल जाएगी. इन सुविधाओं में ये शामिल हैं:

API ब्यौरा
SharedArrayBuffer WebAssembly थ्रेड के लिए ज़रूरी है. यह सुविधा Android Chrome 88 पर उपलब्ध है. डेस्कटॉप वर्शन, फ़िलहाल साइट आइसोलेशन की मदद से डिफ़ॉल्ट रूप से चालू है. हालांकि, इसके लिए क्रॉस-ऑरिजिन आइसोलेटेड स्टेट की ज़रूरत होगी और Chrome 92 में डिफ़ॉल्ट रूप से बंद हो जाएगा.
performance.measureUserAgentSpecificMemory() Chrome 89 से उपलब्ध.
performance.now(), performance.timeOrigin फ़िलहाल, यह सुविधा 100 माइक्रोसेकंड या उससे ज़्यादा रिज़ॉल्यूशन वाले कई ब्राउज़र में उपलब्ध है. क्रॉस-ऑरिजिन आइसोलेशन का इस्तेमाल करने पर, रिज़ॉल्यूशन पांच माइक्रोसेकंड या इससे ज़्यादा हो सकता है.
ऐसी सुविधाएं जो क्रॉस-ऑरिजिन आइसोलेटेड स्टेट में उपलब्ध होंगी.

क्रॉस-ऑरिजिन आइसोलेटेड स्टेट, document.domain में भी बदलाव करने से रोकता है. (document.domain में बदलाव करने से, एक ही साइट के दस्तावेज़ों के बीच कम्यूनिकेशन हो सकता है. साथ ही, इसे एक ही ऑरिजिन से जुड़ी नीति की गड़बड़ी माना जाता है.)

क्रॉस-ऑरिजिन आइसोलेटेड स्टेट में ऑप्ट-इन करने के लिए, आपको मुख्य दस्तावेज़ पर ये एचटीटीपी हेडर भेजने होंगे:

Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin

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

self.crossOriginIsolated की जांच करके, यह पता लगाया जा सकता है कि कोई वेब पेज, क्रॉस-ऑरिजिन आइसोलेटेड स्थिति में है या नहीं.

इस लेख में इन नए हेडर को इस्तेमाल करने का तरीका बताया गया है. फ़ॉलो-अप लेख में, मैं ज़्यादा जानकारी और संदर्भ उपलब्ध कराऊंगा.

अपनी वेबसाइट को क्रॉस-ऑरिजिन आइसोलेटेड करने के लिए, COOP और COEP का इस्तेमाल करना

COOP और COEP का समाकलन करना

1. Cross-Origin-Opener-Policy: same-origin हेडर को टॉप-लेवल के दस्तावेज़ पर सेट करें

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

ब्राउज़िंग कॉन्टेक्स्ट ग्रुप, विंडो का एक सेट होता है, जो एक-दूसरे का रेफ़रंस दे सकता है. उदाहरण के लिए, <iframe> के ज़रिए एम्बेड किए गए टॉप लेवल दस्तावेज़ और उसके चाइल्ड दस्तावेज़. अगर कोई वेबसाइट (https://a.example) कोई पॉप-अप विंडो (https://b.example) खोलती है, तो ओपनर विंडो और पॉप-अप विंडो में एक ही ब्राउज़िंग कॉन्टेक्स्ट होता है. ऐसे में, उनके पास window.opener जैसे DOM एपीआई के ज़रिए एक-दूसरे का ऐक्सेस होता है.

ब्राउज़िंग कॉन्टेक्स्ट ग्रुप

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

2. पक्का करें कि संसाधनों में सीओआरपी या सीओआरएस चालू हो

पक्का करें कि पेज पर मौजूद सभी संसाधन सीओआरपी या सीओआरएस एचटीटीपी हेडर से लोड किए गए हों. यह चरण चौथे चरण, सीओईपी को चालू करने के लिए ज़रूरी है.

यहां बताया गया है कि संसाधन के हिसाब से आपको क्या करना होगा:

  • अगर रिसॉर्स को सिर्फ़ एक ही ऑरिजिन से लोड किया जाना है, तो Cross-Origin-Resource-Policy: same-origin हेडर सेट करें.
  • अगर इस रिसॉर्स को सिर्फ़ उसी साइट से लोड किए जाने की उम्मीद है जहां क्रॉस ऑरिजिन का इस्तेमाल किया जाना है, तो Cross-Origin-Resource-Policy: same-site हेडर सेट करें.
  • अगर संसाधन को आपके कंट्रोल में मौजूद क्रॉस ऑरिजिन से लोड किया जाता है, तो अगर हो सके, तो Cross-Origin-Resource-Policy: cross-origin हेडर को सेट करें.
  • उन क्रॉस ऑरिजिन रिसॉर्स के लिए जिन पर आपका कोई कंट्रोल नहीं है:
    • अगर संसाधन सीओआरएस के साथ उपलब्ध कराया जाता है, तो लोड होने वाले एचटीएमएल टैग में crossorigin एट्रिब्यूट का इस्तेमाल करें. (उदाहरण के लिए, <img src="***" crossorigin>.)
    • संसाधन के मालिक से, सीओआरएस या सीओआरपी पर सहायता देने के लिए कहें.
  • iframe के लिए, ऊपर दिए गए सिद्धांतों का पालन करें और Cross-Origin-Resource-Policy: cross-origin (या same-site, same-origin कॉन्टेक्स्ट के आधार पर) सेट करें.
  • WebWorker के साथ लोड की गई स्क्रिप्ट, एक ही ऑरिजिन से दिखाई जानी चाहिए, इसलिए आपको सीओआरपी या सीओआरएस हेडर की ज़रूरत नहीं है.
  • COEP: require-corp के साथ दिखाए गए किसी दस्तावेज़ या वर्कर के लिए, सीओआरएस के बिना लोड किए गए क्रॉस-ऑरिजिन सबरिसॉर्स को Cross-Origin-Resource-Policy: cross-origin हेडर सेट करना होगा, ताकि उन्हें एम्बेड किए जाने के लिए ऑप्ट इन किया जा सके. उदाहरण के लिए, यह <script>, importScripts, <link>, <video>, <iframe> वगैरह पर लागू होता है.

3. एम्बेड किए गए रिसॉर्स का आकलन करने के लिए, COEP रिपोर्ट-ओनली एचटीटीपी हेडर का इस्तेमाल करें

सीओईपी को पूरी तरह से चालू करने से पहले, Cross-Origin-Embedder-Policy-Report-Only हेडर का इस्तेमाल करके यह जांच करें कि नीति वाकई में काम कर रही है या नहीं. एम्बेड किए गए कॉन्टेंट को ब्लॉक किए बिना, आपको रिपोर्ट मिलेंगी.

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

4. सीओईपी की सुविधा चालू करें

यह पुष्टि करने के बाद कि हर चीज़ काम कर रही है और सभी संसाधन सही तरीके से लोड हो पा रहे हैं, सभी दस्तावेज़ों के लिए Cross-Origin-Embedder-Policy-Report-Only हेडर को Cross-Origin-Embedder-Policy हेडर पर स्विच करें. ऐसा सभी दस्तावेज़ों पर करें जिनमें iframes और वर्कर स्क्रिप्ट से एम्बेड किए गए हेडर भी शामिल हैं.

पता करें कि self.crossOriginIsolated से, आइसोलेट हो गया है या नहीं

जब वेब पेज क्रॉस-ऑरिजिन आइसोलेटेड स्थिति में होता है और सभी रिसॉर्स और विंडो एक ही ब्राउज़िंग कॉन्टेक्स्ट ग्रुप में आइसोलेटेड होते हैं, तब self.crossOriginIsolated प्रॉपर्टी true दिखाती है. इस एपीआई का इस्तेमाल करके, यह पता लगाया जा सकता है कि आपने ब्राउज़िंग कॉन्टेक्स्ट ग्रुप को अलग कर दिया है या नहीं और आपको performance.measureUserAgentSpecificMemory() जैसी बेहतर सुविधाओं का ऐक्सेस मिला है या नहीं.

Chrome DevTools का इस्तेमाल करके समस्याओं को डीबग करना

स्क्रीन पर रेंडर किए गए रिसॉर्स, जैसे कि इमेज के लिए, COEP की समस्याओं का पता लगाना काफ़ी आसान है. ऐसा इसलिए, क्योंकि इस अनुरोध को ब्लॉक कर दिया जाएगा और पेज किसी इमेज के बारे में दिखाएगा. हालांकि, जिन रिसॉर्स में स्क्रिप्ट या स्टाइल जैसे विज़ुअल पर असर नहीं पड़ता उनमें सीओईपी से जुड़ी समस्याएं शायद नज़र न आएं. उनके लिए, DevTools नेटवर्क पैनल का इस्तेमाल करें. अगर सीओईपी से जुड़ी कोई समस्या है, तो आपको स्थिति कॉलम में (blocked:NotSameOriginAfterDefaultedToSameOriginByCoep) दिखेगा.

नेटवर्क पैनल के स्थिति कॉलम में COEP से जुड़ी समस्याएं.

इसके बाद, ज़्यादा जानकारी देखने के लिए उस एंट्री पर क्लिक करें.

सीओईपी से जुड़ी समस्या की जानकारी, नेटवर्क पैनल में नेटवर्क रिसॉर्स पर क्लिक करने के बाद हेडर टैब में दिखती है.

ऐप्लिकेशन पैनल के ज़रिए, iframe और पॉप-अप विंडो की स्थिति भी तय की जा सकती है. बाईं ओर "फ़्रेम" सेक्शन में जाएं और रिसोर्स स्ट्रक्चर का ब्रेकडाउन देखने के लिए, "टॉप" को बड़ा करें.

आपके पास iframe का स्टेटस देखने का विकल्प होता है. जैसे, SharedArrayBuffer की उपलब्धता वगैरह.

Chrome DevTools iframe इंस्पेक्टर

पॉप-अप विंडो का स्टेटस भी देखा जा सकता है, जैसे कि क्रॉस-ऑरिजिन आइसोलेटेड.

Chrome DevTools पॉप-अप विंडो इंस्पेक्टर

Reporting API का इस्तेमाल करके समस्याएं देखें

Reporting API एक और तरीका है, जिससे कई समस्याओं का पता लगाया जा सकता है. जब भी COEP किसी संसाधन को लोड होने से रोकता है या COOP किसी पॉप-अप विंडो को आइसोलेट करता है, तब अपने उपयोगकर्ताओं के ब्राउज़र को रिपोर्ट भेजने का निर्देश देने के लिए, Reporting API को कॉन्फ़िगर किया जा सकता है. Chrome, Reporting API के वर्शन 69 से कई तरह के कामों के लिए, Reporting API पर काम करता है. इनमें COEP और COOP शामिल हैं.

Reporting API को कॉन्फ़िगर करने और रिपोर्ट पाने के लिए सर्वर सेट अप करने का तरीका जानने के लिए, Reporting API का इस्तेमाल करना पर जाएं.

सीओईपी रिपोर्ट का उदाहरण

क्रॉस-ऑरिजिन रिसॉर्स ब्लॉक होने पर, COEP रिपोर्ट पेलोड का उदाहरण ऐसा दिखता है:

[{
  "age": 25101,
  "body": {
    "blocked-url": "https://third-party-test.glitch.me/check.svg?",
    "blockedURL": "https://third-party-test.glitch.me/check.svg?",
    "destination": "image",
    "disposition": "enforce",
    "type": "corp"
  },
  "type": "coep",
  "url": "https://cross-origin-isolation.glitch.me/?coep=require-corp&coop=same-origin&",
  "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4249.0 Safari/537.36"
}]

COOP रिपोर्ट का उदाहरण

आइसोलेटेड पॉप-अप विंडो को खोलने पर, COOP रिपोर्ट पेलोड का उदाहरण ऐसा दिखता है:

[{
  "age": 7,
  "body": {
    "disposition": "enforce",
    "effectivePolicy": "same-origin",
    "nextResponseURL": "https://third-party-test.glitch.me/popup?report-only&coop=same-origin&",
    "type": "navigation-from-response"
  },
  "type": "coop",
  "url": "https://cross-origin-isolation.glitch.me/coop?coop=same-origin&",
  "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4246.0 Safari/537.36"
}]

जब अलग-अलग ब्राउज़िंग कॉन्टेक्स्ट ग्रुप एक-दूसरे को ऐक्सेस करने की कोशिश करते हैं (सिर्फ़ "रिपोर्ट-ओनली" मोड पर), तो COOP भी एक रिपोर्ट भेजता है. उदाहरण के लिए, postMessage() की कोशिश करने पर रिपोर्ट कुछ इस तरह दिखेगी:

[{
  "age": 51785,
  "body": {
    "columnNumber": 18,
    "disposition": "reporting",
    "effectivePolicy": "same-origin",
    "lineNumber": 83,
    "property": "postMessage",
    "sourceFile": "https://cross-origin-isolation.glitch.me/popup.js",
    "type": "access-from-coop-page-to-openee"
  },
  "type": "coop",
  "url": "https://cross-origin-isolation.glitch.me/coop?report-only&coop=same-origin&",
  "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4246.0 Safari/537.36"
},
{
  "age": 51785,
  "body": {
    "disposition": "reporting",
    "effectivePolicy": "same-origin",
    "property": "postMessage",
    "type": "access-to-coop-page-from-openee"
  },
  "type": "coop",
  "url": "https://cross-origin-isolation.glitch.me/coop?report-only&coop=same-origin&",
  "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4246.0 Safari/537.36"
}]

नतीजा

किसी वेब पेज को एक खास क्रॉस-ऑरिजिन आइसोलेटेड स्थिति में चुनने के लिए, COOP और COEP एचटीटीपी हेडर के कॉम्बिनेशन का इस्तेमाल करें. self.crossOriginIsolated की जांच करके यह पता लगाया जा सकता है कि कोई वेब पेज, क्रॉस-ऑरिजिन आइसोलेटेड स्थिति में है या नहीं.

हम इस पोस्ट को अपडेट करते रहेंगे, क्योंकि इस क्रॉस-ऑरिजिन आइसोलेटेड स्टेट में नई सुविधाएं उपलब्ध कराई गई हैं. साथ ही, सीओओपी और सीओईपी से जुड़े DevTools में सुधार किए जाएंगे.

रिसॉर्स