การขอการแยกประสิทธิภาพด้วยส่วนหัว 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

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

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

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

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

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

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

ความคิดเห็น

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

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

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับคลัสเตอร์ตัวแทนที่มีการคีย์ต้นทางได้ที่ลิงก์ต่อไปนี้