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

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

Domenic Denicola
Domenic Denicola

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

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

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

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

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

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

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

Origin-Agent-Cluster: ?1

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

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

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

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

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

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

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

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

แม้ว่าการใช้คลัสเตอร์ 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 และบอกให้เราทราบถึงความคิดเห็นและประสบการณ์ของคุณ

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

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

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