Résumé : un entête HTTP Expires: Thu, 19 Nov 1981 08:52:00 GMT
est déposé lors d'un appel à la fonction session_start() de PHP. Il s'agit d'une date symbolique (date de naissance ?) codée en dur dans le limitateur de cache de PHP. À quoi il sert, ce limitateur ? À éviter que des informations privées soient stockées dans un cache mutualisé entre plusieurs utilisateurs et fuitent (une date passée empêche la mise en cache). Quelques révisions de quelques-uns des entêtes HTTP relatifs à la mise en cache (« Cache-Control », « Expires », « Vary », « Pragma ») s'impose.
Quand je testais h2c (HTTP/2 sans chiffrement) puis quand j'essayais de comprendre l'origine des cookies déposés par Shaarli, j'ai remarqué cet étrange entête HTTP lorsque je navigue sur mon shaarli : Expires: Thu, 19 Nov 1981 08:52:00 GMT
.
Au début, j'ai pensé à un défaut dans ma configuration de la mise en cache / compression / expiration dans Apache httpd. (J'ai écrit cette configuration il y a 8-10 ans en suivant les recommandations du Hollandais Volant, vache !). Néanmoins, cet en-tête n'apparaît pas sur mon blog qui partage pourtant la même configuration. Sans compter que ma configuration calcule la date d'expiration en additionnant la durée de validité souhaitée à la date actuelle, donc elle ne peut pas être dans le passé. Mauvaise piste.
J'ai pensé que c'est le logiciel Shaarli qui dépose lui-même cet entête. grep -Ri
montrera que ce n'est pas le cas. Peut-être qu'Apache httpd positionne cet entête quand les entêtes « Cache-Control » et/ou « Pragma », eux aussi liés à la mise en cache, sont déposés (comme c'est le cas avec Shaarli) ? Aucune idée.
Je me pose, je cherche sur le web et je trouve une réponse : l'un des contributeurs à PHP a laissé sa date de naissance (ou celle d'une personne proche, on ne sait pas) dans le code. En effet, n'importe quelle date suffisamment loin dans le passé aura pour effet que les navigateurs web et les intermédiaires (comme les serveurs proxy / mandataires) ne mettront pas la page web en cache. Partant de là, autant mettre une date symbolique.
Ce n'est pas tout à fait exact, car plusieurs entêtes influent sur la mise en cache : « Pragma », « Expires », et « Cache-Control ». « Pragma » s'adresse aux clients HTTP/1.0. Le comportement qu'il actionne dépend des implémentations (source). « Expires » s'adresse aux clients web et aux intermédiaires HTTP/1.0 et 1.1. « Cache-Control » apparaît réellement avec HTTP 1.1 (source, source) et il s'adresse aux clients web et aux intermédiaires. Il a la priorité sur « Expires ». Dans le cas présent, PHP dépose aussi un entête « Cache-Control » d'où mon « ce n'est pas tout à fait exact ».
Du coup, lors d'un appel à la fonction session_start() de PHP, le limitateur de cache se met en place. En l'absence d'appel à la fonction session_cache_limiter(), il adopte le comportement défini par le paramètre de configuration (php.ini) « session.cache_limiter » (source), soit, par défaut « nocache » (source), c'est-à-dire que le navigateur web et les proxies ne doivent pas mettre en cache la page web (source). Or, on a vu, dans le code source de PHP, qu'en mode « private » et « nocache », le limitateur de cache positionne l'entête « Expires: Thu, 19 Nov 1981 08:52:00 GMT ». Tout s'explique.
Pourquoi désactiver le cache lors de l'ouverture d'une session sur un site web ? Pour limiter le risque qu'une information privée (relative à un utilisateur) se retrouve dans un cache mutualisé entre plusieurs clients web que ce soit au niveau d'un navigateur web ou d'un intermédiaire (proxy) et qu'elle fuite donc vers d'autres utilisateurs. Dans la réalité, l'entête « Vary » permet de mettre en cache des versions différentes d'une même page si des entêtes diffèrent (source). Donc, il est possible de mettre en cache en fonction d'un cookie et ainsi éviter les fuites, mais c'est jouer avec le feu : un intermédiaire peut désobéir, avoir un bug dans son code de normalisation des requêtes (qui vise à augmenter le taux de pages mises en cache en détectant les variations d'entêtes qui ont, en réalité, la même signification / effet, donc qui conduiront à la génération de la même page), etc.
On notera que d'autres logiciels déposent un entête « Expires » contenant une date symbolique. WordPress dépose un entête « Expires: Wed, 11 Jan 1984 05:00:00 GMT » quand on accède à son administration.