การจำกัดการแชร์โมดูล 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

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

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

รูปภาพโดย Markus Winkler ในวันที่ หน้าจอแนะนํา