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

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

เราจะเลิกใช้งานการแชร์โมดูล WebAssembly (Wasm) ระหว่างสภาพแวดล้อมในเว็บไซต์เดียวกันแต่ข้ามต้นทางเพื่อให้กำหนดขอบเขตคลัสเตอร์ของตัวแทนไปยังต้นทางได้ในระยะยาว นักพัฒนาซอฟต์แวร์ที่ใช้โมดูล 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 จัดการเอกสาร แท็บ และเฟรมต่างๆ ภายในคลัสเตอร์ตัวแทนที่กําหนดคีย์ตามเว็บไซต์ ซึ่งหมายความว่าระบบจะจัดการเอกสารในเว็บไซต์เดียวกันภายในกระบวนการเดียวกัน (วิธีการทำงานที่แน่ชัดจะแตกต่างกันไปในแต่ละเบราว์เซอร์) เมื่อเร็วๆ นี้ 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 ทำงานร่วมกับคลัสเตอร์ตัวแทนที่มีการคีย์ต้นทางโดยค่าเริ่มต้น ทีม Chrome ตั้งเป้าที่จะเปิดตัวการเปลี่ยนแปลงนี้ในช่วงต้นปี 2022

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