web-dev-qa-db-fra.com

Quelle est généralement la date d'expiration d'un cookie de session?

J'ai besoin de créer un cookie de session en utilisant JavaScript (pour plus d'informations voir question ). Je me demande quelle devrait être la date d'expiration? Je suppose que c'est la session de navigation, donc si je ne fixe pas de date d'expiration, ce sera utilisé par défaut, non? Cette session serait utilisée pour valider un utilisateur connecté. Cela dépend-il donc de la durée pendant laquelle je souhaite que les utilisateurs restent connectés avant de les déconnecter automatiquement (si oui, quel est le bon moment, ou devrait-il s'agir de la session de navigation?)?

14
Celeritas

Je suppose que c'est la session de navigation, donc si je ne fixe pas de date d'expiration, ce sera utilisé par défaut, non?

Oui. Sauf si vous avez un besoin particulier de sessions pour survivre à un redémarrage du navigateur, omettez le paramètre expires afin que le cookie soit uniquement pour la session du navigateur et ne persiste pas sur le disque.

cela dépend-il de la durée pendant laquelle je souhaite que les utilisateurs restent connectés avant de les déconnecter automatiquement

Ceci est régi par votre heure d'expiration de session réelle, qui doit être implémentée uniquement côté serveur. Si vous utilisez une heure expires, vous voudriez généralement qu'elle soit au moins aussi longue que la temporisation côté serveur, mais vous ne devez pas vous fier au navigateur qui respecte cette expires comme méthode d'assurer que les anciennes sessions ne sont pas accessibles.

Généralement, les cookies de session uniquement (no -expires) sont utilisés pour le suivi de session, avec un dépassement de délai du côté serveur. Si une demande est faite avec un cookie non reconnu ou manquant, la session a probablement expiré côté serveur, le navigateur a été fermé côté client, ou les deux, et vous devez demander à l'utilisateur de démarrer une nouvelle session.

Généralement, il y aura un outil de gestion de session inclus dans votre infrastructure Web côté serveur, qui fonctionnera pour vous en envoyant le Set-Cookie en-têtes sur une réponse HTTP (soit la page HTML initiale, soit une réponse XMLHttpRequest). Alors que vous pourriez réimplémentez vous-même la gestion de session en utilisant uniquement JavaScript, des paramètres passés et, par exemple, localStorage comme alternative aux cookies, il ne semble pas y avoir beaucoup à gagner en réinventant cette roue.

9
bobince

Ma recommandation serait: "Ne créez pas le cookie d'authentification à l'aide de JavaScript." Un cookie identifiant une session authentifiée doit être marqué avec l'indicateur HttpOnly pour aider à atténuer les attaques XSS, et doit donc être créé par le serveur et envoyé avec la réponse, non créé sur le client.

Mis à part ce petit conseil, votre hypothèse est généralement correcte. S'il n'y a pas d'expiration définie sur le cookie, alors c'est un cookie de session et il vivra tant que le navigateur sera ouvert, et l'identifiant de session est valide. Si le serveur expire périodiquement les sessions authentifiées, le cookie ne sera plus attaché à une session sur le serveur et sera donc essentiellement nul.

Pour votre deuxième question, si vous souhaitez spécifier une durée maximale pendant laquelle un utilisateur est connecté avant de devoir se réauthentifier, cela se fait généralement avec une expiration continue, où le délai d'expiration est mis à jour à chaque demande dans x minutes à partir de maintenant , les sessions utilisateur actives ne sont donc pas expirées de force, uniquement les sessions inactives où un utilisateur n'a pas fait de nouvelle demande au cours des x dernières minutes. La façon la plus sûre de le faire est de lier la valeur du cookie à une session sur le serveur qui expire à temps, qui ne peut pas être perturbée par l'utilisateur. L'expiration du cookie n'est pas suffisante, car elle peut être modifiée par le client. Si vous devez stocker un côté client d'expiration de session, il doit être chiffré dans la valeur du cookie, donc doit à nouveau être créé côté serveur, pas par JavaScript, car le serveur doit être le seul endroit où la valeur peut être déchiffrée afin qu'il soit sécurisé.

Enfin, pour votre troisième question, quel est le délai approprié avant l'expiration d'une session? Cela dépend entièrement de votre application. Les applications financières ont souvent des délais très courts de cinq ou dix minutes. De nombreuses applications ont un délai par défaut plus traditionnel de 20 ou 30 minutes. Si le flux de travail de votre application nécessite beaucoup de temps sur une page sans rafraîchissement, un délai encore plus long peut être nécessaire. Je ne sais pas si c'est terriblement important dans tous les cas, sauf si votre application a des besoins de sécurité spécifiques.

9
Xander

Je ne suis pas un développeur Web, donc cela pourrait être faux, mais je m'attendrais à ce que vous puissiez simplement utiliser l'en-tête Set-Cookie: Dans la réponse HTTP à la requête AJAX pour définir la session biscuit.

Vous ne devriez pas avoir besoin de passer l'ID de session dans la réponse AJAX puis d'utiliser Javascript pour définir ce cookie. La norme PHP session_*() Les fonctions doivent gérer le réglage de l'heure d'expiration correctement pour vous.


Sur une note de sécurité, HTTPOnly , Secure et SSL. Vous devriez faire tout cela.

Vous devez également expirer les sessions sur le serveur à la fois lorsque l'utilisateur se déconnecte et après une certaine période d'inactivité de l'utilisateur. La période que vous choisissez est un compromis entre sécurité et convivialité. La valeur par défaut dans PHP est de 1440 minutes (24 heures).

2
Ladadadada