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 truy cập tập lệnh đồng bộ giữa các trang có nhiều nguồn gốc cùng trang web. 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ở đi. Thư viện này được thiết kế với sự 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 công cụ này là tạo nguyên mẫu đáng giá và nhận được sự đón nhận tích cực sơ bộ 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 API sẽ bỏ qua thông báo đó. Ngoài ra, vì các trang trong 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 trang do trang web nhập (mặc định), nên 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 hạn chế cách các tài liệu và tập lệnh có thể tương tác với tài nguyên 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 nguồn gốc 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 chúng vẫn dùng chung các tài nguyên như luồng hệ điều hành, quy trình và hoạt động phân bổ bộ nhớ. Tức là nếu một thẻ bị chậm thì tất cả các thẻ khác 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, các trình duyệt tinh vi hơn và cố gắng phân 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 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 mức độ phân tách giữa các thẻ, nhưng các iframe khác nhau bên trong một thẻ có thể dùng chung một quy trình. Và vì các quy trình đi kèm với mức hao tổn bộ nhớ nhất đị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).

Những suy nghiệm 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ó một số 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 các miền con 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 sẽ nhóm các trang dựa trên trang web của các trang đó. 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 theo khoá origin (nguồn gốc) để chỉ nhóm tác nhân này 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 trên cùng một trang web sẽ bị loại trừ khỏi cụm tác nhân.

Việc phân tách chọn tham gia 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 dành riêng cho chúng. Các tài nguyên này 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ụ: những 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 tiêu đề Origin-Agent-Cluster vào trang, bạn 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 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 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 nữa. Đây là một tính năng cũ thường cho phép các trang có nhiều nguồn gốc trên cùng một trang web truy cập đồng bộ vào mỗi DOM của từng trang web 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ị vô hiệu hoá.

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

  • (Chỉ dành cho Chrome) Bạn không thể tiếp tục gửi đối tượng SharedArrayBuffer hoặc WebAssembly.Memory đến các trang khác có cùng nguồn gốc với 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 đòi hỏi hiệu suất cao, 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 iframe https://chat.example.com, thì tính năng khoá nguồn gốc https://mail.example.com/ sẽ đảm bảo rằng mã do nhóm trò chuyện viết không 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 các quy trình riêng biệt để lên lịch một cách độc lập và giảm tác động đến hiệu suất của chúng.

  • Dự kiến phải được nhúng trên các trang cùng nguồn gốc và cùng trang web, nhưng tự biết rằng sẽ cầ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 cho cuộc trò chuyện video và sẽ được nhúng vào nhiều nguồn gốc khác nhau xuyên suốt 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 về hiệu suất đối với các trình nhúng.

Ngoài ra, bạn cũng cần đảm bảo mình ổn khi tắt các hiếm khi sử dụng các tính năng giao tiếp trên nhiều nguồn gốc 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ố quan trọng về trang web và có thể cả mức sử dụng bộ nhớ để xem tác động của việc khoá nguồn gốc. (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 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 với cách ly nhiều nguồn gốc thông qua các tiêu đề Cross-Origin-Opener-PolicyCross-Origin-Embedder-Policy.

Bất kỳ trang web nào tự tách biệt nhiều nguồn gốc cũng sẽ tắt các tính năng giao tiếp trên nhiều nguồn gốc trên cùng một trang web 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 việc tách biệt nhiều nguồn gốc, như một gợi ý bổ sung cho trình duyệt để sửa đổi các suy đoán phân bổ tài nguyên. Vì vậy, 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 đã được 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 tiêu đề phản hồi HTTP sau đây:

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 "nhớ" thấy yêu cầu khoá nguồn gốc và do đó trình duyệt sẽ sử dụng khoá gốc ngay cả trên những trang không yêu cầu. 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 máy chủ gốc của bạn không muốn sử dụng 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 cho "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ó 2 trang cùng nguồn gốc được đưa vào các cụm tác nhân khác nhau, do đó không được phép giao tiếp với nhau. Điều này sẽ rất lạ, đối với cả nhà phát triển web và bộ phận bên trong trình duyệt. Vì vậy, 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 những gì đã thấy trước đâ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.

Tính 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 các thẻ, cửa sổ hoặc iframe 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. Tức là sau khi xử lý xong phương thức khoá nguồn gốc hoặc khoá trang web (do trình duyệt nhìn thấy hoặc không nhìn thấy tiêu đề), việc thay đổi tiêu đề sẽ yêu cầu bạn phải mở một thẻ hoàn toàn mới chứ không 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. Trong lần đầu thêm thẻ này vào trang web của bạn, bạn sẽ không thể tải lại trang. Bạn sẽ cần đóng thẻ này và 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. Thuộc tính 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 khoá nguồn gốc; false nếu 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 một bước kiểm tra hữu ích cho thấy bạn đã định cấu hình máy chủ đúng cách hay chưa.

Cuối cùng, hãy lưu ý rằng tiêu đề Origin-Agent-Cluster sẽ chỉ hoạt động trong 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ủ cục bộ không hỗ trợ các cụm tác nhân theo khoá nguồn gốc.

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 hoạt động truy cập đồng bộ khỏi các trang trên nhiều nguồn gốc trên cùng một trang web, nhưng cụm tác nhân 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 trước 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à gợi ý cho 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:

  • Trình duyệt có thể không triển khai công nghệ này. 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 chưa thể đặt các thẻ đó cho 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ụ: 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 tôn trọng yêu cầu mà tiêu đề Origin-Agent-Cluster chỉ ra, nhưng có thể làm như vậy bằng cách sử dụng công nghệ tách biệt khác với các quy trình. Ví dụ: Chrome đang khám phá các luồng thay vì các quy trình để 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. Điều này khiến đảm bảo tính nhất quán bắt đầu có hiệu lực 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à một 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ẽ 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).

Ý kiến 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 tiêu đề 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 ư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 được tầm quan trọng của chúng. Hãy tweet tại @ChromiumDev và cho phép 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ề quy cách hoặc thông tin chi tiết về cách hoạt động của tính năng, bạn có thể báo cáo vấn đề trên kho lưu trữ GitHub chuẩn HTML. 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 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: