Tải tài nguyên nhiều nguồn gốc mà không có tiêu đề CORP bằng COEP: không có thông tin xác thực

Tài nguyên trên nhiều nguồn gốc do các bên thứ ba phân phát thường không có đầy đủ các tiêu đề CORP. Nếu có thể yêu cầu chúng mà không cần thông tin xác thực, thì giờ đây, bạn có thể bật tính năng tách biệt nhiều nguồn gốc bằng cách đánh dấu chúng.

Chúng tôi đã chuyển giá trị credentialless của Chính sách tài nguyên nhúng trên nhiều nguồn gốc (COEP) mới. Giá trị này cho phép trình duyệt tải các tài nguyên trên nhiều nguồn gốc không sử dụng Chính sách tài nguyên trên nhiều nguồn gốc (CORP), bằng cách gửi yêu cầu mà không cần thông tin xác thực, chẳng hạn như cookie. Điều này giúp nhà phát triển sử dụng tính năng tách biệt nhiều nguồn gốc dễ dàng hơn.

Lý do chúng ta cần tách biệt nhiều nguồn gốc

Một số API web làm tăng nguy cơ bị tấn công kênh bên, chẳng hạn như Spectre. Để giảm thiểu rủi ro đó, các trình duyệt cung cấp một môi trường tách biệt dựa trên lựa chọn tham gia có tên là cách ly nhiều nguồn gốc. Khi ở trạng thái tách biệt nhiều nguồn gốc, trang web có thể sử dụng các tính năng đặc quyền bao gồm SharedArrayBuffer, performance.measureUserAgentSpecificMemory()đồng hồ hẹn giờ có độ chính xác cao với độ phân giải cao hơn, đồng thời tách biệt nguồn gốc với các tính năng khác trừ phi bạn chọn sử dụng.

Trang web phải gửi hai tiêu đề HTTP để bật tính năng tách biệt nhiều nguồn gốc:

Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin

Khi ở trạng thái tách biệt nhiều nguồn gốc, tất cả tài nguyên trên nhiều nguồn gốc phải được phân phát bằng CORS hoặc đặt tiêu đề Cross-Origin-Resource-Policy để được tải.

Những thách thức khi bật tính năng tách biệt nhiều nguồn gốc

Mặc dù việc tách biệt nhiều nguồn gốc mang lại cho trang web khả năng bảo mật tốt hơn và khả năng hỗ trợ các tính năng mạnh mẽ, nhưng việc triển khai tính năng này có thể khó. Một trong những thách thức lớn nhất là yêu cầu phải bật CORS hoặc CORP cho tất cả tài nguyên nhiều nguồn gốc. Trình duyệt sẽ không tải các tài nguyên không có những tiêu đề đó trên một trang được tách biệt nhiều nguồn gốc.

Các tài nguyên nhiều nguồn gốc này thường do các bên thứ ba phân phát. Họ có thể không dễ dàng thêm các tiêu đề cần thiết.

Nhưng nếu chúng ta biết tài nguyên đủ an toàn để tải thì sao? Trên thực tế, tài nguyên duy nhất gặp rủi ro là những tài nguyên được yêu cầu có thông tin xác thực, vì các tài nguyên đó có thể chứa thông tin nhạy cảm mà kẻ tấn công không thể tự tải. Tức là các tài nguyên có thể được yêu cầu mà không cần thông tin xác thực sẽ có sẵn công khai và an toàn để tải.

credentialless đến nơi giải cứu

Đây là lúc COEP: credentialless phát huy tác dụng. credentialless là một giá trị mới cho tiêu đề Cross-Origin-Embedder-Policy. Tương tự như require-corp, tệp này có thể bật tính năng tách biệt nhiều nguồn gốc, nhưng thay vì đòi hỏi tiêu đề CORP:cross-origin cho các yêu cầu không có nguồn gốc, các yêu cầu này được gửi mà không cần thông tin xác thực (ví dụ: cookie).

Bạn có thể bật tính năng tách biệt nhiều nguồn gốc bằng hai tiêu đề sau:

Cross-Origin-Embedder-Policy: credentialless
Cross-Origin-Opener-Policy: same-origin

Điều này có nghĩa là máy chủ nhiều nguồn gốc được yêu cầu sẽ không thể phản hồi bằng một tài nguyên nhạy cảm và người yêu cầu luôn có thể giả định rằng phản hồi chỉ chứa thông tin có sẵn công khai.

Việc này cũng phù hợp với kế hoạch loại bỏ cookie của bên thứ ba của trình duyệt.

Bản minh hoạ

Bạn có thể thử nhiều lựa chọn tiêu đề trong bản minh hoạ này: https://cross-origin-isolation.glitch.me

Câu hỏi thường gặp

Tôi có thể gửi yêu cầu được xác thực trong môi trường credentialless không?

Tuyệt đối, với cái giá là phải thay đổi chế độ của yêu cầu để yêu cầu kiểm tra CORS đối với phản hồi. Đối với các thẻ HTML như <audio>, <img>, <link>, <script><video>, bạn chỉ cần thêm crossorigin="use-credentials" một cách rõ ràng để thông báo cho trình duyệt biết cần gửi các yêu cầu đã được xác thực.

Ví dụ: ngay cả khi tài liệu trên https://www.example.com có tiêu đề Cross-Origin-Embedder-Policy: credentialless, <img src="https://images.example.com/avatar.png" crossorigin="use-credentials"> vẫn sẽ gửi yêu cầu đã được xác thực.

Đối với API fetch(), bạn có thể sử dụng request.mode = 'cors'.

Nếu cung cấp COEP: credentialless, COEP: require-corp vẫn hữu ích như thế nào cho trang web của tôi?

COEP: require-corp không đòi hỏi bạn phải chuyển chế độ yêu cầu sang ChromeOS theo cách thủ công nếu cần cookie cho một số tài nguyên phụ trên nhiều nguồn gốc.

Tôi có thể tải các iframe nhiều nguồn gốc mà không cần tiêu đề đặc biệt trong môi trường credentialless không?

Không. Việc tải các iframe nhiều nguồn gốc trong môi trường credentialless vẫn yêu cầu các điều kiện tương tự như require-corp. Tài liệu iframe cần được phân phát với 2 tiêu đề:

  • Cross-Origin-Embedder-Policy: credentialless (hoặc require-corp)
  • Cross-Origin-Resource-Policy: cross-origin

Tin vui là hiện có một cuộc thảo luận liên tục về việc cho phép tải các iframe nhiều nguồn gốc mà không cần các tiêu đề đó bằng cách cung cấp các iframe crossorigin="anonymous". Việc này sẽ cho phép tải các iframe nhiều nguồn gốc mà không cần tiêu đề nhưng không cần thông tin xác thực.

Các trình duyệt khác có áp dụng tính năng này không?

Nội dung sắp tới

Chúng tôi sẽ chia sẻ thêm hai nội dung cập nhật sau đây để giảm thiểu những thách thức khác liên quan đến việc tách biệt nhiều nguồn gốc:

Những người đã đăng ký bản dùng thử theo nguyên gốc Chrome để gia hạn thay đổi cho SharedArrayBuffer do những trở ngại nêu trên có thể muốn biết khi nào gói dùng thử sẽ bị chấm dứt. Ban đầu, chúng tôi thông báo rằng dịch vụ này sẽ bị chấm dứt trong Chrome 96, nhưng chúng tôi đã quyết định hoãn lại việc này đối với Chrome 106.

Tài nguyên

Ảnh chụp của Martin Adams trên Unsplash