การขอการแยกประสิทธิภาพด้วยส่วนหัว 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 ใช้งานได้สำหรับผู้ใช้ทุกคนในวันนี้ เบราว์เซอร์ที่ไม่เข้าใจก็จะไม่สนใจเบราว์เซอร์นั้น และเนื่องจากหน้าเว็บในคลัสเตอร์ 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 ฝัง iframe https://chat.example.com รายการ การใช้คีย์ต้นทาง 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 คือไวยากรณ์ header ที่มีโครงสร้างสำหรับค่า true แบบบูลีน

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

เหตุใดเบราว์เซอร์จึงไม่คำนึงถึงส่วนหัวตลอดเวลา

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