Yêu cầu tách biệt hiệu suất bằng tiêu đề Origin-Agent-Cluster

Tiêu đề phản hồi HTTP mới để giới hạn việc viết tập lệnh trên toàn miền và yêu cầu tài nguyên chuyên dụng từ trình duyệt.

Domenic Denicola
Domenic Denicola

Origin-Agent-Cluster là một tiêu đề phản hồi HTTP mới hướng dẫn trình duyệt ngăn chặn việc truy cập tập lệnh đồng bộ giữa các trang cùng trang web và khác nguồn gốc. Các trình duyệt cũng có thể sử dụng Origin-Agent-Cluster làm gợi ý rằng máy chủ gốc của bạn sẽ nhận được các tài nguyên riêng biệt, chẳng hạn như một quy trình riêng.

Khả năng tương thích với trình duyệt

Hiện tại, tiêu đề Origin-Agent-Cluster chỉ được triển khai trong Chrome 88 trở lên. Ứng dụng này được thiết kế trong quá trình cộng tác chặt chẽ với các đại diện của Mozilla Firefox. Họ đã đánh dấu ứng dụng này là nên tạo bản nguyên mẫuđược đón nhận tích cực ban đầu từ các đại diện của WebKit, công cụ trình duyệt mà Safari sử dụng.

Tuy nhiên, trong lúc này, bạn không cần lo lắng khi triển khai tiêu đề Origin-Agent-Cluster cho tất cả người dùng. Các trình duyệt không hiểu được API sẽ bỏ qua thông báo đó. Ngoài ra, vì các trang trong cụm tác nhân khoá nguồn thực sự có thể làm ít việc hơn so với các trang trong cụm tác nhân khoá trang web (mặc định), nên bạn không cần lo lắng về vấn đề tương tác.

Lý do các trình duyệt không thể tự động tách biệt các nguồn gốc cùng trang web

Web được xây dựng dựa trên chính sách cùng nguồn gốc. Đây là một tính năng bảo mật hạn chế cách tài liệu và tập lệnh có thể tương tác với tài nguyên từ một nguồn gốc khác. Ví dụ: một trang được lưu trữ tại https://a.example có nguồn gốc khác với một trang tại https://b.example hoặc tại một nguồn gốc tại https://sub.a.example.

Trong thực tế, các trình duyệt sử dụng sự phân tách mà các nguồn gốc cung cấp theo nhiều cách. Trước đây, mặc dù các nguồn gốc riêng biệt không thể truy cập vào dữ liệu của nhau, nhưng các nguồn gốc này vẫn chia sẻ các tài nguyên như luồng hệ điều hành, quy trình và phân bổ bộ nhớ. Điều này có nghĩa là nếu một thẻ bị chậm, thì tất cả các thẻ khác cũng sẽ bị chậm. Hoặc nếu một thẻ sử dụng quá nhiều bộ nhớ, toàn bộ trình duyệt sẽ gặp sự cố.

Ngày nay, trình duyệt trở nên tinh vi hơn và cố gắng tách các nguồn gốc khác nhau thành các quy trình khác nhau. Cách hoạt động chính xác của tính năng này còn tuỳ thuộc vào trình duyệt: hầu hết trình duyệt đều có một mức độ phân tách nào đó giữa các thẻ, nhưng các iframe khác nhau bên trong một thẻ có thể chia sẻ một quy trình. Và vì các tiến trình đi kèm với mức hao tổn bộ nhớ, nên chúng sử dụng phương pháp suy nghiệm để tránh tạo quá nhiều dữ liệu: ví dụ: Firefox có giới hạn quy trình có thể định cấu hình người dùng và Chrome thay đổi hành vi giữa máy tính để bàn (nơi bộ nhớ phong phú hơn) và thiết bị di động (nơi khan hiếm bộ nhớ).

Các phương pháp phỏng đoán này không hoàn hảo. Và chúng gặp phải một hạn chế quan trọng: vì có các trường hợp ngoại lệ đối với chính sách cùng nguồn gốc cho phép các miền con như https://sub.a.examplehttps://a.example giao tiếp với nhau, nên trình duyệt không thể tự động phân tách các miền con với nhau.

Hành vi mặc định này được gọi là "các cụm tác nhân theo khoá trang web": tức là trình duyệt nhóm các trang dựa trên trang web của chúng. Tiêu đề Origin-Agent-Cluster mới yêu cầu trình duyệt thay đổi hành vi mặc định này cho một trang nhất định, đưa trang đó vào một cụm tác nhân khoá nguồn gốc để chỉ nhóm trang đó với các trang khác có cùng nguồn gốc. Cụ thể, các trang có nguồn gốc khác nhau trên cùng một trang web sẽ bị loại trừ khỏi cụm tác nhân.

Việc tách biệt tuỳ chọn này cho phép trình duyệt cung cấp cho các cụm tác nhân mới theo khoá nguồn gốc này các tài nguyên chuyên dụng riêng, không kết hợp với các tài nguyên của các nguồn gốc khác. Ví dụ: các trang như vậy có thể có quy trình riêng hoặc được lên lịch trên các luồng riêng biệt. Bằng cách thêm tiêu đề Origin-Agent-Cluster vào trang, bạn đang cho trình duyệt biết rằng trang sẽ được hưởng lợi từ các tài nguyên chuyên dụng như vậy.

Tuy nhiên, để thực hiện việc phân tách và nhận được những lợi ích này, trình duyệt cần tắt một số tính năng cũ.

Những việc mà trang được khoá theo nguồn gốc không thể làm

Khi trang của bạn nằm trong một cụm tác nhân theo khoá nguồn gốc, bạn sẽ mất một số khả năng kết nối với các trang có nhiều nguồn gốc trên cùng một trang web đã có trước đây. Cụ thể:

  • Bạn không thể đặt document.domain được nữa. Đây là một tính năng cũ thường cho phép các trang có nguồn gốc khác trên cùng một trang web truy cập đồng bộ vào DOM của nhau, nhưng trong các cụm tác nhân theo khoá nguồn gốc, tính năng này bị tắt.

  • Bạn không thể tiếp tục gửi đối tượng WebAssembly.Module đến các trang có nhiều nguồn gốc cùng trang web khác thông qua postMessage().

  • (Chỉ dành cho Chrome) Bạn không thể gửi các đối tượng SharedArrayBuffer hoặc WebAssembly.Memory đến các trang khác trên cùng một trang web có nhiều nguồn gốc.

Trường hợp nên sử dụng cụm tác nhân theo khoá nguồn gốc

Những nguồn gốc hưởng lợi nhiều nhất từ tiêu đề Origin-Agent-Cluster là những nguồn gốc:

  • Hoạt động hiệu quả nhất bằng tài nguyên chuyên dụng riêng khi có thể. Ví dụ: trò chơi đòi hỏi hiệu suất cao, trang web hội nghị truyền hình hoặc ứng dụng tạo nội dung đa phương tiện.

  • Chứa các iframe tốn nhiều tài nguyên là các iframe khác nhau, nhưng cùng một trang web. Ví dụ: nếu https://mail.example.com nhúng các iframe https://chat.example.com, thì tính năng khoá nguồn https://mail.example.com/ sẽ đảm bảo rằng mã do nhóm trò chuyện viết không thể vô tình can thiệp vào mã do nhóm thư viết, đồng thời có thể gợi ý cho trình duyệt cung cấp cho các mã đó các quy trình riêng để lên lịch độc lập và giảm tác động của hiệu suất lên nhau.

  • Dự kiến được nhúng trên các trang có nguồn gốc khác nhau, cùng một trang web, nhưng biết rằng các trang này tốn nhiều tài nguyên. Ví dụ: nếu https://customerservicewidget.example.com dự kiến sử dụng nhiều tài nguyên để trò chuyện video và sẽ được nhúng trên nhiều nguồn gốc trong https://*.example.com, thì nhóm duy trì tiện ích đó có thể sử dụng tiêu đề Origin-Agent-Cluster để cố gắng giảm tác động hiệu suất của các tiện ích đó đối với trình nhúng.

Ngoài ra, bạn cũng cần đảm bảo rằng bạn có thể tắt các tính năng giao tiếp giữa các nguồn gốc hiếm khi sử dụng đã thảo luận ở trên và trang web của bạn đang sử dụng HTTPS.

Nhưng cuối cùng, đây chỉ là các nguyên tắc. Liệu các cụm tác nhân theo khoá nguồn gốc có giúp ích cho trang web của bạn hay không, chính là xác định chính xác nhất thông qua các phép đo. Cụ thể, bạn nên đo lường các chỉ số Web Vitals và có thể là mức sử dụng bộ nhớ để xem việc khoá nguồn gốc có tác động gì. (Việc sử dụng bộ nhớ nói chung là một vấn đề tiềm ẩn, vì việc tăng số lượng quy trình đang chạy có thể gây hao tổn bộ nhớ trên mỗi quy trình nhiều hơn.) Bạn không nên chỉ triển khai tính năng khoá nguồn gốc và hy vọng mọi thứ sẽ diễn ra suôn sẻ.

Điều này liên quan như thế nào đến tính năng tách biệt nhiều nguồn gốc?

Việc khoá nguồn gốc của các cụm tác nhân thông qua tiêu đề Origin-Agent-Cluster có liên quan nhưng tách biệt với tính năng tách riêng nhiều nguồn gốc thông qua tiêu đề Cross-Origin-Opener-PolicyCross-Origin-Embedder-Policy.

Mọi trang web tự tách biệt nguồn gốc cũng sẽ tắt các tính năng giao tiếp trên cùng một trang web giữa các nguồn gốc giống như khi sử dụng tiêu đề Origin-Agent-Cluster. Tuy nhiên, tiêu đề Origin-Agent-Cluster vẫn có thể hữu ích ngoài tính năng cách ly nhiều nguồn gốc, dưới dạng một gợi ý bổ sung cho trình duyệt để sửa đổi phương pháp phỏng đoán phân bổ tài nguyên. Vì vậy, bạn vẫn nên cân nhắc việc áp dụng tiêu đề Origin-Agent-Cluster và đo lường kết quả, ngay cả trên những trang đã được tách riêng trên nhiều nguồn gốc.

Cách sử dụng tiêu đề Origin-Agent-Cluster

Để sử dụng tiêu đề Origin-Agent-Cluster, hãy định cấu hình máy chủ web để gửi tiêu đề phản hồi HTTP sau:

Origin-Agent-Cluster: ?1

Giá trị của ?1 là cú pháp tiêu đề có cấu trúc cho giá trị boolean true.

Bạn phải gửi tiêu đề này trên tất cả câu trả lời trên máy chủ gốc của bạn, chứ không chỉ một số trang. Nếu không, bạn có thể nhận được kết quả không nhất quán, trong đó trình duyệt "ghi nhớ" việc thấy một yêu cầu nhập khoá gốc và do đó, trình duyệt sẽ nhập khoá gốc ngay cả trên các trang không yêu cầu khoá gốc. Hoặc ngược lại: nếu trang đầu tiên mà người dùng truy cập không có tiêu đề, thì trình duyệt sẽ ghi nhớ rằng nguồn gốc của bạn không muốn được khoá theo nguồn gốc và sẽ bỏ qua tiêu đề trên các trang tiếp theo.

Tại sao trình duyệt không phải lúc nào cũng tuân theo tiêu đề?

Lý do tạo ra "bộ nhớ" này là để đảm bảo tính nhất quán của việc nhập khoá cho một nguồn gốc. Nếu một số trang trên một nguồn gốc được khoá nguồn gốc, trong khi các trang khác thì không, thì bạn có thể có hai trang cùng nguồn gốc được đưa vào các cụm tác nhân khác nhau và do đó không được phép giao tiếp với nhau. Điều này sẽ rất lạ, cả đối với nhà phát triển web và đối với các thành phần bên trong trình duyệt. Do đó, thông số kỹ thuật cho Origin-Agent-Cluster sẽ bỏ qua tiêu đề nếu tiêu đề đó không nhất quán với tiêu đề đã thấy trước đó cho một nguồn gốc nhất định. Trong Chrome, việc này sẽ dẫn đến cảnh báo trên bảng điều khiển.

Tính nhất quán này được áp dụng cho một nhóm ngữ cảnh duyệt web, là một nhóm các thẻ, cửa sổ hoặc khung iframe, tất cả đều có thể liên kết với nhau thông qua các cơ chế như window.opener, frames[0] hoặc window.parent. Điều này có nghĩa là sau khi khoá nguồn gốc hoặc khoá trang web của một nguồn gốc được giải quyết (trình duyệt thấy hoặc không thấy tiêu đề), bạn cần mở một thẻ hoàn toàn mới để thay đổi khoá đó, không được kết nối với thẻ cũ theo bất kỳ cách nào.

Những thông tin chi tiết này có thể quan trọng để kiểm thử tiêu đề Origin-Agent-Cluster. Khi thêm thẻ này vào trang web lần đầu, bạn không thể chỉ tải lại trang; bạn cần đóng thẻ đó rồi mở một thẻ mới.

Để kiểm tra xem tiêu đề Origin-Agent-Cluster có được áp dụng hay không, hãy dùng thuộc tính JavaScript window.originAgentCluster. Giá trị này sẽ là true trong trường hợp tiêu đề (hoặc các cơ chế khác, chẳng hạn như cách ly nhiều nguồn gốc) gây ra việc khoá nguồn gốc; false khi không gây ra việc khoá nguồn gốc; và undefined trong các trình duyệt không triển khai tiêu đề Origin-Agent-Cluster. Việc ghi lại dữ liệu này vào nền tảng phân tích có thể cung cấp thông tin kiểm tra hữu ích rằng bạn đã định cấu hình máy chủ đúng cách.

Cuối cùng, lưu ý rằng tiêu đề Origin-Agent-Cluster sẽ chỉ hoạt động trên các ngữ cảnh bảo mật, tức là trên các trang HTTPS hoặc trên http://localhost. Các trang HTTP không phải máy chủ nội bộ không hỗ trợ các cụm tác nhân được khoá nguồn gốc.

Khoá nguồn gốc không phải là một tính năng bảo mật

Mặc dù việc sử dụng cụm tác nhân theo khoá nguồn gốc giúp tách biệt nguồn gốc của bạn khỏi quyền truy cập đồng bộ từ các trang trên cùng một trang web trên nhiều nguồn gốc, nhưng cụm này không cung cấp biện pháp bảo vệ cho các tiêu đề liên quan đến bảo mật như Cross-Origin-Resource-PolicyCross-Origin-Opener-Policy. Cụ thể, đây không phải là biện pháp bảo vệ đáng tin cậy chống lại các cuộc tấn công kênh bên như Spectre.

Điều này có thể hơi bất ngờ vì phương thức khoá nguồn gốc đôi khi có thể khiến nguồn gốc của bạn có quy trình riêng và các quy trình riêng biệt là một biện pháp phòng vệ quan trọng giúp chống lại các cuộc tấn công kênh bên. Tuy nhiên, hãy nhớ rằng tiêu đề Origin-Agent-Cluster chỉ là một gợi ý về vấn đề đó. Trình duyệt không có nghĩa vụ cung cấp một quy trình riêng cho nguồn gốc của bạn, và có thể không làm như vậy vì nhiều lý do:

  • Một trình duyệt có thể không triển khai công nghệ để thực hiện việc này. Ví dụ: hiện tại, Safari và Firefox có thể đặt các thẻ riêng biệt vào quy trình của riêng chúng, nhưng chưa thể thực hiện việc này đối với iframe.

  • Trình duyệt có thể quyết định rằng không đáng để tốn chi phí cho một quy trình riêng biệt. Ví dụ: trên thiết bị Android có bộ nhớ thấp hoặc trong Android WebView, Chrome sử dụng ít quy trình nhất có thể.

  • Trình duyệt có thể muốn tuân thủ yêu cầu mà tiêu đề Origin-Agent-Cluster cho biết, nhưng có thể thực hiện việc này bằng cách sử dụng công nghệ tách biệt khác với quy trình. Ví dụ: Chrome đang khám phá việc sử dụng luồng thay vì quy trình cho loại hoạt động tách biệt hiệu suất này.

  • Người dùng hoặc mã chạy trên một trang web khác có thể đã chuyển đến một trang được khoá trang web trên nguồn gốc của bạn, khiến tính năng đảm bảo tính nhất quán kích hoạt và tiêu đề Origin-Agent-Cluster bị bỏ qua hoàn toàn.

Vì những lý do này, bạn không nên coi cụm tác nhân theo khoá nguồn gốc là một tính năng bảo mật. Thay vào đó, đây là cách giúp trình duyệt ưu tiên phân bổ tài nguyên, bằng cách gợi ý rằng nguồn gốc của bạn sẽ được hưởng lợi từ các tài nguyên chuyên dụng (và bạn sẵn sàng từ bỏ một số tính năng để đổi lấy điều đó).

Phản hồi

Nhóm Chrome rất mong nhận được ý kiến phản hồi của bạn nếu bạn đang sử dụng hoặc cân nhắc sử dụng tiêu đề Origin-Agent-Cluster. Sự quan tâm và ủng hộ của bạn giúp chúng tôi ưu tiên các tính năng và cho các nhà cung cấp trình duyệt khác thấy tầm quan trọng của các tính năng đó. Hãy tweet đến @ChromiumDev và cho Chrome DevRel biết suy nghĩ và trải nghiệm của bạn.

Nếu có thêm câu hỏi về thông số kỹ thuật hoặc thông tin chi tiết về cách hoạt động của tính năng này, bạn có thể gửi vấn đề trên kho lưu trữ GitHub của HTML Standard. Và nếu gặp bất kỳ vấn đề nào trong quá trình triển khai Chrome, bạn có thể báo cáo lỗi tại new.crbug.com với trường Thành phần được đặt thành Internals>Sandbox>SiteIsolation.

Tìm hiểu thêm

Để tìm hiểu thêm về cụm tác nhân khoá nguồn gốc, bạn có thể xem thông tin chi tiết tại các đường liên kết sau: