Hạn chế chia sẻ mô-đun wasm theo cùng nguồn gốc

Việc chia sẻ mô-đun WebAssembly giữa các môi trường cùng trang web sẽ chỉ bị hạn chế ở cùng nguồn gốc.

Việc chia sẻ mô-đun WebAssembly (Wasm) giữa các môi trường cùng trang web nhưng trên nhiều nguồn gốc sẽ không được dùng nữa để cho phép các cụm tác nhân được xác định phạm vi lâu dài theo các nguồn gốc. Các nhà phát triển đang sử dụng các mô-đun Wasm theo cách như vậy phải đảm bảo tạo thực thể cho các mô-đun đó ở cùng nguồn gốc để tiếp tục sử dụng sau Chrome 95.

Mô-đun Wasm là gì và cách hoạt động

Các chương trình WebAssembly được sắp xếp thành các mô-đun, là đơn vị triển khai, tải và biên dịch.

Trong mã ví dụ sau, một mô-đun Wasm nhập từ https://iframe.site.example được chia sẻ với https://main.site.example thông qua postMessage(). Lưu ý rằng những miền này cùng trang web nhưng có nhiều nguồn gốc.

Mô-đun Wasm trên https://iframe.site.example:

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

Kể từ Chrome 95, người gửi và người nhận phải có cùng nguồn gốc. Trong trường hợp trên, https://iframe.site.example cần phải là https://main.site.example hoặc ngược lại.

Lý do cần có

Chrome đang xử lý nội bộ nhiều tài liệu, thẻ và khung trên các cụm tác nhân được khoá theo trang web. Điều này có nghĩa là các tài liệu trên cùng trang web được xử lý trong cùng một quy trình (cách hoạt động chính xác của quy trình này sẽ khác nhau theo từng trình duyệt). Gần đây, Chrome bắt đầu xử lý các vấn đề này ở các đơn vị chi tiết hơn: nguồn gốc. Chúng tôi gọi đó là cụm tác nhân theo khoá nguồn gốc. Tuy nhiên, do việc này tốn kém tài nguyên, nên các cụm tác nhân theo khoá nguồn gốc chỉ được áp dụng theo phương pháp phỏng đoán cho các trang web giới hạn.

Bạn cần thiết lập tất cả các cụm tác nhân theo khoá nguồn gốc theo mặc định. Để làm được điều này, chúng tôi cần giới hạn những khả năng yêu cầu cụm nguồn gốc được khoá theo trang web:

  • (Chỉ dành cho Chrome) Bạn không thể gửi đối tượng SharedArrayBuffer hoặc WebAssembly.Memory đến các trang có nhiều nguồn gốc khác của cùng một trang web nữa. Tính năng này đã được áp dụng kể từ Chrome 92.
  • Bạn không thể gửi đối tượng WebAssembly.Module đến các trang có nhiều nguồn gốc trên cùng một trang web nữa thông qua postMessage(). Thay đổi này sẽ được giải thích chi tiết hơn bên dưới.
  • Bạn không thể đặt document.domain nữa. Đây là một tính năng cũ thường cho phép các trang nhiều nguồn gốc trên cùng một trang web truy cập đồng bộ vào DOM của nhau, nhưng trong các cụm tác nhân theo khoá nguồn gốc, tính năng này sẽ bị vô hiệu hoá.

Bằng cách giải quyết tất cả thay đổi nêu trên, Chrome sẽ chuyển sang sử dụng các cụm tác nhân theo khoá nguồn gốc theo mặc định.

Để tìm hiểu thêm về cụm tác nhân theo khoá nguồn gốc, hãy xem phần Yêu cầu tách biệt hiệu suất bằng tiêu đề Origin-Agent-Cluster.

Các bước tiếp theo và tài nguyên

Để Chrome hoạt động với các cụm tác nhân theo khoá nguồn gốc theo mặc định, chúng tôi sẽ thiết lập document.domain ở chế độ chỉ có thể đọc. Nhóm Chrome đang nhắm đến việc đạt được thay đổi này vào một thời điểm nào đó trong năm 2022.

Ảnh chụp của Markus Winkler trên Unsplash