Wasm modülü paylaşımını aynı kaynakla kısıtlama

Bir WebAssembly modülünün aynı site ortamları arasında paylaşılması yalnızca aynı kaynakla kısıtlanacaktır.

Aynı sitede ancak farklı kaynaklarda bulunan WebAssembly (Wasm) modüllerinin paylaşımı, aracı kümelerinin uzun vadede kaynaklarla kapsamlı hale getirilmesine olanak tanımak için kullanımdan kaldırılacak. Wasm modüllerini bu şekilde kullanan geliştiriciler, Chrome 95'ten sonra bu modülleri kullanmaya devam etmek için aynı kaynakta örneklediklerinden emin olmalıdır.

Wasm modülleri nedir ve nasıl çalışır?

WebAssembly programları, dağıtım, yükleme ve derleme birimi olan modüller halinde düzenlenir.

Aşağıdaki örnek kodda, https://iframe.site.example'ten içe aktarılan bir Wasm modülü, postMessage() aracılığıyla https://main.site.example ile paylaşılmaktadır. Bu alanların aynı sitede ancak farklı kaynakta olduğunu unutmayın.

https://iframe.site.example'teki Wasm modülü:

(async () => {
  const instance = await WebAssembly.instantiateStreaming(fetch('./add.wasm'), {});
  iframe.contentWindow.postMessage(instance.module, `https://main.site.example`);
})();

Chrome 95'ten itibaren gönderen ve alıcı aynı kaynaktan olmalıdır. Yukarıdaki durumda, https://iframe.site.example değerinin https://main.site.example olması veya bunun tam tersi olması gerekir.

Bu neden gerekli?

Chrome, site anahtarına sahip aracı kümelerinde farklı dokümanları, sekmeleri ve çerçeveleri dahili olarak işlemektedir. Bu, aynı sitedeki dokümanların aynı işlem içinde işlendiği anlamına gelir (bu işlemin tam olarak nasıl çalıştığı tarayıcıya göre değişir). Chrome, son zamanlarda bu kaynakları daha ayrıntılı birimlerde (kökenler) işlemeye başladı. Buna kaynak içeren veya kaynaklarla ilişkili aracı kümeleri diyoruz. Ancak bu işlem kaynak açısından pahalı olduğundan, kaynak içeren veya kaynaklarla ilişkili aracı kümeleri yalnızca sınırlı web sitelerine heuristik olarak uygulandı.

Planımız, tüm müşteri temsilcisi kümelerini varsayılan olarak kaynak içeren veya kaynaklarla ilişkili hale getirmektir. Bunu yapmak için siteye bağlı kaynak kümelerini gerektiren özellikleri kısıtlamamız gerekir:

  • (Yalnızca Chrome) Artık aynı sitedeki diğer kaynakta çapraz sayfalara SharedArrayBuffer veya WebAssembly.Memory öğeleri gönderemezsiniz. Bu özellik Chrome 92'den beri kullanılmaktadır.
  • Artık postMessage() aracılığıyla aynı sitedeki diğer kaynakta çapraz sayfalara WebAssembly.Module nesneleri gönderemezsiniz. Bu değişiklik aşağıda daha ayrıntılı olarak açıklanmıştır.
  • Artık document.domain ayarını yapamazsınız. Bu, normalde aynı sitenin çapraz kaynak sayfalarının birbirlerinin DOM'una senkronize olarak erişmesine izin veren eski bir özelliktir ancak kaynak içeren veya kaynaklarla ilişkili aracı kümelerinde devre dışıdır.

Yukarıdaki tüm değişiklikleri ele alan Chrome, varsayılan olarak kaynak anahtarına sahip aracı kümelerini kullanmaya başlayacaktır.

Kaynak içeren veya kaynaklarla ilişkili aracı kümeleri hakkında daha fazla bilgi edinmek için Origin-Agent-Cluster üstbilgisiyle performans izolasyonu isteğinde bulunma başlıklı makaleyi inceleyin.

Sonraki adımlar ve kaynaklar

Chrome'un varsayılan olarak kaynak anahtarıyla çalışan aracı kümeleriyle çalışmasını sağlamak için document.domain'ü salt okunur hale getireceğiz. Chrome ekibi bu değişikliği 2022'nin bir döneminde uygulamayı planlıyor.

Fotoğraf: Markus Winkler, Unsplash