การขอการแยกประสิทธิภาพด้วยส่วนหัว 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 ที่ผูกกับต้นทางอาจทำสิ่งต่างๆ ได้น้อยกว่าคลัสเตอร์ที่ผูกกับเว็บไซต์ ( (ค่าเริ่มต้น) ไม่มีปัญหาเรื่องการทำงานร่วมกันที่ต้องกังวล

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

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