Activate-Storage-Access header
Tiêu đề HTTP Activate-Storage-Access response header cho phép máy chủ kích hoạt quyền đã được cấp để truy cập cookie không được phân vùng trong một yêu cầu đa trang.
Máy chủ dựa vào thông tin trạng thái quyền được cung cấp trong tiêu đề Sec-Fetch-Storage-Access của yêu cầu.
Các tiêu đề này được gọi chung là tiêu đề truy cập lưu trữ. Chúng cung cấp giải pháp thay thế hiệu quả cho việc đầu tiên tải tài nguyên không có cookie, sử dụng Storage Access API để kích hoạt quyền, sau đó tải lại tài nguyên với cookie.
| Loại tiêu đề | Fetch Metadata Request Header |
|---|---|
| Forbidden request header | Không |
| CORS-safelisted request header | Không |
Cú pháp
Activate-Storage-Access: retry; allowed-origin="https://foo.bar"
Activate-Storage-Access: retry; allowed-origin=*
Activate-Storage-Access: load
Chỉ thị
retry-
Máy chủ sử dụng token này để chỉ ra rằng nó cần cookie của bên thứ ba để phản hồi đúng yêu cầu này.
Máy chủ nên kiểm tra
Sec-Fetch-Storage-Access: inactivetrong yêu cầu trước khi phản hồi với token này để xác nhận rằng quyền đã được cấp (nhưng không hoạt động). Tham sốallowed-originphải được chỉ định để cho phép nguồn gốc cụ thể (chỉ định*để cho phép bất kỳ nguồn gốc nào).Trình duyệt nên phản hồi bằng cách kích hoạt quyền truy cập lưu trữ đã được cấp, và thử lại yêu cầu với cookie không được phân vùng được đưa vào.
load-
Máy chủ sử dụng token này để chỉ ra rằng nó đang gửi cho trình duyệt một tài liệu HTML cần kích hoạt cấp quyền
storage-accessđã có sẵn — để truy cập cookie không được phân vùng trong khi tải.Máy chủ nên kiểm tra
Sec-Fetch-Storage-Access: inactivehoặcSec-Fetch-Storage-Access: activetrong yêu cầu trước khi phản hồi vớiloadđể xác nhận rằng quyền đã được cấp.Trình duyệt nên phản hồi bằng cách tải tài nguyên và cấp cho nó quyền truy cập vào cookie không được phân vùng của nó.
Mô tả
Storage Access API cung cấp cơ chế JavaScript để cho phép tài nguyên nhúng yêu cầu quyền storage-access.
Điều này cho phép gửi cookie của bên thứ ba trong các yêu cầu, điều này theo mặc định sẽ bị chặn trong hầu hết các trình duyệt.
Tài nguyên trước tiên phải được yêu cầu không có cookie, vì vậy máy chủ trả về phiên bản không có thông tin đăng nhập của tài nguyên sẽ không có quyền truy cập vào cookie của chính nó.
Sau khi tải, tài nguyên này có thể gọi Document.requestStorageAccess() với transient activation để yêu cầu quyền storage-access.
Nếu được người dùng cấp, quyền được trình duyệt lưu trữ trong một khóa liên kết với embedder và embedded site.
Trình duyệt sau đó phải tải lại tài nguyên, hiện có thể yêu cầu với cookie vì nó có trạng thái quyền active cho ngữ cảnh hiện tại.
Quyền được cấp cho một cặp embedder/embedded site cụ thể, nhưng chỉ được kích hoạt cho một nguồn gốc cụ thể, và cho một ngữ cảnh cụ thể chẳng hạn như <iframe> hoặc tab trình duyệt.
Điều này có nghĩa là nếu bạn tải cùng một trang trong một tab mới hoặc <iframe>, trạng thái quyền của ngữ cảnh đó sẽ được cấp nhưng inactive; nó sẽ không trở thành active cho đến khi quyền được kích hoạt.
Tương tự, nếu bạn tải một nguồn gốc khác trong cùng một trang web, quyền sẽ được cấp nhưng bạn sẽ cần kích hoạt quyền để cookie của bên thứ ba được gửi hoặc tải cho tài nguyên đó.
Tài nguyên phải được tải ít nhất một lần để được cấp quyền storage-access.
Tuy nhiên, một khi đã được cấp, máy chủ có thể sử dụng Activate-Storage-Access để kích hoạt quyền cho các nguồn gốc và ngữ cảnh khác.
Cách thức hoạt động là:
- Trình duyệt thêm
Sec-Fetch-Storage-Access: inactivevào các yêu cầu khi ngữ cảnh có quyền nhưng nó không hoạt động (cùng với tiêu đềOriginchỉ ra nguồn của yêu cầu). - Nếu máy chủ nhận được
Sec-Fetch-Storage-Access: inactivenó có thể phản hồi vớiActivate-Storage-Access: retry; allowed-origin="<request_origin>"để yêu cầu trình duyệt kích hoạt quyền cho ngữ cảnh và thử lại yêu cầu. - Nếu trình duyệt nhận được yêu cầu thử lại, nó kích hoạt quyền và gửi yêu cầu lại, lần này với
Sec-Fetch-Storage-Access: activevà bao gồm cookie. - Nếu máy chủ thấy một yêu cầu với
Sec-Fetch-Storage-Access: activevà cookie, nó phản hồi với phiên bản có thông tin đăng nhập của tài nguyên. Một khi được trình duyệt tải, tài nguyên này có quyền truy cập vào cookie của nó như thể nó là tài nguyên của bên thứ nhất.
Phản hồi cũng phải bao gồm tiêu đề Vary với Sec-Fetch-Storage-Access.
Note:
Cũng có thể (nhưng kém hiệu quả hơn) kích hoạt quyền bằng cách tải tài nguyên và gọi Document.requestStorageAccess().
Ví dụ
Các ví dụ này hiển thị các yêu cầu với Sec-Fetch-Storage-Access cho các ngữ cảnh có trạng thái quyền truy cập lưu trữ khác nhau, và các phản hồi tương ứng với Activate-Storage-Access.
Chúng sử dụng ví dụ của một trang web, https://mysite.example, bao gồm một <iframe> nhúng một trang hồ sơ người dùng, embedded.com/user/profile.
Máy chủ kích hoạt quyền
Ví dụ này giả sử rằng người dùng đã cấp quyền cho ngữ cảnh, nhưng nó chưa được kích hoạt.
(Với API, chúng ta sẽ kích hoạt quyền bằng cách tải lại tài nguyên để nó có thể gọi Document.requestStorageAccess().)
Yêu cầu là cho một <iframe> đa trang với chế độ thông tin đăng nhập "include".
Trình duyệt đã thêm Sec-Fetch-Storage-Access: inactive vào yêu cầu, vì quyền secure-access đã được cấp nhưng chưa được kích hoạt.
Nó không thêm cookie vì chúng bị chặn theo mặc định.
Origin cũng được đặt vì máy chủ cần biết nguồn gốc của yêu cầu.
GET /user/profile HTTP/1.1
Host: embedded.com
Origin: https://mysite.example
Sec-Fetch-Dest: iframe
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-Storage-Access: inactive
Credentials-Mode: include
Máy chủ phản hồi với Activate-Storage-Access: retry; allowed-origin="https://mysite.example", chỉ ra rằng trình duyệt nên kích hoạt quyền đã được cấp và thử lại yêu cầu với cookie.
Máy chủ bao gồm tiêu đề Vary, vì phản hồi có thể thay đổi với Sec-Fetch-Storage-Access.
HTTP/1.1 401 Unauthorized
Content-Type: text/html
Vary: Sec-Fetch-Storage-Access
Activate-Storage-Access: retry; allowed-origin="https://mysite.example"
Trình duyệt kích hoạt quyền và thực hiện một yêu cầu mới.
Bên dưới bạn có thể thấy rằng nó đặt Sec-Fetch-Storage-Access: active và lần này bao gồm cookie của bên thứ ba.
GET /user/profile HTTP/1.1
Host: embedded.com
Origin: https://mysite.example
Sec-Fetch-Dest: iframe
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-Storage-Access: active
Credentials-Mode: include
Cookie: sessionid=abc123
Máy chủ sau đó phản hồi với tài nguyên có thông tin đăng nhập bao gồm Activate-Storage-Access: load.
Tài nguyên được tải và có quyền truy cập vào cookie của nó như thể nó là tài nguyên nhúng của bên thứ nhất.
HTTP/1.1 200 OK
Content-Type: text/html
Activate-Storage-Access: load
Vary: Sec-Fetch-Storage-Access
<html>
...
</html>
Quyền secure-access ban đầu không được cấp
Ví dụ này giả sử đây là lần đầu tiên người dùng truy cập một trang nhúng bất kỳ thứ gì từ embedded.com, vì vậy quyền truy cập lưu trữ chưa được cấp.
Các tiêu đề chỉ có thể kích hoạt quyền cho một ngữ cảnh đã được cấp — chúng không thể được sử dụng để cấp quyền storage-access ngay từ đầu.
Trang nhúng vì vậy phải được tải không có cookie và sau đó gọi Document.requestStorageAccess() với transient activation để yêu cầu quyền storage-access.
Đây là luồng tương tự như khi các tiêu đề không có mặt.
Note: Các tiêu đề được thêm vào nơi thích hợp khi quyền chưa được cấp, nhưng không ảnh hưởng đến luồng thông điệp hoặc hành vi trình duyệt. Vì ví dụ không minh họa mục đích chính của các tiêu đề, chúng tôi đã trình bày nó sau ví dụ "đã được cấp".
Yêu cầu tương tự như trong ví dụ trước ngoại trừ trình duyệt đã thêm Sec-Fetch-Storage-Access: none, vì quyền secure-access chưa được cấp.
Một lần nữa, cookie không được thêm vì chúng bị chặn theo mặc định.
GET /user/profile HTTP/1.1
Host: embedded.com
Origin: https://mysite.example
Sec-Fetch-Dest: iframe
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-Storage-Access: none
Credentials-Mode: include
Máy chủ trả về phiên bản không có thông tin đăng nhập của tài nguyên.
Điều này bao gồm tiêu đề Vary, vì phản hồi có thể thay đổi với Sec-Fetch-Storage-Access.
Lưu ý rằng nó không bao gồm Activate-Storage-Access vì máy chủ không thể kích hoạt quyền nếu không có quyền nào được cấp.
HTTP/1.1 200 OK
Content-Type: text/html
Vary: Sec-Fetch-Storage-Access
<html>
...
</html>
Trang nhúng sau đó sẽ gọi Document.requestStorageAccess() với transient activation để yêu cầu quyền storage-access.
Nếu quyền storage-access được cấp cho trang nhúng, nó cũng được kích hoạt.
Sau đó nó sẽ tải lại chính nó, dẫn đến yêu cầu sau.
Lần này trình duyệt thêm Sec-Fetch-Storage-Access: active và bao gồm cookie của bên thứ ba, phản ánh trạng thái quyền của nội dung nhúng.
GET /user/profile HTTP/1.1
Host: embedded.com
Origin: https://mysite.example
Sec-Fetch-Dest: iframe
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-Storage-Access: active
Credentials-Mode: include
Cookie: sessionid=abc123
Máy chủ phản hồi với phiên bản có thông tin đăng nhập của tài nguyên, có thể khác với phiên bản đầu tiên được tải, và thêm tiêu đề Activate-Storage-Access: load.
Trình duyệt tải trang, bây giờ sẽ có quyền truy cập vào thông tin cookie của chính nó.
HTTP/1.1 200 OK
Content-Type: text/html
Vary: Sec-Fetch-Storage-Access
Activate-Storage-Access: load
<html>
...
</html>
Thông số kỹ thuật
| Specification |
|---|
| Storage Access Headers> # activate-storage-access-header> |
Khả năng tương thích trình duyệt
Xem thêm
Sec-Fetch-Storage-Access- Tiêu đề truy cập lưu trữ trong Storage Access API
- Trình tự tiêu đề truy cập lưu trữ trong Storage Access API