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

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ở đi. Được thiết kế cộng tác chặt chẽ với các đại diện của Mozilla Firefox, những người đã đánh dấu chương trình này là giá trị tạo nguyên mẫu và có một dương tính sơ bộ tiếp nhận từ đại diện của WebKit, công cụ trình duyệt được Safari sử dụng.

Nhưng trong thời gian chờ đợi, bạn sẽ không gặp vấn đề gì khi triển khai tiêu đề Origin-Agent-Cluster cho tất cả số người dùng ngay hôm nay. Các trình duyệt không hiểu API sẽ bỏ qua thông báo đó. Và vì các trang trong các cụm tác nhân theo khoá nguồn gốc thực sự có thể thực hiện ít hoạt động hơn so với các cụm tác nhân theo khoá trang web (cụm từ mặc định), thì bạn không cần lo lắng về khả năng 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 được 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ừ origin. Ví dụ: một trang được lưu trữ tại https://a.example nằm tại điểm khởi hành khác với một tại https://b.example hoặ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. Phiên bản cũ ngà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, chúng vẫn chia sẻ các tài nguyên như luồng hệ điều hành, các quy trình và cơ cấu phân bổ bộ nhớ. Điều này có nghĩa là nếu một tab bị chậm, tất cả các thẻ khác sẽ chạy chậm. Hoặc nếu một thẻ đã sử dụng quá nhiều bộ nhớ, thẻ đó sẽ gây ra sự cố cho toàn bộ trình duyệt.

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

Những suy nghiệm này không hoàn hảo. Và họ phải đối mặt với 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 các trình duyệt không thể tự động tách biệt miền con với với nhau.

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

Việc phân tách chọn sử dụng 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 của riêng chúng riêng biệt, không kết hợp với các tài nguyên của các nguồn 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. Bằng cách thêm tham số Origin-Agent-Cluster vào tiêu đề trang của bạn, tức là bạn đang cho trình duyệt biết rằng trang sẽ hưởng lợi từ các tài nguyên dành riêng đó.

Tuy nhiên, để phân tách và nhận được các 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 theo khoá nguồn gốc không làm được

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

  • Bạn không thể đặt nữa document.domain. Đây là một tính năng cũ thường cho phép các trang có cùng nguồn gốc trên cùng một trang web truy cập đồng bộ vào từng DOM của người khác, 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ể gửi nữa WebAssembly.Module sang các trang khác có cùng nguồn gốc và có cùng trang web thông qua postMessage().

  • (Chỉ dành cho Chrome) Bạn không thể gửi nữa SharedArrayBuffer hoặc WebAssembly.Memory sang các trang khác có cùng nguồn gốc và có cùng trang web.

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 được hưởng lợi nhiều nhất từ tiêu đề Origin-Agent-Cluster là những nguồn:

  • 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ụ: các trò chơi tập trung vào hiệu suất, trang web hội nghị truyền hình hoặc ứng dụng sá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 https://chat.example.com iframe, theo khoá nguồn gốc https://mail.example.com/ đảm bảo 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 và có thể gợi ý cho trình duyệt để tách biệt để lập lịch biểu một cách độc lập và giảm tác động ảnh hưởng đến hiệu suất lẫn nhau.

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

Ngoài ra, bạn cũng cần đảm bảo bạn ổn khi vô hiệu hoá các tính năng hiếm khi sử dụng được thảo luận ở trên các tính năng giao tiếp trên nhiều nguồn gốc, đồng thời 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. 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 cuối cùng mới được 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ố quan trọng về trang web và có thể cả bộ nhớ của bạn để xem tác động của phương thức khoá nguồn gốc. (Mức sử dụng bộ nhớ tính bằng là một mối lo ngại tiềm ẩn, vì việc tăng số lượng quy trình đang thực hiện có thể khiến mức hao tổn bộ nhớ cho mỗi quy trình). Bạn không nên chỉ triển khai theo khoá nguồn gốc và hy vọng điều tốt nhất.

Vấn đề này có liên quan như thế nào đến việc tách biệt nhiều nguồn gố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 đến, nhưng tách biệt cách ly nhiều nguồn gốc thông qua Cross-Origin-Opener-PolicyCross-Origin-Embedder-Policy tiêu đề.

Mọi trang web tự tách biệt nhiều nguồn gốc cũng sẽ vô hiệu hoá cùng một trang web có nhiều nguồn gốc các tính năng giao tiếp 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 bên cạnh việc tách biệt nhiều nguồn gốc, vì đây là một công cụ bổ sung gợi ý cho trình duyệt để sửa đổi suy đoán phân bổ tài nguyên. Do đó, bạn vẫn nên cân nhắc áp dụng tiêu đề Origin-Agent-Cluster và đo lường kết quả, ngay cả trên các trang đã tách biệt 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 của bạn để gửi HTTP sau đây tiêu đề phản hồi:

Origin-Agent-Cluster: ?1

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

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, trình duyệt "nhớ" thấy khoá gốc yêu cầu và do đó khoá này sẽ được tạo bằng khoá gốc ngay cả trên các trang không yêu cầu. Hoặc ngược lại: nếu trang đầu tiên người dùng truy cập không có tiêu đề, thì trình duyệt sẽ ghi nhớ rằng máy chủ gốc của bạn không muốn theo khoá 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 thủ tiêu đề?

Lý do có "kỷ niệm" 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 trang gốc đều có khoá nguồn gốc còn các trang khác thì không, nên bạn có thể có hai trang cùng nguồn gốc được đặt vào các cụm tác nhân khác nhau nên không được phép trò chuyện với nhau. Điều này sẽ là thật lạ, đối với cả nhà phát triển web lẫn bộ phận nội bộ của trình duyệt. Vì vậy, thông số kỹ thuật cho Origin-Agent-Cluster thay vào đó bỏ qua tiêu đề nếu tiêu đề đó không nhất quán với tiêu đề trước đó mà bạn thấy cho một nguồn gốc nhất định. Trong Chrome, thao tác này sẽ dẫn đến một cảnh báo trên bảng điều khiển.

Sự nhất quán này thuộc phạm vi một nhóm ngữ cảnh duyệt web, tức là một nhóm thẻ, cửa sổ hoặc Các iframe tất cả đều có thể kết nối 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 xử lý (bằng trình duyệt nhìn thấy hoặc không nhìn thấy tiêu đề), thì việc thay đổi tiêu đề đòi hỏi phải mở một giao diện hoàn toàn mới , không được kết nối với thẻ cũ theo bất kỳ cách nào.

Những thông tin này có thể đóng vai trò quan trọng trong việc kiểm thử tiêu đề Origin-Agent-Cluster. Khi thêm lần đầu tiên vào trang web của bạn, chỉ cần tải lại trang sẽ không hoạt động; bạn sẽ cần đóng tab và mở một một.

Để kiểm tra xem tiêu đề Origin-Agent-Cluster có được áp dụng hay không, hãy dùng JavaScript Thuộc tính window.originAgentCluster. Thuộc tính này sẽ là true trong trường hợp tiêu đề (hoặc trường hợp khác các cơ chế (như cách ly nhiều nguồn gốc) gây ra hiện tượng khoá nguồn gốc; false khi không; 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 mà bạn đã thiết lập máy chủ của bạn một cách chính xác.

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

Khoá 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 sẽ 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 có cùng nguồn gốc, nhưng không cung cấp biện pháp bảo vệ 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 giúp chống lại các cuộc tấn công kênh bên như Spectre.

Điều này có thể khiến bạn hơi ngạc nhiên vì phương thức khoá nguồn đôi khi có thể khiến nguồn gốc của bạn trở thành mã nguồn 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 chống lại các cuộc tấn công kênh bên. Nhưng hãy nhớ tiêu đề Origin-Agent-Cluster chỉ là một gợi ý về vấn đề đó. Trình duyệt ở dưới không nghĩa vụ cung cấp một quy trình riêng cho nguồn gốc của mình và có thể không làm như vậy vì nhiều lý do:

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

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

  • Trình duyệt nên tôn trọng yêu cầu mà tiêu đề Origin-Agent-Cluster chỉ ra. nhưng có thể thực hiện bằng cách sử dụng công nghệ cách ly khác với quy trình. Ví dụ: Chrome là khám phá bằng cách sử dụng luồng thay vì quy trình để tách biệt hiệu suất này.

  • Người dùng hoặc đoạn mã chạy trên một trang web khác có thể đã chuyển đến một trang được khoá theo trang web trên máy chủ gốc, giúp đảm bảo tính nhất quán có hiệu lực và Tiêu đề Origin-Agent-Cluster sẽ 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. Đó 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 sẽ được hưởng lợi từ các tài nguyên chuyên biệt (và bạn sẵn sàng từ bỏ một số tính năng).

Phản hồi

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

Nếu có thêm thắc mắc về thông số kỹ thuật hoặc chi tiết về cách hoạt động của tính năng này, bạn có thể báo cáo vấn đề trên kho lưu trữ GitHub chuẩn HTML. Nếu bạn 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 theo khoá nguồn gốc, bạn có thể đi sâu vào thông tin chi tiết tại các đường liên kết sau: