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