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ştiricilerin Chrome 95'ten sonra kullanmaya devam edebilmek için bu modülleri aynı kaynakta örneklendirdiklerinden emin olmaları gerekir.

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

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

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 alan adlarının aynı site, ancak çapraz kaynak olduğuna dikkat edin.

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 veya bunun 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ı siteye ait dokümanların aynı işlem içinde işleneceği anlamına gelir (bunun tam olarak işleyiş şekli 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 başarmak için site içeren veya sitelerle ilişkili kaynak kümeleri gerektiren özellikleri kısıtlamamız gerekir:

  • (Yalnızca Chrome) Artık aynı sitenin diğer çapraz kaynak sayfalarına SharedArrayBuffer veya WebAssembly.Memory nesneleri 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şiklikler yerine getirildiğinde Chrome, varsayılan olarak kaynak içeren veya kaynaklarla ilişkili 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'te