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 kaynaklı sayfaları arasında senkronize komut dosyası erişimini engellemesini bildiren yeni bir HTTP yanıtı üst bilgisidir. Tarayıcılar, kaynağınızın özel bir işlem gibi kendi ayrı kaynaklarına sahip olması gerektiğini belirtmek için Origin-Agent-Cluster değerini de kullanabilir.

Origin-Agent-Cluster başlığı şu anda yalnızca Chrome 88 ve sonraki sürümlerde uygulanmaktadır. Bu özellik, prototip oluşturmaya değer olarak işaretleyen Mozilla Firefox temsilcileriyle yakın işbirliği içinde tasarlandı ve Safari'nin kullandığı tarayıcı motoru WebKit'in temsilcilerinden öncelikli olarak olumlu bir yanıt aldı.

Ancak bu süreçte Origin-Agent-Cluster başlığını tüm kullanıcılarınıza dağıtabilirsiniz. Bunu anlamayan tarayıcılar bu özelliği 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 aynı site kaynaklarını neden 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 kuruludur. Ö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, bir sekme yavaşsa diğer tüm sekmelerin de yavaşlayacağı anlamına geliyordu. Bir sekme çok fazla bellek kullanırsa tüm tarayıcı çöker.

Günümüzde tarayıcılar daha gelişmiş ve farklı kaynaklarını farklı işlemlere ayırmaya çalışıyor. Bu işlemin 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ü oluşturduğundan, ç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 daha 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 birbirleriyle iletişim kurmasına izin veren istisnalar olduğ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 olduğunda, daha önce kullanılabilen aynı sitedeki kaynakta farklı sayfalarla iletişim kurma özelliklerinden bazılarını kaybedersiniz. Özellikle:

  • Artık document.domain ayarını yapamazsınız. Bu, normalde aynı sitedeki çapraz kaynak sayfalarının birbirlerinin DOM'una eşzamanlı olarak erişmesine izin veren eski bir özelliktir ancak kaynak içeren veya kaynaklarla ilişkili aracı kümelerinde devre dışıdı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 yararlanan 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'leri yerleştiriyorsa kaynak anahtarlama https://mail.example.com/, sohbet ekibi tarafından yazılan kodun posta ekibi tarafından yazılan kodla yanlışlıkla etkileşime geçmemesini sağlar ve tarayıcıya, bunları bağımsız olarak planlamak ve birbirlerinin performans üzerindeki etkilerini azaltmak için ayrı işlemler vermesi gerektiğini söyleyebilir.

  • 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 anahtarını kullanıma sunup en iyisini ummanız yeterli değildir.

Bu, kökler arası erişimin kapatılmasıyla nasıl ilgili?

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 kaynaktan kaynakya izole eden tüm siteler, Origin-Agent-Cluster üstbilgisi kullanıldığında olduğu gibi aynı aynı site kaynaktan kaynakya 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, kökler arası erişime kapalı olan sayfalarda bile Origin-Agent-Cluster üstbilgisini uygulamayı ve sonuçları ölçmeyi düşünmeniz gerekir.

Origin-Agent-Cluster üst bilgisini kullanma

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

Origin-Agent-Cluster: ?1

?1 değerinin değeri, bir 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.

Bu "hafıza"nın nedeni, bir kaynak için anahtarlama tutarlılığını sağlamaktır. Bir kaynaktaki bazı sayfalar kaynakla ilişkilendirilmişken diğerleri ilişkilendirilmemişse aynı kaynaktaki iki sayfa farklı temsilci kümelerine yerleştirilmiş olabilir ve bu nedenle sayfaların birbirleriyle iletişim kurmasına izin verilmeyebilir. 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ına neden olur.

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. Sitenize ilk kez eklediğinizde sayfayı yeniden yüklemek yeterli olmaz. 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 anahtarlama 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 eder ancak 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 üst bilgisinin bu konuda 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şlemin masrafına değmeyeceğine karar verebilir. Örneğin, belleği düşük Android cihazlarda veya Android Web Görünümü'nde 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

Chrome Ekibi, Origin-Agent-Cluster başlığını kullanıyorsanız veya kullanmayı düşünüyorsanız sizinle iletişime geçmekten memnuniyet duyar. Kamu yararı ve desteğiniz, özelliklere öncelik vermemize ve diğer tarayıcı tedarikçi firmalarına bunların ne kadar önemli olduğunu göstermemize yardımcı olur. @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: