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

nginx kullanarak SXG dosyalarını alma ve sunma ve alt kaynak ön 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 yayınlanmış gibi gösterir. Bu sayede gizliliği ihlal etmeden siteler arası önceden yükleme uygulayabilirsiniz. Bu kılavuzda, SXG'yi nasıl doğru şekilde dağıtacağınız gösterilmektedir.

Tarayıcılar arası destek

Chrome, şu anda SXG'yi destekleyen tek tarayıcıdır. Daha güncel bilgiler için Kaynak Tarafından İmzalanan HTTP Exchange'leri başlıklı makalenin Fikir Birliği ve Standartlaştırma bölümüne bakın.

SXG dosyalarını alma

Accept istek başlığınızda, 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'ye koyduğunuz varsayılmaktadır.

Basit bir SXG dosyası yayınlama

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 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'e yükleyin:

sudo systemctl restart nginx.service

nginx, SXG dosyalarını sunmaya başlar. 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 fazla alt kaynaktan oluşur. SXG'nin içeriği, içerik üreticinin özel anahtarı olmadan değiştirilemez. Bu durum, tarayıcı alt kaynakları çözmeye çalışırken sorunlara neden olur.

Örneğin, https://website.test/index.html'daki index.html.sxg'nin https://website.test/app.js'ye bağlantısı 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'ü kendi hizmetinden yayınlamak isterse ve https://website.test/app.js'u distribütörün bu alt kaynağının sürümü (https://distributor.test/website.test/app.js.sxg gibi) olacak şekilde değiştirmeye çalışırsa imza uyuşmazlığı oluşur ve SXG geçersiz olur.

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 Chrome'da deneysel bir SXG alt kaynağı ön getirme özelliği mevcuttur. Bu özelliği about://flags/#enable-sxg-subresource-prefetching adresinden etkinleştirebilirsiniz. Alt kaynak ön 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'ye özgü bütünlük karmasıyla değiştirilebilecek alt kaynağı belirtir.
  • Distribütör, SXG'yi yayınlarken bir yanıt başlığı eklemelidir (ör. 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 içerik distribütörünün SXG'de belirtilen alt kaynakları bilmesi gerektiğinden ikinci yöntem daha zordur.

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 edin.

Geri bildirim gönder

Chromium mühendisleri, SXG dağıtımıyla ilgili geri bildirimlerinizi webpackage-dev@chromium.org adresinden bekliyor. Ayrıca özellik tartışmasına katılabilir veya ekibe 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!