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