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

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

हिरोकी कुमाज़ाकी
हिरोकी कुमाज़ाकी

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

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

फ़िलहाल, सिर्फ़ 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 आपके सर्वर को ऐक्सेस करता है, तो बार में मूल कॉन्टेंट पब्लिशर का पता दिखेगा!

सबरिसॉर्स प्रीफ़ेच करें

ज़्यादातर वेब पेजों में कई सबरिसॉर्स होते हैं, जैसे कि सीएसएस, 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 का लिंक, web.test/app.js पर ले जाता है.

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

artists.test/index.html.sxg में app.js के रेफ़रंस को तीसरे पक्ष की कंपनी.test/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 पर एसएक्सजी उपलब्ध कराने के बारे में आपकी राय जानना चाहते हैं. खास जानकारी वाली चर्चा में भी शामिल हुआ जा सकता है या टीम से गड़बड़ी की शिकायत की जा सकती है. आपके सुझाव, शिकायत या राय से, स्टैंडर्ड तय करने की प्रक्रिया को पूरा करने में काफ़ी मदद मिलेगी. साथ ही, इससे लागू होने वाली समस्याओं को हल करने में भी मदद मिलेगी. धन्यवाद!