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ẽ bị hạn chế chỉ ở cùng nguồn gốc.

Tính năng chia sẻ mô-đun WebAssembly (Wasm) giữa các môi trường cùng trang web nhưng khác nguồn gốc sẽ ngừng hoạt động để cho phép các cụm tác nhân được đưa vào phạm vi nguồn gốc trong thời gian dài. 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 chú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 sẽ được chia sẻ với https://main.site.example qua postMessage(). Lưu ý rằng các miền này ở cùng một trang web nhưng khác 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 thiết

Chrome đã và đ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 theo khoá trang web. Điều này có nghĩa là các tài liệu trên cùng một 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 còn tuỳ thuộc vào trình duyệt). Gần đây, Chrome đã bắt đầu xử lý các đơn vị đó ở những đơn vị chi tiết hơn: nguồn gốc. Chúng tôi gọi đây là cụm tác nhân theo khoá nguồn gốc. Tuy nhiên, vì làm như vậy sẽ 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 ngẫu nhiên cho một số trang web.

Theo kế hoạch, tất cả các cụm tác nhân sẽ được khoá theo nguồn gốc theo mặc định. Để làm được điều này, chúng tôi cần hạn chế những tính năng yêu cầu cụm nguồn gốc theo khoá trang web:

  • (Chỉ dành cho Chrome) Bạn không thể tiếp tục gửi đối tượng SharedArrayBuffer hoặc WebAssembly.Memory đến các trang khác có cùng nguồn gốc với cùng trang web. Tính năng này đã được áp dụng kể từ Chrome 92.
  • Bạn không thể gửi các đối tượng WebAssembly.Module đến các trang khác trên cùng một trang web có nhiều nguồn gốc thông qua postMessage() nữa. Thay đổi này được giải thích chi tiết hơn ở bên dưới.
  • Bạn không thể đặt document.domain được nữa. Đây là một tính năng cũ thường cho phép các trang có nguồn gốc khác nhau 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ị tắt.

Bằng cách giải quyết tất cả các thay đổi ở trên, Chrome sẽ chuyển sang sử dụng các cụm tác nhân được khoá nguồn 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 bài viết 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ỉ có thể đọc. Nhóm Chrome dự định sẽ triển khai thay đổi này vào khoảng năm 2022.

Ảnh của Markus Winkler trên Unsplash