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