J'ai cherché dans de nombreuses questions sur les cookies mais je n'ai pas trouvé de réponse à mon problème. J'ai le scénario suivant:
Un utilisateur crée une connexion sur example.com et doit obtenir un cookie mais uniquement pour le sous-domaine fuu.example. com . Je génère la partie d'en-tête HTTP suivante:
Set-Cookie: name=TestUser; Domain=fuu.example.com; Path=/; secure; HttpOnly
Mais lorsque je fais une demande à https://fuu.example.com, le cookie ne sera pas ajouté au demande. Je me demande s'il est possible que example.com installe un cookie pour fuu.example.com
. Je sais qu'il est possible que example.com définisse un cookie pour .example.com
également pour tous les sous-domaines pour example.com mais ce n'est pas ce que je veux.
Comment définir un cookie pour un sous-domaine? Je ne vois pas le cookie dans une demande au sous-domaine.
Non. Par ailleurs (voir la mise à jour ci-dessous) le le cookie serait rejeté :fuu.example.com
est une valeur Domaine non valide (elle doit commencer par un .
, c'est à dire. .fuu.example.com
)
Pour éviter d'éventuelles violations de sécurité ou de confidentialité, un agent utilisateur rejette un cookie (ne stockera pas ses informations) si l'une des conditions suivantes est vraie:
- L'hôte de demande est un nom de domaine entièrement qualifié (pas une adresse IP) et a la forme [~ # ~] hd [~ # ~], où [~ # ~ ] d [~ # ~] est la valeur de l'attribut Domaine et [~ # ~] h [~ # ~] est une chaîne qui contient un ou plusieurs points.
L'hôte de demande est example.com
et l'attribut Domaine est foo.example.com
. Mais l'hôte de demande example.com
n'a pas la forme [~ # ~] hd [~ # ~] où [~ # ~] d [~ # ~] serait foo.example.com
. Ainsi, le cookie est rejeté.
Mise à jour La spécification actuelle RFC 6265 , la RFC 2109 obsolète citée ci-dessus, ignore le point principal. Mais le domaine effectif est géré de la même manière:
[…] Si la valeur de l'attribut Domain est "
example.com
", l'agent utilisateur inclura le cookie dans l'en-tête Cookie lors de l'envoi de requêtes HTTP à example.com, www.example.com, et = www.corp.example.com. (Notez qu'un% x2E de tête (".
"), s'il est présent, est ignoré même si ce caractère n'est pas autorisé, mais un% x2E de fin (".
"), s'il est présent, obligera l'agent utilisateur à ignorer l'attribut.)[…] L'agent utilisateur acceptera un cookie avec un attribut de domaine "
example.com
"ou de"foo.example.com
"de foo.example.com, mais l'agent utilisateur n'acceptera pas un cookie avec un attribut de domaine de"bar.example.com
"ou de"baz.foo.example.com
".
Les 2 domaines example.com
et foo.example.com
ne peut partager des cookies que si le domaine est explicitement nommé dans l'en-tête Set-Cookie. Sinon, la portée du cookie est limitée à l'hôte de la demande.
Par exemple, si vous avez envoyé l'en-tête suivant à partir de foo.example.com
:
Set-Cookie: name=value
Ensuite, le cookie ne sera pas envoyé pour les demandes à example.com
. Cependant, si vous utilisez ce qui suit, il sera utilisable sur les deux domaines:
Set-Cookie: name=value; domain=example.com
Dans la RFC 2109, un domaine sans point de tête signifiait qu'il ne pouvait pas être utilisé sur des sous-domaines, et seulement un point de tête (.example.com
) permettrait de l'utiliser sur plusieurs sous-domaines.
Cependant, les navigateurs modernes respectent la nouvelle spécification RFC 6265 et ignoreront tout point de tête, ce qui signifie que vous pouvez utiliser le cookie sur les sous-domaines ainsi que le domaine de premier niveau.
En résumé , si vous définissez un cookie comme le deuxième exemple ci-dessus à partir de example.com
, il serait accessible par foo.example.com
, et vice versa.
Pour plus de détails: https://stackoverflow.com/a/23086139/5466401