TATECHATLAS
◎ Français
Web et API

Comprendre les En-têtes Cache-Control pour les Réponses Publiques et Personnalisées

Ce document explique les en-têtes HTTP Cache-Control 'no-store', 'no-cache' et 'private', détaillant leurs distinctions dans le contrôle du comportement de mise en cache pour les réponses publiques et personnalisées, ainsi que les diagnostics du navigateur et les erreurs courantes.

Dans ce guide

Les en-têtes Cache-Control sont essentiels pour gérer la façon dont les navigateurs Web et les caches intermédiaires (comme les CDN) traitent les ressources Web. Ces en-têtes instruisent les caches sur la manière de stocker, de valider ou de prévenir le stockage des réponses. Décomposons les trois directives clés : 'no-store', 'no-cache' et 'private'. 'no-store' est le plus strict. Il interdit tout stockage, y compris les caches privés. Ceci est essentiel pour les données très sensibles ou les réponses uniques. Exemple : Cache-Control: no-store. 'no-cache' permet le stockage mais exige que le cache valide toujours la réponse auprès du serveur d'origine avant de l'utiliser. Ceci garantit que le navigateur reçoit la dernière version, même si le cache a une copie obsolète. Exemple : Cache-Control: no-cache. 'private' limite le stockage aux caches privés uniquement - ceux associés à un utilisateur spécifique, comme le cache local du navigateur. Ceci empêche les caches partagés de servir du contenu personnalisé à d'autres utilisateurs. Exemple : Cache-Control: private. Lors du traitement des réponses personnalisées, 'private' est primordial. Considérez un utilisateur qui se connecte à un site Web ; sa réponse doit être stockée uniquement dans son navigateur, et non dans un CDN partagé. Si une réponse contient des données personnalisées, l'utilisation de 'private' est essentielle pour empêcher la fuite d'informations. La documentation MDN souligne que ‘no-cache’ ne signifie pas “ne pas mettre en cache”. Cela signifie “toujours valider avant de réutiliser”. La directive 'no-cache' ne garantit pas la validation pour les navigations dans l'historique. De plus, la directive 'max-age' spécifie pendant combien de temps une réponse est considérée comme fraîche. Une valeur de 0 signifie que la réponse doit toujours être validée. La directive 'immutable' empêche le stockage, même si max-age est défini, garantissant que le navigateur demande toujours la dernière version de la ressource. Lors de l'inspection des en-têtes de requête du navigateur, vous verrez les directives Cache-Control influencer le comportement de mise en cache. Par exemple, une requête pour un actif public peut avoir Cache-Control : public max-age=3600, indiquant qu'elle peut être mise en cache pendant une heure. Une requête pour un profil privé peut avoir Cache-Control : private no-cache, garantissant que seul le cache de l'utilisateur peut le stocker et qu'il doit être validé avant réutilisation. Les diagnostics du navigateur peuvent révéler si une réponse est mise en cache et comment. Des outils tels que les outils de développement du navigateur (généralement accessibles en appuyant sur F12) permettent de surveiller les requêtes réseau et d'examiner les en-têtes Cache-Control. Les erreurs courantes incluent l'oubli de définir 'private' pour les réponses personnalisées, ce qui peut entraîner des fuites de données potentielles. Une autre erreur est de se fier uniquement à 'no-store' lorsqu'une approche plus nuancée est nécessaire - parfois, permettre la mise en cache avec validation est préférable. Les critères de décision doivent être basés sur la sensibilité des données et le comportement de mise en cache souhaité. Enfin, gardez à l'esprit que Cache-Control n'est pas une limite d'autorisation ; 'no-cache' ne signifie pas 'pas de stockage'. Les limites d'étendue sont déterminées par les en-têtes spécifiques utilisés et les politiques de mise en cache mises en œuvre par les navigateurs et les caches intermédiaires.

Séparer le stockage de la réutilisation

La mise en cache est une technique fondamentale pour améliorer les performances du Web, mais il est crucial de comprendre comment elle interagit avec la sensibilité des données. Le concept clé est de distinguer entre le stockage d'une réponse et la réutilisation d'une réponse stockée. Un cache peut stocker une réponse, mais il doit la valider avant de la réutiliser. 'no-store' empêche à la fois le stockage et la réutilisation, garantissant que la réponse ne quitte jamais le navigateur de l'utilisateur. 'no-cache' permet le stockage mais exige une validation avant la réutilisation, garantissant que le navigateur reçoit toujours la dernière version. 'private' limite le stockage aux caches privés, empêchant les caches partagés de servir du contenu personnalisé à d'autres utilisateurs.

Considérez un scénario où un utilisateur se connecte. La réponse contenant ses données de profil personnalisées doit être traitée comme privée. Sans 'private', un cache partagé pourrait servir ces données à d'autres utilisateurs, compromettant leur vie privée. La documentation MDN souligne que ‘no-cache’ ne signifie pas “ne pas mettre en cache”. Cela signifie “toujours valider avant de réutiliser.”

Comprendre no-store

L'en-tête Cache-Control: no-store est le plus restrictif. Il indique à tous les caches - les caches privés et partagés - de ne pas stocker la réponse du tout. Ceci est le choix approprié pour les données très sensibles, les réponses uniques ou le contenu qui ne doit jamais être réutilisé. Ceci désactive efficacement la mise en cache pour la ressource spécifiée.

Exemple : Cache-Control: no-store empêcherait tout cache de stocker la réponse, quel que soit le fait qu'il s'agisse d'un cache de navigateur ou d'un cache CDN. Ceci est essentiel pour empêcher l'accès non autorisé à des informations sensibles.

Comprendre no-cache

L'en-tête Cache-Control: no-cache permet la mise en cache, mais il exige toujours que le cache valide la réponse auprès du serveur d'origine avant de l'utiliser. Ceci garantit que le navigateur reçoit la dernière version de la ressource, même si le cache a une copie obsolète. Il s'agit d'un équilibre entre les performances et la fraîcheur des données.

Cette directive ne signifie pas “ne pas mettre en cache” ; cela signifie “toujours valider avant de réutiliser”. Le navigateur effectuera toujours une requête au serveur pour vérifier si la copie mise en cache est toujours valide. Ceci est particulièrement utile pour les ressources qui peuvent changer fréquemment, telles que le contenu dynamique.

Comprendre private

L'en-tête Cache-Control: private limite le stockage aux caches privés uniquement - ceux associés à un utilisateur spécifique, comme le cache local du navigateur. Ceci empêche les caches partagés de servir du contenu personnalisé à d'autres utilisateurs. Il s'agit d'un élément essentiel pour protéger la vie privée des utilisateurs.

Lorsqu'une réponse contient des données personnalisées, l'utilisation de 'private' est cruciale. Sans cela, un cache partagé pourrait servir la même réponse à plusieurs utilisateurs, exposant potentiellement leurs informations personnelles. La documentation MDN note que ‘private’ est particulièrement important pour les réponses reçues après la connexion.

Comparer trois politiques de réponse

Voici un tableau résumant les principales différences entre les trois directives :

| Directive | Stockage | Validation | Portée |

| --------- | ------- | ---------- | ----------- |

| no-store | Non | N/A | Tous les caches |

| no-cache | Oui | Toujours | Tous les caches |

| private | Oui | Toujours | Caches privés |

Inspecter une requête du navigateur

En utilisant les outils de développement de votre navigateur (généralement accessibles en appuyant sur F12), vous pouvez inspecter les en-têtes Cache-Control des requêtes réseau. Recherchez l'onglet 'Headers' dans le panneau Réseau. Cela vous montrera les en-têtes exacts envoyés par le navigateur, y compris les directives Cache-Control.

Par exemple, si vous consultez une page avec un profil personnalisé, vous devriez voir Cache-Control: private no-cache dans les en-têtes de la requête. Ceci indique que le navigateur demande que la réponse soit stockée uniquement dans son cache local et qu'elle doit être validée avec le serveur avant réutilisation.

Gérer les réponses personnalisées

Les réponses personnalisées - celles contenant des données spécifiques à l'utilisateur telles que les informations de connexion, les préférences ou le contenu du panier d'achat - nécessitent une attention particulière aux en-têtes Cache-Control. Utilisez toujours Cache-Control: private pour empêcher les caches partagés de servir ces données à d'autres utilisateurs.

Ne pas le faire peut entraîner des violations graves de la vie privée et des vulnérabilités de sécurité. La documentation MDN recommande explicitement d'utiliser 'private' pour le contenu personnalisé de l'utilisateur.

Reconnaître l'éviction et les limites héritées

Il est important de reconnaître que même avec 'no-cache', le cache d'historique du navigateur (bfcache) peut toujours servir une réponse mise en cache sans validation. Il s'agit d'un comportement hérité conçu pour restaurer les sessions précédentes et n'est pas contrôlé par l'en-tête Cache-Control.

De plus, les caches HTTP/1.0 peuvent ne pas prendre entièrement en charge l'en-tête 'no-cache', ce qui peut entraîner l'utilisation de copies obsolètes en raison de la mise en cache. L'utilisation de 'max-age=0, must-revalidate' comme solution de contournement peut résoudre ce problème, mais il est préférable d'utiliser 'no-cache' chaque fois que possible.

Points à vérifier

  • Le comportement de la mise en cache dépend de la requête/réponse et des intermédiaires.
  • Cache-Control n'est pas une limite d'autorisation ; no-cache ne signifie pas pas de stockage.
  • L'en-tête 'private' empêche la mise en cache partagée du contenu personnalisé.
  • L'en-tête 'no-store' empêche toute mise en cache.
  • L'en-tête 'no-cache' exige une validation avant la réutilisation.
  • Les outils de développement du navigateur peuvent être utilisés pour inspecter les en-têtes Cache-Control.
  • La compréhension des différences entre les caches privés et partagés est cruciale.
  • Le comportement d'éviction hérité (bfcache) peut contourner les directives Cache-Control.
  • Les caches HTTP/1.0 peuvent ne pas prendre entièrement en charge 'no-cache'.

Ces en-têtes fournissent un mécanisme pour contrôler le comportement de la mise en cache, mais ils ne garantissent pas une protection complète contre la mise en cache ou les fuites d'informations. Les implémentations des navigateurs et les caches intermédiaires peuvent se comporter différemment, et les utilisateurs peuvent outrepasser les paramètres de mise en cache. De plus, l'en-tête 'no-cache' ne garantit pas la validation pour les navigations dans l'historique.

Sources

  1. MDN: Cache-Control directives ↗
  2. MDN: HTTP caching guide ↗
Retour en haut ↑