İmzalanmış HTTP Takasları (SXG) nginx kullanılarak nasıl dağıtılır?

Nginx kullanarak SXG dosyalarını alma ve sunma ve alt kaynağı önceden getirmenin zorlukları.

Hiroki Kumazaki
Hiroki Kumazaki

İmzalanmış HTTP Takası (SXG) distribütörü olarak orijinal içerik üreticiler adına SXG dosyalarını gönderebilirsiniz. SXG'yi destekleyen web tarayıcıları, bu tür SXG dosyalarını orijinal içerik üreticilerden gönderilmiş gibi gösterir. Bu sayede gizliliği ihlal etmeden siteler arası önceden yükleme uygulayabilirsiniz. Bu kılavuzda, SXG'nin nasıl doğru bir şekilde dağıtılacağı gösterilmektedir.

Tarayıcılar arası destek

Chrome şu anda SXG'yi destekleyen tek tarayıcıdır. Fikir Birliği Var ve Daha güncel bilgiler için Kaynak İmzalı HTTP Takasları başlığının Standartlaştırma bölümüne bakın.

SXG dosyalarını alma

Accept istek başlığında, sunucunun istekle birlikte bir SXG dosyası döndürmesini istediğinizi belirtin:

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

Bu kılavuzda, SXG dosyalarınızı /var/www/sxg konumuna yerleştirdiğiniz varsayılmaktadır.

Basit bir SXG dosyası sunma

Tek bir SXG dosyası dağıtmak için aşağıdaki üstbilgileri ekleyin:

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

nginx'i yapılandırın:

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;
    }
    ...

Yeni yapılandırmayı nginx ürününe yükleyin:

sudo systemctl restart nginx.service

nginx, SXG dosyalarını sunmaya başlayacak. Chrome sunucunuza eriştiğinde, çubukta orijinal içerik yayıncısının adresi görünür!

Alt kaynakları önceden getir

Çoğu web sayfası CSS, JavaScript, yazı tipleri ve resimler gibi birden çok alt kaynaktan oluşur. SXG'nin içeriği, içerik üreticinin özel anahtarı olmadan değiştirilemez. Bu durum, tarayıcı alt kaynakları çözümlemeye çalıştığında sorunlara neden olur.

Örneğin, https://website.test/index.html konumundaki index.html.sxg ile https://website.test/app.js bağlantısının olduğunu varsayalım. Kullanıcının tarayıcısı https://distributor.test/example.com/index.html.sxg adresinden SXG dosyasını aldığında https://website.test/app.js bağlantısını bulur. Tarayıcı, gerçek erişimde doğrudan https://website.test/app.js öğesini getirebilir, ancak gizliliği korumak için bu işlem önceden yükleme aşamasında yapılmamalıdır. Kaynak, önceden yükleme aşamasında getirildiyse içerik üretici (website.test) hangi içerik dağıtıcısının (distributor.test) kaynak istediğini tespit edebilir.

distribütör.test/index.html.sxg web sitesindeki app.js bağlantısı website.test/app.js'ye yönlendiriyor.

Distribütör, app.js.sxg öğesini kendi hizmetinden yayınlamak ister ve https://website.test/app.js öğesini söz konusu alt kaynağın dağıtımcı sürümü (ör. https://distributor.test/website.test/app.js.sxg) olacak şekilde değiştirmeye çalışırsa imza uyuşmazlığına neden olur ve SXG geçersiz hale gelir.

distribütör.test/index.html.sxg app.js referansını distribütör.test/app.js adresine bağlama girişimi imza uyuşmazlığına neden olur.

Bu sorunu çözmek için artık Chrome'da deneysel bir SXG alt kaynağı önceden getirme özelliği bulunmaktadır. Bu özelliği about://flags/#enable-sxg-subresource-prefetching adresinden etkinleştirebilirsiniz. Alt kaynağı önceden getirme özelliğini kullanmak için aşağıdaki koşulların karşılanması gerekir:

  • Yayıncı, SXG'ye şu gibi bir yanıt başlığı girişi yerleştirmelidir: link: <https://website.test/app.js>;rel="preload";as="script",<https://website.test/app.js>;rel="allowed-alt-sxg";header-integrity="sha256-h6GuCtTXe2nITIHHpJM+xCxcKrYDpOFcIXjihE4asxk=". Bu, SXG'nin belirli bütünlük karmasıyla değiştirilebilecek alt kaynağı belirtir.
  • Distribütör, SXG'yi sunarken şu gibi bir yanıt başlığı eklemelidir: link: <https://distributor.test/website.test/app.js.sxg>;rel="alternate";type="application/signed-exchange;v=b3";anchor="https://website.test/app.js". Bu, app.js yolunu belirtir ve alt kaynağa karşılık gelir.

anchor

nginx-sxg-module, bütünlük karmalarını hesaplayıp yukarı akış yanıtlarındaki bağlantı başlıklarına yerleştirebildiğinden ilki nispeten kolaydır. Ancak ikinci yöntem daha zordur. Çünkü içerik dağıtıcı, SXG'de belirtilen alt kaynakların farkında olmalıdır.

https://website.test/app.js dışında alt kaynak yoksa nginx yapılandırmanıza eklemeniz gereken tek şey şu şekildedir:

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

Ancak bu tür durumlar nadirdir çünkü tipik web siteleri birçok alt kaynaktan oluşur. Ayrıca distribütör, SXG dosyası sunarken uygun bağlayıcı bağlantı başlığını eklemelidir. Şu anda bu sorunu çözmenin kolay bir yolu yoktur. Güncellemeler için bizi takip etmeye devam edin.

Geri bildirim gönder

Chromium mühendisleri, webpackage-dev@chromium.org adresinden SXG dağıtımıyla ilgili geri bildiriminizi öğrenmekten memnuniyet duyar. Ayrıca spesifikasyon tartışmasına katılabilir veya ekibe bir hata bildirebilirsiniz. Geri bildirimleriniz, standartlaştırma sürecine büyük katkıda bulunacak ve uygulama sorunlarının çözülmesine yardımcı olacaktır. Teşekkürler!