การขอการแยกประสิทธิภาพด้วยส่วนหัว Origin-Agent-Cluster

ส่วนหัวการตอบกลับ HTTP ใหม่เพื่อจำกัดการเขียนสคริปต์ทั่วทั้งโดเมนและขอทรัพยากรเฉพาะจากเบราว์เซอร์

โดมินิก เดนิโคลา
Domenic Denicola

Origin-Agent-Cluster เป็นส่วนหัวการตอบกลับ HTTP ใหม่ที่สั่งให้เบราว์เซอร์ป้องกันการเข้าถึงสคริปต์แบบพร้อมกันระหว่างหน้าแบบข้ามต้นทางในเว็บไซต์เดียวกัน เบราว์เซอร์อาจใช้ Origin-Agent-Cluster เป็นสัญญาณว่าต้นทางควรมีทรัพยากรแยกต่างหาก เช่น กระบวนการเฉพาะ

ความเข้ากันได้กับเบราว์เซอร์

ปัจจุบันส่วนหัว Origin-Agent-Cluster มีการใช้งานใน Chrome 88 เป็นต้นไปเท่านั้น ผลิตภัณฑ์นี้ออกแบบมาให้ทำงานร่วมกับตัวแทนจาก Mozilla Firefox ที่ได้ทำเครื่องหมายว่าเป็นต้นแบบที่ดี และได้รับการตอบรับที่ดีในเบื้องต้นจากตัวแทน WebKit ซึ่งเป็นเครื่องมือเบราว์เซอร์ที่ Safari ใช้อยู่

แต่ในระหว่างนี้ การทำให้ส่วนหัว Origin-Agent-Cluster ใช้งานได้สำหรับผู้ใช้ทุกคนในวันนี้ไม่มีปัญหา เบราว์เซอร์ที่ไม่เข้าใจก็จะไม่สนใจเบราว์เซอร์นั้น และเนื่องจากหน้าในคลัสเตอร์ Agent ที่ผูกกับต้นทางสามารถทำได้น้อยกว่าหน้าที่ผูกกับเว็บไซต์ (ค่าเริ่มต้น) จึงไม่ต้องกังวลเรื่องความสามารถในการทำงานร่วมกัน

เหตุใดเบราว์เซอร์จึงแยกต้นทางของเว็บไซต์เดียวกันไม่ได้

เว็บสร้างขึ้นด้วยนโยบายต้นทางเดียวกัน ซึ่งเป็นฟีเจอร์ความปลอดภัยที่จำกัดวิธีที่เอกสารและสคริปต์จะโต้ตอบกับทรัพยากรจากต้นทางอื่น เช่น หน้าที่โฮสต์ที่ https://a.example อยู่ในต้นทางต่างจากหน้าที่ https://b.example หรือที่ https://sub.a.example

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

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

การประเมินพฤติกรรมเหล่านี้ไม่สมบูรณ์แบบ และยังได้รับผลกระทบจากข้อจำกัดสำคัญ เนื่องจากมีข้อยกเว้นสำหรับนโยบายต้นทางเดียวกันที่อนุญาตให้โดเมนย่อยอย่าง https://sub.a.example และ https://a.example สื่อสารกันได้ เบราว์เซอร์ไม่สามารถแยกโดเมนย่อยออกจากกันโดยอัตโนมัติ

ลักษณะการทำงานเริ่มต้นนี้เรียกว่า "คลัสเตอร์ Agent ที่ผูกกับเว็บไซต์" กล่าวคือ เบราว์เซอร์จะจัดกลุ่มหน้าเว็บตามเว็บไซต์ ส่วนหัว Origin-Agent-Cluster ใหม่จะขอให้เบราว์เซอร์เปลี่ยนลักษณะการทำงานเริ่มต้นนี้สำหรับหน้าเว็บหนึ่งๆ โดยใส่ไว้ในคลัสเตอร์ Agent ที่ผูกกับต้นทาง เพื่อให้ระบบจัดกลุ่มไว้กับหน้าอื่นๆ ที่มีต้นทางเหมือนกันเท่านั้น กล่าวคือ หน้าข้ามต้นทางในเว็บไซต์เดียวกันจะยกเว้นจากคลัสเตอร์ Agent

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

อย่างไรก็ตาม เพื่อดำเนินการแยกและได้รับประโยชน์ดังกล่าว เบราว์เซอร์จำเป็นต้องปิดใช้ฟีเจอร์เดิมบางอย่าง

สิ่งที่หน้าซึ่งผูกกับต้นทางทำไม่ได้

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

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

  • คุณจะส่งออบเจ็กต์ WebAssembly.Module ไปยังหน้าข้ามต้นทางในเว็บไซต์เดียวกันผ่าน postMessage() ไม่ได้อีกต่อไป

  • (สำหรับ Chrome เท่านั้น) คุณจะส่งออบเจ็กต์ SharedArrayBuffer หรือ WebAssembly.Memory ไปยังหน้าข้ามต้นทางในเว็บไซต์เดียวกันไม่ได้อีกต่อไป

กรณีที่ควรใช้คลัสเตอร์ Agent ที่ผูกกับต้นทาง

ต้นทางที่ได้รับประโยชน์สูงสุดจากส่วนหัว Origin-Agent-Cluster คือแหล่งที่มาต่อไปนี้

  • ทำงานได้ดีที่สุดโดยใช้ทรัพยากรเฉพาะของตนเองหากเป็นไปได้ ตัวอย่างเช่น เกมที่เน้นประสิทธิภาพ เว็บไซต์การประชุมทางวิดีโอ หรือแอปการสร้างมัลติมีเดีย

  • มี iframe ที่ใช้ทรัพยากรจำนวนมากซึ่งมาจากต้นทางที่ต่างกัน แต่เป็นเว็บไซต์เดียวกัน ตัวอย่างเช่น หาก https://mail.example.com ฝัง https://chat.example.com iframe ไว้ การใช้คีย์ต้นทาง https://mail.example.com/ จะช่วยให้แน่ใจว่าโค้ดที่ทีมแชทเขียนไว้จะไม่ไปแทรกแซงโค้ดที่ทีมอีเมลเขียนโดยไม่ตั้งใจ และบอกเบราว์เซอร์ให้ทราบถึงกระบวนการที่แยกจากกันเพื่อกำหนดเวลาการทำงานแบบอิสระต่อกันและลดผลกระทบต่อประสิทธิภาพของแต่ละฝ่ายได้

  • ให้คาดว่าจะฝังเนื้อหาในหน้าที่มีต้นทางอื่นๆ ในเว็บไซต์เดียวกัน แต่ทราบว่าตนเองใช้ทรัพยากรจำนวนมาก ตัวอย่างเช่น หาก https://customerservicewidget.example.com คาดว่าจะใช้ทรัพยากรจำนวนมากสำหรับวิดีโอแชท และระบบจะฝังโปรแกรมดังกล่าวไว้ในต้นทางต่างๆ ทั่วทั้ง https://*.example.com ทีมที่ดูแลวิดเจ็ตนั้นสามารถใช้ส่วนหัว Origin-Agent-Cluster เพื่อพยายามลดผลกระทบด้านประสิทธิภาพที่มีต่อผู้ฝังได้

นอกจากนี้ คุณยังต้องตรวจสอบด้วยว่าคุณสามารถปิดใช้ฟีเจอร์การสื่อสารแบบข้ามต้นทางที่ไม่ค่อยมีการใช้งานซึ่งกล่าวถึงข้างต้น และเว็บไซต์ของคุณใช้ HTTPS อยู่

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

การตั้งค่านี้เกี่ยวข้องกับการแยกแบบข้ามต้นทางอย่างไร

การคีย์ต้นทางของคลัสเตอร์ Agent ผ่านส่วนหัว Origin-Agent-Cluster นั้นเกี่ยวข้องกับการแยกแบบข้ามต้นทางผ่านส่วนหัว Cross-Origin-Opener-Policy และ Cross-Origin-Embedder-Policy แยกต่างหาก

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

วิธีใช้ส่วนหัว Origin-Agent-Cluster

หากต้องการใช้ส่วนหัว Origin-Agent-Cluster ให้กำหนดค่าเว็บเซิร์ฟเวอร์ของคุณให้ส่งส่วนหัวการตอบกลับ HTTP ต่อไปนี้

Origin-Agent-Cluster: ?1

ค่าของ ?1 คือไวยากรณ์ส่วนหัวที่มีโครงสร้างสำหรับค่าบูลีน true

คุณต้องส่งส่วนหัวนี้ในการตอบกลับทั้งหมดจากต้นทาง ไม่ใช่เพียงบางหน้า มิฉะนั้น อาจได้รับผลลัพธ์ที่ไม่สอดคล้องกัน ซึ่งเบราว์เซอร์ "จดจำ" เห็นคำขอคีย์ต้นทาง ซึ่งทำให้คีย์ต้นทางทำงานแม้ในหน้าที่ไม่ได้ขอ หรือในทางกลับกัน หากหน้าแรกที่ผู้ใช้เข้าชมไม่มีส่วนหัว เบราว์เซอร์จะจดจำว่าต้นทางไม่ต้องการให้ผูกกับต้นทาง และจะไม่สนใจส่วนหัวในหน้าถัดๆ ไป

เหตุใดเบราว์เซอร์อาจไม่ยึดตามส่วนหัวเสมอ

เหตุผลสำหรับ "ความทรงจำ" นี้คือเพื่อให้การคีย์ของต้นทางสอดคล้องกัน หากบางหน้าในต้นทางถูกผูกกับต้นทางในขณะที่หน้าอื่นๆ ไม่ได้เชื่อมโยง ก็แสดงว่าคุณอาจมีหน้าต้นทางเดียวกัน 2 หน้าซึ่งใส่ไว้ในคลัสเตอร์ Agent ที่ต่างกัน ระบบจึงไม่อนุญาตให้พูดคุยกัน นี่อาจแปลกมากสำหรับทั้งนักพัฒนาเว็บและการทำงานภายในของเบราว์เซอร์ ดังนั้น ข้อกําหนดสําหรับ Origin-Agent-Cluster จะไม่สนใจส่วนหัวแทน หากไม่สอดคล้องกับสิ่งที่เคยพบก่อนหน้านี้ในต้นทางหนึ่งๆ ซึ่งใน Chrome การดำเนินการนี้จะทำให้มีคำเตือนในคอนโซล

ความสอดคล้องนี้จะกำหนดขอบเขตไว้ที่กลุ่มบริบทการท่องเว็บ ซึ่งเป็นกลุ่มแท็บ หน้าต่าง หรือ iframe ที่เข้าถึงกันและกันผ่านกลไกต่างๆ เช่น window.opener, frames[0] หรือ window.parent ซึ่งหมายความว่าเมื่อการตั้งค่าต้นทางหรือคีย์เว็บไซต์ของต้นทางได้รับการตั้งค่าแล้ว (โดยเบราว์เซอร์เห็นหรือไม่เห็นส่วนหัว) การเปลี่ยนแปลงจะต้องเปิดแท็บใหม่ทั้งหมด ไม่ได้เชื่อมต่อกับแท็บเก่าเลย

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

หากต้องการตรวจสอบว่ามีการใช้ส่วนหัว Origin-Agent-Cluster หรือไม่ ให้ใช้พร็อพเพอร์ตี้ window.originAgentCluster ของ JavaScript ซึ่งจะเป็น true ในกรณีที่ส่วนหัว (หรือกลไกอื่นๆ เช่น การแยกแบบข้ามต้นทาง) ทำให้เกิดการผูกกับต้นทาง false เมื่อไม่ได้ดำเนินการดังกล่าว และ undefined ในเบราว์เซอร์ที่ไม่ได้ใช้ส่วนหัว Origin-Agent-Cluster การบันทึกข้อมูลนี้ลงในแพลตฟอร์มข้อมูลวิเคราะห์จะช่วยให้ตรวจสอบได้ว่าคุณกำหนดค่าเซิร์ฟเวอร์อย่างถูกต้อง

สุดท้ายนี้ โปรดทราบว่าส่วนหัว Origin-Agent-Cluster จะใช้ได้กับบริบทที่ปลอดภัยเท่านั้น เช่น ในหน้า HTTPS หรือใน http://localhost หน้า HTTP ที่ไม่ใช่ localhost จะไม่รองรับคลัสเตอร์ Agent ที่ผูกกับต้นทาง

การผูกกับต้นทางไม่ใช่ฟีเจอร์ความปลอดภัย

แม้ว่าการใช้คลัสเตอร์ Agent ที่ผูกกับต้นทางจะแยกต้นทางจากการเข้าถึงพร้อมกันจากหน้าข้ามต้นทางในเว็บไซต์เดียวกัน แต่จะไม่ให้การปกป้องส่วนหัวที่เกี่ยวข้องกับความปลอดภัย เช่น Cross-Origin-Resource-PolicyและCross-Origin-Opener-Policy โดยเฉพาะอย่างยิ่งการป้องกันการโจมตีทางช่องด้านข้างอย่าง Spectre ที่ไม่น่าเชื่อถือ

เรื่องนี้อาจจะน่าประหลาดใจเล็กน้อย เนื่องจากบางครั้งการใช้คีย์ต้นทางอาจทำให้ต้นทางมีกระบวนการของตนเอง และกระบวนการแยกต่างหากคือการป้องกันการโจมตีที่สำคัญต่อการโจมตีแบบ Side-channel แต่โปรดทราบว่าส่วนหัว Origin-Agent-Cluster เป็นเพียงคำแนะนำเท่านั้น เบราว์เซอร์ไม่มีข้อผูกมัดใดๆ ที่จะต้องทำให้ต้นทางของคุณมีกระบวนการที่แยกต่างหาก ซึ่งอาจเกิดจากสาเหตุต่างๆ ต่อไปนี้

  • เบราว์เซอร์อาจไม่ใช้เทคโนโลยีในการดำเนินการดังกล่าว ตัวอย่างเช่น ในปัจจุบัน Safari และ Firefox สามารถใส่แท็บต่างๆ ลงในกระบวนการของตัวเองได้ แต่ยังทำไม่ได้สำหรับ iframe

  • เบราว์เซอร์อาจตัดสินใจว่าไม่คุ้มค่ากับค่าใช้จ่ายในการดำเนินการที่แยกต่างหาก เช่น ในอุปกรณ์ Android ที่มีหน่วยความจำน้อยหรือใน Android WebView นั้น Chrome จะใช้กระบวนการน้อยที่สุดเท่าที่จะเป็นไปได้

  • เบราว์เซอร์อาจต้องการทำตามคำขอที่ส่วนหัว Origin-Agent-Cluster ระบุไว้ แต่ก็สามารถทำได้โดยใช้เทคโนโลยีการแยกที่ต่างจากกระบวนการ เช่น Chrome จะสำรวจโดยใช้ชุดข้อความแทนกระบวนการแยกประสิทธิภาพการทำงานในลักษณะนี้

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

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

ความคิดเห็น

ทีม Chrome ยินดีรับฟังความคิดเห็นจากคุณหากคุณใช้หรือพิจารณาที่จะใช้ส่วนหัว Origin-Agent-Cluster ประโยชน์ต่อสาธารณะและการสนับสนุนของคุณช่วยให้เราจัดลำดับความสำคัญของฟีเจอร์และแสดงให้ผู้ให้บริการเบราว์เซอร์รายอื่นๆ เห็นว่าฟีเจอร์ดังกล่าวสำคัญเพียงใด ทวีตที่ @ChromiumDev และบอกให้ Chrome DevRel ทราบถึงความคิดและประสบการณ์ของคุณ

หากมีคำถามเพิ่มเติมเกี่ยวกับข้อกำหนดหรือรายละเอียดวิธีการทำงานของฟีเจอร์ คุณรายงานปัญหาได้ในที่เก็บ HTML แบบมาตรฐานของ GitHub และหากพบปัญหาเกี่ยวกับการติดตั้งใช้งาน Chrome ให้รายงานข้อบกพร่องที่ new.crbug.com โดยตั้งค่าช่องคอมโพเนนต์เป็น Internals>Sandbox>SiteIsolation

ดูข้อมูลเพิ่มเติม

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