nginx का इस्तेमाल करके, साइन किए हुए एचटीटीपी एक्सचेंज (एसएक्सजी) को उपलब्ध कराने का तरीका

nginx का इस्तेमाल करके एसएक्सजी फ़ाइलें पाने और उन्हें उपलब्ध कराने का तरीका और सबरिसॉर्स प्रीफ़ेच करने से जुड़ी चुनौतियां.

Hiroki Kumazaki
Hiroki Kumazaki

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

क्रॉस-ब्राउज़र सहायता

फ़िलहाल, सिर्फ़ Chrome ऐसा ब्राउज़र है जिस पर एसएक्सजी काम करता है. सहमति देखें और ज़्यादा अप-टू-डेट जानकारी के लिए, ऑरिजिन से साइन किए गए एचटीटीपी एक्सचेंज का स्टैंडर्डाइज़ेशन सेक्शन.

एसएक्सजी फ़ाइलें पाएं

अपने Accept अनुरोध के हेडर में यह जानकारी दें कि सर्वर, अनुरोध के साथ एसएक्सजी फ़ाइल करे:

Accept: application/signed-exchange;v=b3,*/*;q=0.8

इस गाइड में यह माना गया है कि एसएक्सजी फ़ाइलों को /var/www/sxg में रखा जाता है.

एक सामान्य एसएक्सजी फ़ाइल उपलब्ध कराएं

एक एसएक्सजी फ़ाइल डिस्ट्रिब्यूट करने के लिए, यहां दिए गए हेडर अटैच करें:

Content-Type: application/signed-exchange;v=v3
X-Content-Type-Options: nosniff

nginx को कॉन्फ़िगर करें:

http {
    ...
    types {
        application/signed-exchange;v=b3  sxg;
    }
    add_header X-Content-Type-Options nosniff;

    location / {
        more_set_headers "Content-Type: application/signed-exchange;v=b3";
        alias /var/www/sxg/;
        try_files $uri.sxg $uri =404;
        autoindex off;
    }
    ...

नए कॉन्फ़िगरेशन को nginx में लोड करें:

sudo systemctl restart nginx.service

nginx पर एसएक्सजी फ़ाइलें काम करना शुरू कर देंगी. जब Chrome आपके सर्वर को ऐक्सेस करता है, तो बार में ओरिजनल कॉन्टेंट पब्लिशर का पता दिखेगा!

उप-संसाधन प्रीफ़ेच करें

ज़्यादातर वेब पेजों में कई सबरिसॉर्स होते हैं, जैसे कि CSS, JavaScript, फ़ॉन्ट, और इमेज. कॉन्टेंट क्रिएटर की निजी कुंजी के बिना, एसएक्सजी का कॉन्टेंट बदला नहीं जा सकता. यह ब्राउज़र द्वारा सबरिसॉर्स को हल करने का प्रयास करते समय समस्या पैदा करता है.

उदाहरण के लिए, मान लें कि https://website.test/index.html के index.html.sxg में https://website.test/app.js का लिंक है. जब किसी उपयोगकर्ता के ब्राउज़र को https://distributor.test/example.com/index.html.sxg से एसएक्सजी फ़ाइल मिलती है, तो उसे https://website.test/app.js का लिंक मिलेगा. असल ऐक्सेस मिलने पर, ब्राउज़र https://website.test/app.js को सीधे तौर पर फ़ेच कर सकता है. हालांकि, निजता बनाए रखने के लिए, ऐसा पहले से लोड करने के दौरान नहीं किया जाना चाहिए. अगर पहले से लोड करने के चरण में संसाधन फ़ेच किया गया था, तो हो सकता है कि कॉन्टेंट क्रिएटर (website.test) यह पता लगा पाए कि किस कॉन्टेंट डिस्ट्रिब्यूटर (distributor.test) ने संसाधन का अनुरोध किया है.

sellers.test/index.html.sxg में app.js का लिंक वेबसाइट.test/app.js पर ले जाता है.

अगर डिस्ट्रिब्यूटर अपनी सेवा से app.js.sxg को सेवा देना चाहता है और https://website.test/app.js को उस सबरिसॉर्स (जैसे कि https://distributor.test/website.test/app.js.sxg) के डिस्ट्रिब्यूटर वर्शन के तौर पर सेट करने की कोशिश करता है, तो हस्ताक्षर मेल नहीं खाएंगे. साथ ही, एसएक्सजी अमान्य हो जाएगा.

provider.test/index.html.sxg में app.js के साथ रेफ़रंस को लिंक करने की कोशिश की वजह से हस्ताक्षर मेल नहीं खाते.

इस समस्या को हल करने के लिए, अब Chrome में एक्सपेरिमेंट के तौर पर उपलब्ध एसएक्सजी सबरिसॉर्स को प्रीफ़ेच करने की सुविधा मौजूद है. इसे चालू करने के लिए यहां जाएं: about://flags/#enable-sxg-subresource-prefetching. सबरिसॉर्स को प्रीफ़ेच करने के लिए, नीचे दी गई शर्तें पूरी होनी चाहिए:

  • पब्लिशर को एसएक्सजी में, रिस्पॉन्स हेडर वाली एंट्री एम्बेड करनी होगी, जैसे कि link: <https://website.test/app.js>;rel="preload";as="script",<https://website.test/app.js>;rel="allowed-alt-sxg";header-integrity="sha256-h6GuCtTXe2nITIHHpJM+xCxcKrYDpOFcIXjihE4asxk=". इससे उस सबरिसॉर्स के बारे में पता चलता है जिसे एसएक्सजी के खास इंटिग्रिटी हैश के साथ बदला जा सकता है.
  • एसएक्सजी दिखाते समय, डिस्ट्रिब्यूटर को रिस्पॉन्स हेडर अटैच करना होगा, जैसे कि link: <https://distributor.test/website.test/app.js.sxg>;rel="alternate";type="application/signed-exchange;v=b3";anchor="https://website.test/app.js". यह app.js का पाथ बताता है और सबरिसॉर्स से जुड़ा होता है.

एंकर

पहला चरण थोड़ा आसान है, क्योंकि nginx-sxg-module इंटिग्रिटी हैश का हिसाब लगा सकता है और उन्हें अपस्ट्रीम रिस्पॉन्स के लिंक हेडर में जोड़ सकता है. हालांकि, दूसरा तरीका ज़्यादा मुश्किल है, क्योंकि कॉन्टेंट डिस्ट्रिब्यूटर को एसएक्सजी में बताए गए सबरिसॉर्स की जानकारी होनी चाहिए.

अगर https://website.test/app.js के अलावा कोई अन्य सबरिसॉर्स नहीं है, तो आपको अपने nginx कॉन्फ़िगरेशन में बस इस तरह जोड़ना होगा:

add_header link <https://distributor.test/website.test/app.js.sxg>;rel="alter...

हालांकि, ऐसे मामले बहुत कम होते हैं, क्योंकि आम तौर पर वेबसाइटों में कई सबरिसॉर्स होते हैं. इसके अलावा, एसएक्सजी फ़ाइल दिखाते समय, डिस्ट्रिब्यूटर को सही ऐंकर लिंक हेडर अटैच करना होगा. फ़िलहाल, इस समस्या को हल करने का कोई आसान तरीका नहीं है. इसलिए, अपडेट पाने के लिए हमारे साथ बने रहें!

सुझाव भेजें

Chromium के इंजीनियर webpackage-dev@chromium.org पर जाकर, एसएक्सजी उपलब्ध कराने के बारे में आपके सुझाव जानना चाहते हैं. आपके पास खास जानकारी पर चर्चा में शामिल होने या गड़बड़ी की शिकायत करने का विकल्प भी है. आपके सुझाव, शिकायत या राय से, स्टैंडर्ड तय करने की प्रोसेस में काफ़ी मदद मिलेगी. साथ ही, इससे नीतियों को लागू करने में होने वाली समस्याओं को हल करने में भी मदद मिलेगी. धन्यवाद!