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 tập lệnh trên toàn miền và yêu cầu các tài nguyên chuyên dụng từ trình duyệt.

Nhà há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 việc 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 nguồn gốc của bạn sẽ nhận được tài nguyên riêng, 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. Trình duyệt này được thiết kế với sự cộng tác chặt chẽ với đại diện của Mozilla Firefox, những người đã đánh dấu trình duyệt này là đáng để thử nghiệm và được đại diện của WebKit, công cụ trình duyệt mà Safari sử dụng, nhận được sự đón nhận tích cực.

Tuy nhiên, trong thời gian chờ đợi, việc triển khai tiêu đề Origin-Agent-Cluster cho tất cả người dùng hiện nay không gây ra vấn đề gì. Những trình duyệt không nhận ra giá trị này sẽ bỏ qua nó. 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ể làm ít hơn so với các cụm tác nhân theo khoá trang web (mặc định), nên không có vấn đề về khả năng tương tác cần phải lo lắng.

Lý do trình duyệt không thể tự động tách biệt các nguồn gốc trên 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ừ một nguồn gốc khác. Ví dụ: một trang được lưu trữ tại https://a.example tại một nguồn gốc khác với một trang tại https://b.example hoặc một trang tại https://sub.a.example.

Trên thực tế, các trình duyệt sử dụng tính năng phân tách mà các nguồn gốc cung cấp theo nhiều cách. Ngày nay, 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 của hệ điều hành, các quy trình và cơ chế phân bổ bộ nhớ. Điều này có nghĩa là nếu một thẻ bị chậm, tất cả các thẻ khác đều sẽ chạy chậm. Hoặc nếu một thẻ sử dụng quá nhiều bộ nhớ, thì 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 thức hoạt động chính xác của tính năng này sẽ khác nhau tuỳ theo trình duyệt: hầu hết các trình duyệt đều có một số mức phân tách giữa các thẻ, nhưng các iframe khác nhau 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ột số chi phí bộ nhớ, chúng sử dụng phỏng đoán để tránh tạo ra quá nhiều: ví dụ: Firefox có giới hạn quy 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 để bàn (nơi có nhiều bộ nhớ hơn) và thiết bị di động (nơi có bộ nhớ khan hiếm).

Những phỏng đoán này không hoàn hảo. Đồng thời, chúng chịu một hạn chế quan trọng: do có những 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 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 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 đối với một trang nhất định, đưa trang đó vào một cụm tác nhân theo khoá nguồn gốc để trang chỉ được nhóm với các trang khác có cùng nguồn gốc. Cụ thể, các trang có nhiều nguồn gốc trên 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 tham gia này cho phép các 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 tài nguyên chuyên dụng của riêng mình, tài nguyên này không kết hợp với 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 chuỗi riêng biệt. Khi thêm tiêu đề Origin-Agent-Cluster vào trang của bạn, 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 những lợi ích này, trình duyệt cần phải tắt một số tính năng cũ.

Những việc mà trang nhập theo khoá nguồn gốc không thể làm

Khi trang của bạn nằm trong cụm tác nhân theo khoá nguồn gốc, bạn sẽ từ bỏ một số khả năng để trò chuyện với các trang có nhiều nguồn gốc cùng trang web từng có. 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 nhiều nguồn gố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 sẽ bị tắt.

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

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

Trường hợp 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:

  • Hoạt động hiệu quả nhất bằng tài nguyên chuyên trách của riêng họ khi có thể. Có thể kể đến một số ví dụ như 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 có nguồn gốc 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 gốc 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 gửi thư viết, đồng thời có thể gợi ý cho trình duyệt để cung cấp cho trình duyệt các quy trình riêng để 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.

  • Google có thể sẽ nhúng các trang trên cùng trang web và có nguồn gốc khác nhau, nhưng biết rằng bản thân họ sẽ tốn nhiều tài nguyên. Ví dụ: nếu https://customerservicewidget.example.com muố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 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 rằng bạn có thể tắt các tính năng giao tiếp trên nhiều 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 rốt cuộc, đây chỉ là những nguyên tắc. Cuối cùng, việc xác định chính xác nhất việ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. Cụ thể, bạn nên đo lường Các chỉ số quan trọng về trang web và có thể là mức sử dụng bộ nhớ của bạn để xem tác động của tính năng khoá nguồn gốc. (Mức sử dụng bộ nhớ cụ thể là một mối lo ngại tiềm ẩn, vì việc tăng số lượng quy trình đang phát có thể làm tăng 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 kết quả tốt nhất.

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

Mọi trang web 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 tương tự 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 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 các 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 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 một giá trị boolean true.

Bạn cần phải gửi tiêu đề này trên tất cả câu trả lời từ nguồn gốc của bạn, chứ không chỉ trên một số trang. Nếu không, bạn có thể nhận được kết quả không nhất quán vì trình duyệt "nhớ" thấy một yêu cầu theo khoá nguồn gốc, do đó, khoá gốc sẽ xuất hiện 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 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 dùng 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ủa "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 những trang khác thì không, thì có thể bạn 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ạ đối với cả nhà phát triển web và bên trong trình duyệt. Vì vậy, thông số kỹ thuật của Origin-Agent-Cluster sẽ bỏ qua tiêu đề nếu tiêu đề không nhất quán với thông số trước đây của một nguồn gốc nhất định. Trong Chrome, thao tá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 chỉ có trong 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 đề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. Tức là sau khi thiết lập khoá nguồn gốc hoặc khoá trang web (cho trình duyệt nhìn thấy hoặc không nhìn thấy tiêu đề), thì việc thay đổi sẽ đòi hỏi bạn phải mở một thẻ hoàn toàn mới, 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 đối với việc kiểm thử tiêu đề Origin-Agent-Cluster. Khi thêm thẻ này vào trang web của mình lần đầu tiên, việc tải lại trang sẽ không hoạt động; bạn sẽ phải đó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 sử dụng thuộc tính JavaScript window.originAgentCluster. Đây sẽ là true trong các 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 quá trình 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 nhật ký dữ liệu này vào nền tảng phân tích có thể là một bước kiểm tra hữu ích để đảm bảo bạn đã định cấu hình máy chủ đúng cách.

Cuối cùng, xin lưu ý rằng tiêu đề Origin-Agent-Cluster sẽ chỉ hoạt động trên 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á 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 sẽ tách nguồn gốc khỏi quyền truy cập đồng bộ trên các trang 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 khả năng 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 trước các cuộc tấn công kênh phụ như Spectre.

Điều này có thể hơi ngạc nhiên vì khoá nguồn gốc đôi khi có thể khiến nguồn gốc nhận được quy trình riêng và các quy trình riêng biệt là biện pháp bảo vệ quan trọng 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 ý về vấn đề đó. Trình duyệt không có nghĩa vụ phải cung cấp cho nguồn gốc của bạn một quy trình riêng 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 việc đó không đáng để xử lý theo một quy trình riêng biệt. Ví dụ: trên các thiết bị Android có bộ nhớ thấp hoặc trong WebView của Android, Chrome sẽ sử dụng ít quy trình nhất có thể.

  • Có thể trình duyệt 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 quy trình. Ví dụ: Chrome đang khám phá bằng cách sử dụng các luồng thay vì các quy trình để tách biệt hiệu suất.

  • 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á theo trang web trên nguồn gốc của bạn. Điều này khiến chế độ đảm bảo tính nhất quán bắt đầu hoạt động 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ại).

Ý kiến phản hồi

Nhóm Chrome muốn được nghe ý kiến của bạn nếu bạn đang sử dụng hoặc đang cân nhắc sử dụng tiêu đề Origin-Agent-Cluster. Sự quan tâm và hỗ trợ của bạn giúp chúng tôi ưu tiên các tính năng, đồng thời cho các nhà cung cấp trình duyệt khác biết tầm quan trọng của các tính năng này. Tweet tại @ChromiumDev và để 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 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. Ngoài ra, nếu gặp bất kỳ vấn đề nào khi 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ể xem thông tin chi tiết tại các đường liên kết sau: