web-dev-qa-db-fra.com

Les cookies Chrome ne fonctionnent pas après le redémarrage du serveur Web Tomcat

J'ai remarqué récemment que lorsque je redémarre mon serveur Web Tomcat, le navigateur Chrome ne peut plus stocker de cookies. Tomcat utilise des cookies pour les sessions http et le navigateur ne peut plus obtenir sa session http. De plus, le cookie que nous utilisons pour stocker l'utilisateur connecté échoue et l'utilisateur ne reste pas connecté.

Cela semble être un nouveau problème avec Chrome. Peut-être d’une récente mise à jour, je ne me souviens pas de l’avoir vu auparavant. Si je ferme le navigateur Chrome, puis le rouvre, tout va bien de nouveau (jusqu'au redémarrage du serveur).

Le problème ne se produit pas sur Firefox, semble être un bogue dans Chrome.

Quelqu'un d'autre a-t-il remarqué ce problème ou connaît-il une solution?

J'ai trouvé des articles sur les problèmes de cookies dans Chrome/Tomcat et la suggestion de définir, SessionCookiePathUsesTrailingSlash = false dans le fichier context.xml , Mais cela ne résout pas le problème.

Il semble que cela pourrait être lié au site Web prenant en charge https et http, ainsi qu’à la permutation entre les deux (bien que cela se soit produit sur un site Web ne prenant pas également en charge le protocole https ...)

D'accord, je peux maintenant recréer le problème, les étapes sont.

  1. se connecter au site via https
  2. déconnexion/connexion
  3. se connecter au site via http
  4. Le cookie Tomcat JSESSIONID ne peut plus être stocké (curieusement, les cookies utilisateur/mot de passe sont stockés)

Cela ne se produit que sur Chrome, et seulement depuis la mise à jour de Chrome qui ajoute l'indicateur "non sécurisé" sur les pages de connexion utilisant http.

D'accord j'ai ajouté ceci à mon web.xml

<session-config>
    <cookie-config>
        <http-only>true</http-only>
        <secure>true</secure>
    </cookie-config>
</session-config>

Cela ne résout pas le problème, mais le problème se produit toujours via http, c’est-à-dire que http ne peut plus stocker le cookie JSESSIONID. J’ai essayé <secure>false</secure> mais l’obtention de l’ancien problème persiste. il est au moins lié à ce paramètre. Quelqu'un a des idées?

Problème enregistré sur Chrome, https://bugs.chromium.org/p/chromium/issues/detail?id=698741

17
James

J'ai pu reproduire votre problème avec Chrome: il suffit de créer la zone HttpSession à partir de la zone HTTPS. Toute requête HTTP ultérieure n'enverra pas le cookie de session et toute tentative de Set-Cookie:JSESSIONID= via HTTP est ignorée par chrome. 

Le problème est localisé lorsque l'utilisateur bascule de HTTPS à HTTP. Le cookie de session HTTPS est conservé même si le serveur est redémarré et fonctionne correctement. (J'ai testé avec Tomcat6, Tomcat 9 et en utilisant un proxy Apache pour SSL)

C'est l'en-tête de réponse envoyé par Tomcat lorsque la session est créée à partir de HTTPS.

 Set-Cookie: JSESSIONID=CD93A1038E89DFD39F420CE0DD460C72;path=/cookietest;Secure;HttpOnly

et celui-ci pour HTTP (la note Secure est manquante)

 Set-Cookie:SESSIONID=F909DBEEA37960ECDEA9829D336FD239;path=/cookietest;HttpOnly

Chrome ignore le deuxième set-Cookie. D'autre part, Firefox et Edge remplacent le cookie Secure par le non -secured. Pour déterminer quel est le comportement correct, j’ai examiné RFC2109

4.3.3 Gestion des cookies

Si un agent utilisateur reçoit un en-tête de réponse Set-Cookie dont le nom est identique à un cookie préexistant et dont les valeurs d'attribut Domain et Path Correspondent exactement (chaîne) correspondent à celles d'un cookie préexistant. cookie existant , le nouveau cookie remplace l'ancien.

Donc, il est clair qu'il s'agit d'un bug chromé, comme vous l'avez supposé dans la question: le cookie HTTP doit remplacer celui défini par HTTPS

La suppression manuelle du cookie dans Chrome ou l'invalidation de la session côté serveur le permet de fonctionner à nouveau (si, après ces actions, la session est créée à l'aide de HTTP)

Par défaut, le cookie JSESSIONID est créé avec Secure lorsque est demandé à HTTPS. J'imagine que c'est la raison pour laquelle Chrome ne permet pas de remplacer le cookie. Mais si vous essayez de définir <secure>false</secure> dans web.xml, Tomcat l'ignore et l'en-tête Set-Cookie est envoyé avec Secure.

<session-config>
    <cookie-config>
        <http-only>true</http-only>
        <secure>true</secure>
    </cookie-config>
</session-config>

Changer le nom du cookie, paramétrer sessionCookiePathUsesTrailingSlash ou supprimer HttpOnly n'a eu aucun effet

Je n'ai pas pu trouver de solution de contournement à ce problème, à l'exception de l'invalidation de la session du serveur lorsque l'utilisateur connecté est passé de HTTPS à HTTP. 

Enfin, j'ai ouvert un bug en chrome: https://bugs.chromium.org/p/chromium/issues/detail?id=698839


UPDATED Le problème est enfin signalé par Il ne sera pas corrigé car il s'agit d'un changement intentionnel. Voir https://www.chromestatus.com/feature/4506322921848832

Strict Secure Cookies

Cela ajoute des restrictions sur les cookies marqués de l'attribut "Sécurisé". Actuellement, les cookies sécurisés ne sont pas accessibles par des origines non sécurisées (par exemple, HTTP). Cependant, les origines non sécurisées peuvent toujours ajouter des cookies sécurisés, les supprimer ou les expulser indirectement. Cette fonctionnalité modifie le cookie afin que les origines non sécurisées ne puissent en aucune manière toucher les cookies sécurisés. Cela laisse une réserve pour l'expulsion des cookies, ce qui peut toujours entraîner la suppression des cookies sécurisés, mais uniquement après que tous les cookies non sécurisés ont été expulsés.

8
pedrofb

Je me souviens de l'avoir vu à quelques reprises et, autant que je puisse m'en souvenir, c'était la seule recommandation à ce sujet, comme vous l'avez mentionné:

Une solution possible à ce problème pourrait être d'ajouter sessionCookiePathUsesTrailingSlash=false dans le context.xml et voir comment cela se passe.

Quelques informations sur le sujet de ici

 enter image description here

Une discussion ici (même solution)

J'espère que je n'ai pas confondu les problèmes et que cela vous aide, faites-le moi savoir avec un commentaire si je dois modifier/si je travaille/si je dois supprimer, merci!

1
t1f

Il existe un draft document pour déconseiller la modification de cookies "sécurisés" d'origines non sécurisées (soumis par Google). Il spécifie les recommandations pour modifier le Mécanisme de gestion d'état HTTP document. 

Résumé du document:

Ce document met à jour la RFC6265 en supprimant la possibilité d’un non
secure Origin installe les cookies avec un indicateur de sécurité et les écrase
cookies dont l'indicateur «sécurisé» est activé. Cette dépréciation améliore la
isolement entre les origines HTTP et HTTPS et réduit le risque de
interférence malveillante.

Chrome déjà implémenté cette fonctionnalité dans la v 52 et la même fonctionnalité est également implémenté dans Mozilla quelques jours en arrière. 

Pour résoudre ce problème, je pense que vous devriez vous connecter au site Web via https uniquement.

0
skadya

La mauvaise façon, à mon avis, est de définir sessionCookieName = "JSESSIONIDForHttp" dans context.xml

Informer le cookie du navigateur:

  1. Si la condition https est sécurisée, utilisez la valeur par défaut "JSESSIONID".

  2. Si non sécurisé, la condition http utilise "JSESSIONIDForHttp".

0
巧克力