En-tête Activate-Storage-Access
L'en-tête de réponse HTTP Activate-Storage-Access permet à un serveur d'activer une autorisation accordée pour accéder à ses cookies non partitionnés lors d'une requête inter-sites.
Le serveur s'appuie sur l'information d'état d'autorisation fournie dans l'en-tête Sec-Fetch-Storage-Access de la requête.
Ces en-têtes sont collectivement appelés en-têtes d'accès au stockage. Ils offrent une alternative efficace au fait de charger d'abord la ressource sans cookies, d'utiliser l'API d'accès au stockage pour activer l'autorisation, puis de recharger la ressource avec les cookies.
| Type d'en-tête | En-tête de requête Fetch Metadata |
|---|---|
| Nom d'en-tête interdit | Non |
| En-tête de requête sûr pour le CORS | Non |
Syntaxe
Activate-Storage-Access: retry; allowed-origin="https://toto.tata"
Activate-Storage-Access: retry; allowed-origin=*
Activate-Storage-Access: load
Directives
retry-
Demande au navigateur d'activer l'autorisation d'accès au stockage pour le contexte puis de réessayer la requête avec les cookies inclus. Le paramètre
allowed-origindoit être défini pour autoriser l'origine spécifique (définir*pour autoriser n'importe quelle origine). load-
Demande au navigateur d'activer l'autorisation d'accès au stockage pour le contexte puis de charger la ressource.
Description
L'API d'accès au stockage fournit un mécanisme JavaScript permettant à une ressource intégrée de demander l'autorisation storage-access.
Ceci permet d'envoyer des cookies tiers dans les requêtes, ce qui serait sinon bloqué par défaut dans la plupart des navigateurs.
La ressource doit d'abord être demandée sans cookies, de sorte que le serveur retourne une version non authentifiée de la ressource qui n'aura pas accès à ses propres cookies.
Après le chargement, cette ressource peut appeler Document.requestStorageAccess() avec une activation transitoire pour demander l'autorisation d'accès au stockage.
Si l'utilisateur·ice accorde l'autorisation, celle-ci est stockée par le navigateur dans une clé associée à l'intégrateur et au site intégré.
Le navigateur doit alors recharger la ressource, qu'il peut maintenant demander avec les cookies car il dispose de l'état d'autorisation active pour le contexte courant.
L'autorisation est accordée pour un couple intégrateur/site intégré particulier, mais n'est activée que pour un contexte particulier, tel qu'un <iframe> ou un onglet du navigateur.
Cela signifie que si vous chargez la même page dans un nouvel onglet ou <iframe>, l'état d'autorisation de ce contexte sera inactive ; il ne deviendra active que lorsque l'autorisation sera activée.
Le flux normal d'accès au stockage consiste à demander à nouveau la ressource sans cookies, à appeler Document.requestStorageAccess() pour activer l'autorisation existante, puis à recharger la ressource avec les cookies.
La ressource doit être chargée au moins une fois pour que l'autorisation d'accès au stockage soit accordée.
Cependant, une fois accordée, un serveur peut utiliser Activate-Storage-Access pour activer l'autorisation pour d'autres contextes.
Cela évite d'avoir à charger la ressource uniquement pour activer l'autorisation via Document.requestStorageAccess().
Le fonctionnement est le suivant :
- Le navigateur ajoute
Sec-Fetch-Storage-Access: inactiveaux requêtes lorsque le contexte dispose de l'autorisation mais qu'elle n'est pas active (ainsi que l'en-têteOriginindiquant la source de la requête). - Si le serveur reçoit
Sec-Fetch-Storage-Access: inactive, il peut répondre avecActivate-Storage-Access: retry; allowed-origin="<request_origin>"pour demander au navigateur d'activer l'autorisation pour le contexte et de réessayer la requête. - Si le navigateur reçoit la demande de réessai, il active l'autorisation et envoie à nouveau la requête, cette fois avec
Sec-Fetch-Storage-Access: activeet en incluant les cookies. - Si le serveur voit une requête avec
Sec-Fetch-Storage-Access: activeet des cookies, il répond avec la version authentifiée de la ressource. Une fois chargée par le navigateur, cette ressource a accès à ses cookies comme s'il s'agissait d'une ressource de premier niveau.
Les réponses doivent également inclure l'en-tête Vary avec Sec-Fetch-Storage-Access.
Exemples
Ces exemples montrent des requêtes avec Sec-Fetch-Storage-Access pour des contextes ayant différents états d'autorisation d'accès au stockage, et les réponses correspondantes avec Activate-Storage-Access.
Ils utilisent l'exemple d'un site, https://monsite.exemple, qui inclut un <iframe> intégrant une page de profil utilisateur, embedded.com/user/profile.
Activation d'une autorisation par le serveur
Cet exemple suppose que l'utilisateur·ice a déjà accordé l'autorisation pour le contexte, mais qu'elle n'a pas encore été activée.
(Avec l'API, on activerait l'autorisation en rechargeant la ressource afin qu'elle puisse appeler Document.requestStorageAccess().)
La requête concerne un <iframe> inter-sites avec le mode d'identifiants "include".
Le navigateur a ajouté Sec-Fetch-Storage-Access: inactive à la requête, car l'autorisation secure-access a été accordée mais pas activée.
Il n'a pas ajouté de cookies car ils sont bloqués par défaut.
L'en-tête Origin est également défini car le serveur doit connaître la source de la requête.
GET /user/profile HTTP/1.1
Host: embedded.com
Origin: https://monsite.exemple
Sec-Fetch-Dest: iframe
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-Storage-Access: inactive
Credentials-Mode: include
Le serveur répond avec Activate-Storage-Access: retry; allowed-origin="https://monsite.exemple", indiquant que le navigateur doit activer l'autorisation accordée et réessayer la requête avec les cookies.
Le serveur inclut l'en-tête Vary, car la réponse peut varier selon 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://monsite.exemple"
Le navigateur active l'autorisation et effectue une nouvelle requête.
Vous pouvez voir ci-dessous qu'il positionne Sec-Fetch-Storage-Access: active et inclut cette fois les cookies tiers.
GET /user/profile HTTP/1.1
Host: embedded.com
Origin: https://monsite.exemple
Sec-Fetch-Dest: iframe
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-Storage-Access: active
Credentials-Mode: include
Cookie: sessionid=abc123
Le serveur répond alors avec la ressource authentifiée qui inclut Activate-Storage-Access: load.
La ressource est chargée et a accès à ses cookies comme s'il s'agissait d'une inclusion de premier niveau.
HTTP/1.1 200 OK
Content-Type: text/html
Activate-Storage-Access: load
Vary: Sec-Fetch-Storage-Access
<html>
...
</html>
Autorisation secure-access initialement non accordée
Cet exemple suppose qu'il s'agit de la première fois que l'utilisateur·ice visite une page qui intègre un contenu de embedded.com, donc l'autorisation d'accès au stockage n'a pas été accordée.
Les en-têtes ne peuvent activer une autorisation que pour un contexte qui a déjà été accordé — ils ne peuvent pas être utilisés pour accorder l'autorisation d'accès au stockage à l'origine.
La page intégrée doit donc être chargée sans cookies puis appeler Document.requestStorageAccess() avec une activation transitoire pour demander l'autorisation d'accès au stockage.
C'est le même flux que si les en-têtes n'étaient pas présents.
Note : Les en-têtes sont ajoutés là où c'est approprié lorsque l'autorisation n'a pas été accordée, mais n'affectent pas matériellement le flux de messages ou le comportement du navigateur. Comme l'exemple ne démontre pas le but principal des en-têtes, nous l'avons présenté après l'exemple « déjà accordé ».
La requête est la même que dans l'exemple précédent, sauf que le navigateur a ajouté Sec-Fetch-Storage-Access: none, car l'autorisation secure-access n'a pas été accordée.
Là encore, les cookies ne sont pas ajoutés car ils sont bloqués par défaut.
GET /user/profile HTTP/1.1
Host: embedded.com
Origin: https://monsite.exemple
Sec-Fetch-Dest: iframe
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-Storage-Access: none
Credentials-Mode: include
Le serveur retourne une version non authentifiée de la ressource.
Celle-ci inclut l'en-tête Vary, car la réponse peut varier selon Sec-Fetch-Storage-Access.
Notez qu'elle n'inclut pas Activate-Storage-Access car le serveur ne peut pas activer une autorisation si aucune n'a été accordée.
HTTP/1.1 200 OK
Content-Type: text/html
Vary: Sec-Fetch-Storage-Access
<html>
...
</html>
La page intégrée appellerait alors Document.requestStorageAccess() avec une activation transitoire pour demander l'autorisation d'accès au stockage.
Si l'autorisation d'accès au stockage est accordée pour la page intégrée, elle est également activée.
Elle se rechargerait alors, ce qui donnerait la requête suivante.
Cette fois, le navigateur ajoute Sec-Fetch-Storage-Access: active et inclut les cookies tiers, reflétant l'état d'autorisation du contenu intégré.
GET /user/profile HTTP/1.1
Host: embedded.com
Origin: https://monsite.exemple
Sec-Fetch-Dest: iframe
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-Storage-Access: active
Credentials-Mode: include
Cookie: sessionid=abc123
Le serveur répond avec la version authentifiée de la ressource, qui peut être différente de la première version chargée, et ajoute l'en-tête Activate-Storage-Access: load.
Le navigateur charge la page, qui aura désormais accès à ses propres informations de cookie.
HTTP/1.1 200 OK
Content-Type: text/html
Vary: Sec-Fetch-Storage-Access
Activate-Storage-Access: load
<html>
...
</html>
Spécifications
| Specification |
|---|
| Storage Access Headers> # activate-storage-access-header> |
Compatibilité des navigateurs
Voir aussi
- L'en-tête HTTP
Sec-Fetch-Storage-Access - En-têtes d'accès au stockage dans Storage Access API
- Séquences d'en-têtes d'accès au stockage dans Storage Access API