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.
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
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.
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
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!
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.
La mauvaise façon, à mon avis, est de définir sessionCookieName = "JSESSIONIDForHttp"
dans context.xml
Informer le cookie du navigateur:
Si la condition https
est sécurisée, utilisez la valeur par défaut "JSESSIONID"
.
Si non sécurisé, la condition http
utilise "JSESSIONIDForHttp"
.