การจำกัดการแชร์โมดูล Wasm ไปยังต้นทางเดียวกัน

การแชร์โมดูล WebAssembly ระหว่างสภาพแวดล้อมของเว็บไซต์เดียวกันจะถูกจำกัดให้อยู่ในต้นทางเดียวกันเท่านั้น

ระบบจะเลิกใช้งานการแชร์โมดูล WebAssembly (Wasm) ระหว่างสภาพแวดล้อมแบบเว็บไซต์เดียวกันแต่ข้ามต้นทางเพื่ออนุญาตให้กำหนดขอบเขตคลัสเตอร์ Agent ไปยังต้นทางในระยะยาว นักพัฒนาซอฟต์แวร์ที่ใช้โมดูล Wasm ในลักษณะนี้ต้องตรวจสอบว่าได้สร้างอินสแตนซ์ของโมดูลเหล่านั้นที่ต้นทางเดียวกันเพื่อให้ใช้โมดูลเหล่านั้นต่อไปได้หลังจาก Chrome 95

โมดูล Wasm คืออะไรและทำงานอย่างไร

โปรแกรม WebAssembly จะแบ่งออกเป็นโมดูลต่างๆ ซึ่งเป็นหน่วยของการติดตั้งใช้งาน การโหลด และการคอมไพล์

ในโค้ดตัวอย่างต่อไปนี้ โมดูล Wasm ที่นำเข้าจาก https://iframe.site.example จะแชร์กับ https://main.site.example ผ่าน postMessage() โปรดทราบว่าโดเมนเหล่านี้เป็นแบบเว็บไซต์เดียวกันแต่ข้ามต้นทาง

โมดูล Wasm เมื่อ https://iframe.site.example:

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

โดยตั้งแต่ Chrome 95 เป็นต้นไป ผู้ส่งและผู้รับต้องมาจากต้นทางเดียวกัน ในกรณีข้างต้น https://iframe.site.example ต้องเป็น https://main.site.example หรือในทางกลับกัน

เหตุใดจึงต้องอนุญาต

Chrome ได้จัดการเอกสาร แท็บ และเฟรมต่างๆ ภายในคลัสเตอร์ Agent ที่ผูกกับเว็บไซต์ ซึ่งหมายความว่าเอกสารในเว็บไซต์เดียวกันจะได้รับการจัดการภายในกระบวนการเดียวกัน (ลักษณะการทำงานนี้จะแตกต่างกันไปในแต่ละเบราว์เซอร์) เมื่อเร็วๆ นี้ Chrome เริ่มจัดการโดยใช้ หน่วยย่อยที่ละเอียดยิ่งขึ้น ซึ่งก็คือต้นทาง เราเรียกว่าคลัสเตอร์ Agent ที่ผูกกับต้นทาง อย่างไรก็ตาม เนื่องจากการดำเนินการนี้ทำให้ทรัพยากรมีราคาแพง ระบบจึงนำคลัสเตอร์ Agent ที่ผูกกับต้นทางไปใช้กับเว็บไซต์แบบจำกัดเท่านั้น

แผนคือการทำให้คลัสเตอร์ Agent ทั้งหมดผูกกับต้นทางโดยค่าเริ่มต้น เพื่อให้บรรลุเป้าหมายนี้ เราต้องจำกัดความสามารถที่ต้องใช้คลัสเตอร์ต้นทางที่ผูกกับเว็บไซต์ ดังนี้

  • (สำหรับ Chrome เท่านั้น) คุณจะส่งออบเจ็กต์ SharedArrayBuffer หรือ WebAssembly.Memory ไปยังหน้าข้ามต้นทางในเว็บไซต์เดียวกันไม่ได้อีกต่อไป แต่มีให้ใช้งานแล้วตั้งแต่ Chrome 92
  • คุณจะส่งออบเจ็กต์ WebAssembly.Module ไปยังหน้าข้ามต้นทางในเว็บไซต์เดียวกันผ่าน postMessage() ไม่ได้อีกต่อไป การเปลี่ยนแปลงนี้ จะอธิบายรายละเอียดเพิ่มเติมด้านล่าง..
  • คุณจะตั้งค่า document.domain ไม่ได้อีกต่อไป นี่เป็นฟีเจอร์เดิมที่ปกติแล้วจะอนุญาตให้หน้าแบบข้ามต้นทางในเว็บไซต์เดียวกันเข้าถึง DOM ของกันและกันได้พร้อมกัน แต่ในคลัสเตอร์ Agent ที่ผูกกับต้นทาง จะมีการปิดใช้

เมื่อแก้ไขการเปลี่ยนแปลงข้างต้นทั้งหมดแล้ว Chrome จะเปลี่ยนไปใช้คลัสเตอร์ Agent ที่ผูกกับต้นทางโดยค่าเริ่มต้น

ดูข้อมูลเพิ่มเติมเกี่ยวกับคลัสเตอร์ Agent ที่ผูกกับต้นทางได้ในการส่งคำขอการแยกประสิทธิภาพด้วยส่วนหัว Origin-Agent-Cluster

ขั้นตอนถัดไปและทรัพยากร

เรากำหนดให้ document.domain เป็นแบบอ่านอย่างเดียวเพื่อให้ Chrome ทำงานกับคลัสเตอร์ Agent ที่ผูกกับต้นทางโดยค่าเริ่มต้นได้ ทีม Chrome ตั้งเป้าที่จะทำการเปลี่ยนแปลงนี้ในปี 2022

รูปภาพโดย Markus Winkler ใน Unsplash