Origin-Agent-Cluster başlığıyla performans yalıtımı isteme

Alan genelinde komut dosyası çalıştırmayı sınırlamak ve tarayıcıdan özel kaynaklar istemek için yeni bir HTTP yanıt üst bilgisi.

Domenic Denicola
Domenic Denicola

Origin-Agent-Cluster, tarayıcıya aynı sitenin çapraz kaynak sayfaları arasında eşzamanlı komut dosyası erişimini önlemesi için talimat veren yeni bir HTTP yanıtı başlığıdır. Tarayıcılar, kaynağınızın özel bir işlem gibi ayrı, kendine ait kaynaklara sahip olması gerektiğine dair ipucu olarak Origin-Agent-Cluster kullanabilir.

Tarayıcı uyumluluğu

Origin-Agent-Cluster başlığı şu anda yalnızca Chrome 88 ve sonraki sürümlerde uygulanmaktadır. Bu araç, onu değer prototip oluşturmaya değer veren Mozilla Firefox temsilcileriyle yakın işbirliği içinde tasarlanmıştır ve Safari'nin kullandığı tarayıcı motoru WebKit'in temsilcilerinden ön olumlu bir onay alınmıştır.

Ancak bu süreçte Origin-Agent-Cluster başlığını tüm kullanıcılarınıza dağıtabilirsiniz. Anlamayan tarayıcılar onu yok sayar. Ayrıca, kaynakla anahtarlanmış aracı kümelerindeki sayfalar, siteyle anahtarlanmış sayfalara (varsayılan) kıyasla daha az işlem yapabildiğinden endişelenmeniz gereken bir birlikte çalışabilirlik sorunu yoktur.

Tarayıcılar neden aynı site kaynaklarını otomatik olarak ayıramaz?

Web, dokümanların ve komut dosyalarının başka bir kaynaktaki kaynaklarla etkileşim şeklini kısıtlayan bir güvenlik özelliği olan aynı kaynak politikası üzerine kurulmuştur. Örneğin, https://a.example adresinde barındırılan bir sayfa, https://b.example veya https://sub.a.example adresindeki bir sayfadan farklı bir kaynaktadır.

Tarayıcılar, sahne arkasında köklerin sağladığı ayrımı farklı şekillerde kullanır. Eskiden ayrı kaynaklar birbirinin verilerine erişemese de işletim sistemi iş parçacıkları, işlemler ve bellek ayırma gibi kaynakları paylaşırdı. Bu da bir sekme yavaşsa diğer tüm sekmelerin de yavaşlayacağı anlamına geliyordu. Veya bir sekme çok fazla bellek kullanılırsa tüm tarayıcının kilitlenmesine neden olabilir.

Günümüzde tarayıcılar daha gelişmiş ve farklı kaynaklarını farklı işlemlere ayırmaya çalışıyor. Bu sürecin tam olarak işleyiş şekli tarayıcıya göre değişir: Çoğu tarayıcıda sekmeler arasında bir düzeyde ayrım vardır ancak tek bir sekmedeki farklı iframe'ler bir işlemi paylaşabilir. İşlemler bazı bellek yükü getirdiğinden, çok fazla işlem oluşturmamak için sezgisel yöntemler kullanılır. Örneğin, Firefox'ta kullanıcı tarafından yapılandırılabilir bir işlem sınırı vardır ve Chrome, davranışını masaüstü (bellek daha bol) ve mobil (bellek az) arasında değiştirir.

Bu sezgisel kurallar mükemmel değildir. Ayrıca, önemli bir sınırlamayla karşı karşıyadır: Aynı kaynak politikasında https://sub.a.example ve https://a.example gibi alt alan adlarının birbiriyle iletişim kurmasına izin veren istisnalar bulunduğundan tarayıcılar, alt alan adlarını otomatik olarak birbirinden ayıramaz.

Bu varsayılan davranışa "site içeren veya sitelerle ilişkili aracı kümeleri" denir. Yani tarayıcı, sayfaları sitelerine göre gruplandırır. Yeni Origin-Agent-Cluster başlığı, tarayıcının belirli bir sayfa için bu varsayılan davranışı değiştirmesini ister. Böylece sayfa, yalnızca tam olarak aynı kaynağa sahip diğer sayfalarla gruplandırılacak şekilde kaynak içeren bir aracı kümesine yerleştirilir. Özellikle aynı sitenin çapraz kaynak sayfaları, aracı kümesinden hariç tutulur.

Bu etkinleştirme ayırımı, tarayıcıların bu yeni kaynak içeren veya kaynaklarla ilişkili aracı kümelerine diğer kaynaklarla birleştirilmeyen kendi özel kaynaklarını vermelerine olanak tanır. Örneğin, bu tür sayfalar kendi işlemlerini alabilir veya ayrı iş parçacıklarında planlanabilir. Sayfanıza Origin-Agent-Cluster üstbilgisini ekleyerek sayfanın bu tür özel kaynaklardan yararlanacağını tarayıcıya bildirirsiniz.

Ancak ayırma işlemini gerçekleştirmek ve bu avantajlardan yararlanmak için tarayıcının bazı eski özellikleri devre dışı bırakması gerekir.

Kaynak anahtarına sahip sayfaların yapamayacağı işlemler

Sayfanız kaynak içeren veya kaynaklarla ilişkili bir aracı kümesinde yer aldığında, daha önce kullanılabilen aynı site arası kaynak sayfalarıyla iletişim kurma yetkinizi kaybedersiniz. Özellikle:

  • Artık document.domain ayarını yapamazsınız. Bu, normalde aynı sitedeki kaynaklar arası sayfaların birbirlerinin DOM'sine eşzamanlı olarak erişmesine izin veren eski bir özelliktir ancak kaynak içeren veya kaynaklarla ilişkili aracı kümelerinde devre dışı bırakılmıştır.

  • Artık postMessage() aracılığıyla aynı sitedeki diğer kaynakta çapraz sayfalara WebAssembly.Module nesneleri gönderemezsiniz.

  • (Yalnızca Chrome) Artık aynı sitedeki diğer kaynakta çapraz sayfalara SharedArrayBuffer veya WebAssembly.Memory öğeleri gönderemezsiniz.

Kaynak içeren veya kaynaklarla ilişkili aracı kümeleri ne zaman kullanılır?

Origin-Agent-Cluster başlığından en çok faydalanan kaynaklar şunlardır:

  • Mümkün olduğunda kendi özel kaynaklarıyla en iyi performansı gösterir. Performans açısından yoğun oyunlar, video konferans siteleri veya multimedya oluşturma uygulamaları buna örnek gösterilebilir.

  • Farklı kaynaktan ancak aynı siteden gelen, yoğun kaynak kullanan iFrame'ler içerir. Örneğin, https://mail.example.com https://chat.example.com iframe'ler yerleştirirse kaynak anahtarlama https://mail.example.com/, sohbet ekibi tarafından yazılan kodun posta ekibi tarafından yazılan kodu yanlışlıkla engellememesini sağlar ve tarayıcıya, bunları ayrı ayrı planlamaları ve birbirleri üzerindeki performans etkilerini azaltmaları için ayrı işlemler verme konusunda ipucu verebilir.

  • Farklı kaynaklı, aynı sitedeki sayfalara yerleştirilmesini bekleyin ancak kaynak yoğun olduklarını unutmayın. Örneğin, https://customerservicewidget.example.com video sohbet için çok fazla kaynak kullanacaksa ve https://*.example.com boyunca çeşitli kaynaklara yerleştirilecekse bu widget'ı yöneten ekip, yerleştirenler üzerindeki performans etkisini azaltmak için Origin-Agent-Cluster başlığını kullanabilir.

Ayrıca, yukarıda bahsedilen nadiren kullanılan kaynak arası iletişim özelliklerini devre dışı bırakmanızda bir sakınca olmadığından ve sitenizin HTTPS kullandığından emin olmanız gerekir.

Ancak bunlar sonuçta yalnızca kurallardır. Kaynak içeren veya kaynaklarla ilişkili aracı kümelerinin sitenize yardımcı olup olmayacağı, en iyi şekilde ölçümler aracılığıyla belirlenir. Özellikle, kaynak anahtarlama işleminin ne gibi bir etkisi olduğunu görmek için Web Vitals'ınızı ve muhtemelen bellek kullanımınızı ölçmeniz gerekir. (Özellikle bellek kullanımı, oyundaki işlem sayısının artırılması işlem başına daha fazla bellek yükü oluşturabileceğinden potansiyel bir sorundur.) Kaynak anahtarlama özelliğini kullanıma sunup en iyisinin gerçekleşmesini ummanız yetmez.

Bunun kökler arası erişime kapalı olması ile nasıl bir ilişkisi var?

Origin-Agent-Cluster başlığı aracılığıyla aracı kümelerinin kaynak içeren veya kaynaklarla ilişkili anahtarlanması, Cross-Origin-Opener-Policy ve Cross-Origin-Embedder-Policy başlıkları aracılığıyla kaynaklar arası yalıtım ile ilgilidir ancak ondan ayrıdır.

Kendisini kökler arası erişime kapalı yapan tüm siteler, Origin-Agent-Cluster üstbilgisinin kullanımıyla aynı siteler arası kaynaklar arası iletişim özelliklerini de devre dışı bırakır. Bununla birlikte Origin-Agent-Cluster üstbilgisi, tarayıcıya kaynak ayırma buluşsal yöntemlerini değiştirmesi için ek bir ipucu olarak, kaynaklar arası izolasyonun üstünde yine de yararlı olabilir. Bu nedenle, zaten çapraz kökler arası erişime kapalı olan sayfalarda bile Origin-Agent-Cluster başlığını uygulamayı ve sonuçları ölçmeyi düşünmeniz gerekir.

Origin-Agent-Cluster üst bilgisini kullanma

Origin-Agent-Cluster başlığını kullanmak için web sunucunuzu aşağıdaki HTTP yanıt başlığını gönderecek şekilde yapılandırın:

Origin-Agent-Cluster: ?1

?1 değeri, boole true değeri için yapılandırılmış başlık söz dizimidir.

Bu üstbilginin yalnızca bazı sayfalardan değil, kaynağınızdan gelen tüm yanıtlarda gönderilmesi önemlidir. Aksi takdirde, tarayıcının bir kaynak anahtarlama isteği gördüğünü "hatırladığı" ve bu nedenle bunu istemeyen sayfalarda bile kaynak anahtarlama yaptığı tutarsız sonuçlar alabilirsiniz. Veya tam tersi: Kullanıcının ziyaret ettiği ilk sayfada başlık yoksa tarayıcı, kaynağınızın kaynak anahtarıyla ilişkilendirilmek istemediğini hatırlar ve sonraki sayfalardaki başlığı yoksayar.

Tarayıcı neden her zaman üstbilgiye uyamaz?

Bu "hafıza"nın nedeni, bir kaynak için anahtarlama tutarlılığını sağlamaktır. Bir kaynaktaki bazı sayfalar kaynak içeren veya kaynaklarla ilişkili değilse, aynı kaynak içeren ve farklı aracı kümelerine yerleştirilmiş iki sayfanız olabilir. Bu nedenle, birbirleriyle iletişim kurmalarına izin verilmez. Bu durum hem web geliştiricileri hem de tarayıcının iç işleyişine göre çok garip olur. Bu nedenle, Origin-Agent-Cluster için spesifikasyon, belirli bir kaynakta daha önce görülenle tutarlı değilse başlığı yoksayar. Chrome'da bu durum konsol uyarısıyla sonuçlanır.

Bu tutarlılık, window.opener, frames[0] veya window.parent gibi mekanizmalar aracılığıyla birbirine erişebilen sekme, pencere veya iFrame grubu olan bir tarama bağlamı grubuyla sınırlıdır. Bu, bir kaynağın kaynak veya site anahtarlaması belirlendikten sonra (tarayıcının başlığı görmesi veya görmemesi nedeniyle), bu anahtarlamayı değiştirmek için eski sekmeye bağlı olmayan tamamen yeni bir sekme açılması gerektiği anlamına gelir.

Bu ayrıntılar, Origin-Agent-Cluster üstbilgisini test etmek için önemli olabilir. Sekmeyi sitenize ilk kez eklerken sayfayı yeniden yüklemek işe yaramaz. Sekmeyi kapatıp yeni bir sekme açmanız gerekir.

Origin-Agent-Cluster üstbilgisinin uygulanıp uygulanmadığını kontrol etmek için JavaScript window.originAgentCluster mülkünü kullanın. Bu değer, başlığın (veya kaynaklar arası izolasyon gibi diğer mekanizmaların) kaynak anahtarına neden olduğu durumlarda true, neden olmadığı durumlarda false ve Origin-Agent-Cluster başlığını uygulamayan tarayıcılarda undefined olur. Bu verileri analiz platformunuza kaydetmek, sunucunuzu doğru şekilde yapılandırdığınıza dair değerli bir kontrol sağlayabilir.

Son olarak, Origin-Agent-Cluster başlığının yalnızca güvenli bağlamlarda (ör. HTTPS sayfalarında veya http://localhost'da) çalışacağını unutmayın. Localhost dışındaki HTTP sayfaları, kaynak anahtarına sahip aracı kümelerini desteklemez.

Kaynak anahtarı oluşturma bir güvenlik özelliği değildir

Kaynak içeren veya kaynaklarla ilişkili aracı kümesi kullanmak, kaynağınızı aynı sitedeki merkezler arası sayfalardan gelen senkronize erişimden izole etse de Cross-Origin-Resource-Policy ve Cross-Origin-Opener-Policy gibi güvenlikle ilgili üstbilgilerin korumasını sağlamaz. Özellikle Spectre gibi yan kanal saldırılarına karşı güvenilir bir koruma sağlamaz.

Kaynak anahtarlama bazen kaynağınızın kendi sürecini almasına neden olabileceği ve ayrı süreçler, yan kanal saldırılarına karşı önemli bir savunma olduğu için bu biraz şaşırtıcı olabilir. Ancak Origin-Agent-Cluster başlığının bu anlamda yalnızca bir ipucu olduğunu unutmayın. Tarayıcı, kaynağınıza ayrı bir işlem verme yükümlülüğü altında değildir ve çeşitli nedenlerle bunu yapmayabilir:

  • Tarayıcı, bunu yapacak teknolojiyi uygulamayabilir. Örneğin, Safari ve Firefox şu anda kendi işlemlerine ayrı sekmeler ekleyebilir ancak iframe'ler için henüz bunu yapamaz.

  • Tarayıcı, ayrı bir işleme gerek olmadığına karar verebilir. Örneğin, düşük bellekli Android cihazlarda veya Android WebView'da Chrome mümkün olduğunca az işlem kullanır.

  • Tarayıcı, Origin-Agent-Cluster üst bilgisinin belirttiği isteğe uymak isteyebilir ancak bunu işlemlerden farklı bir yalıtım teknolojisi kullanarak yapabilir. Örneğin, Chrome bu tür performans izolasyonu için işlemler yerine iş parçacıkları kullanmayı keşfediyor.

  • Kullanıcı veya farklı bir sitede çalışan kod, kaynakta site anahtarına sahip bir sayfaya gitmiş olabilir. Bu durum, tutarlılık garantisinin devreye girmesine ve Origin-Agent-Cluster başlığının tamamen yoksayılmasına neden olur.

Bu nedenle, kaynak içeren veya kaynaklarla ilişkili aracı kümelerini güvenlik özelliği olarak düşünmemek önemlidir. Bunun yerine, kaynağınızın özel kaynaklardan yararlanacağını (ve bunun karşılığında belirli özelliklerden vazgeçmeye hazır olduğunuzu) ima ederek tarayıcıya kaynak tahsisine öncelik vermesine yardımcı olur.

Geri bildirim

Origin-Agent-Cluster başlığını kullanıyorsanız veya kullanmayı düşünüyorsanız Chrome ekibi görüşlerinizi öğrenmek ister. Kamu yararı ve desteğiniz, özellikleri önceliklendirmemize ve diğer tarayıcı satıcılarına bunların ne kadar önemli olduğunu göstermemize yardımcı olmaktadır. @ChromiumDev hesabına tweet göndererek Chrome DevRel'e düşüncelerinizi ve deneyimlerinizi bildirin.

Spesifikasyon veya özelliğin işleyişiyle ilgili ayrıntılar hakkında başka sorularınız varsa HTML Standard GitHub deposunda sorun kaydı oluşturabilirsiniz. Chrome'un uygulamasıyla ilgili herhangi bir sorunla karşılaşırsanız new.crbug.com adresinde Bileşenler alanı Internals>Sandbox>SiteIsolation olarak ayarlanmış şekilde hata kaydı oluşturabilirsiniz.

Daha fazla bilgi

Kaynakla anahtarlanmış temsilci kümeleri hakkında daha fazla bilgi edinmek için aşağıdaki bağlantıları inceleyebilirsiniz: