Cache web : le guide pour ne plus jamais dire "ça marche chez moi"

Comprendre et maîtriser le cache web n'a jamais été aussi crucial. Entre performance, SEO et contrôle de l'expérience utilisateur, une bonne stratégie de cache peut faire toute la différence... ou tout casser.

Illustration d’un entrepôt futuriste avec robots, drones et étagères “fresh” ou “stale” représentant le système de cache

Imaginez que vous corrigez un bug critique sur votre site. Vous déployez le correctif, tout semble bon... mais un utilisateur continue à voir l'ancienne version. Pire : Google indexe la page cassée. Ce scénario, frustrant mais courant, est souvent dû à une mauvaise gestion du cache web.

Le cache, c'est un peu comme la mémoire courte du web. Il sert à accélérer l'affichage des pages, à soulager les serveurs, et à améliorer l'expérience utilisateur. Mais mal maîtrisé, il peut devenir un cauchemar : pages obsolètes, SEO en berne, erreurs persistantes.

Dans cet article, on fait le tour complet, mais digeste, des mécanismes de cache à connaître en 2025 : côté client, côté serveur, via les headers HTTP ou les service workers. L'objectif : vous aider à gagner en performance sans perdre le contrôle. Let's go.

Les différents types de cache : qui fait quoi ?

Le cache navigateur (client)

C'est le premier niveau, activé via les headers HTTP Cache-ControlExpires, ou ETag. Il permet de stocker des fichiers (HTML, CSS, JS, images) dans le navigateur de l'utilisateur, pour éviter de les re-télécharger à chaque visite.

Exemple (le navigateur garde la ressource 1 jour en cache) :

Cache-Control: public, max-age=86400

Astuce : utilisez un système de versioning dans les URLs (style.v2.css) ou un hash (app.abc123.js) pour forcer un nouveau téléchargement quand nécessaire.

Le cache proxy ou reverse proxy (serveur)

Des outils comme VarnishNGINX, ou les CDN (Cloudflare, Fastly, etc.) agissent comme des intermédiaires entre l'utilisateur et le serveur d'origine. Ils peuvent stocker des pages HTML entières ou des assets.
Leur intérêt : répondre aux requêtes sans solliciter le backend.

RAM ou disque : deux types de cache serveur

Si vous gérez vous-même un serveur, la méthode de stockage du cache peut varier :

Type de cache Outil courant Vitesse Capacité Usage typique
RAM Varnish, Fastly Très rapide Limitée Réponses HTML (pages dynamiques)
Disque NGINX (proxy_cache) Moins rapide Plus grande Gros assets : images, vidéos, fonts
  • Cache RAM : les données sont gardées en mémoire vive. Très performant, mais limité par la taille disponible
  • Cache disque : les fichiers sont stockés sur le disque dur (ou SSD), ce qui est plus lent, mais adapté aux gros volumes

Exemple : une image de fond de 1 Mo n'a pas besoin d'être en RAM. Une page HTML demandée 10 fois par seconde, si.

Cache applicatif

Il est aussi possible d'utiliser des caches côté applicatif (Redis, memcached, ...) pour éviter de recalculer les mêmes données directement côté backend.

Invalidation du cache : le nerf de la guerre

Le cache est performant... tant qu'il est à jour. Invalider une ressource (c'est-à-dire la supprimer du cache ou la forcer à se mettre à jour) est souvent le point faible.

TTL et max-age

Par défaut, beaucoup de caches expirent au bout d'un temps défini. Exemple :

Cache-Control: max-age=3600

Une heure de validité pour la ressource. Mais si vous avez besoin de forcer une mise à jour immédiate, ce n'est pas suffisant.

PURGE ou BAN (Varnish, Fastly, etc)

Les reverse proxies avancés permettent de purger une ressource manuellement :

PURGE /ma-page.html HTTP/1.1

Ou mieux : utiliser une clé logique, souvent appelée xkey, pour purger plusieurs ressources en une seule commande.

C'est quoi une xkey ?
C'est un identifiant que vous pouvez attacher à plusieurs pages ou contenus liés. Par exemple : toutes les pages liées à un article (xkey: article-123) peuvent être invalidées d'un coup, sans vider tout le cache.

X-Cache-Tags: article-123, categorie-news

Pratique : on évite les purges globales, et on garde le cache chaud pour les autres pages.

Cache busting (navigateur)

Ici, l'invalidation est plus complexe, car vous n'avez pas la main sur le cache utilisateur.
Solution courante : le cache busting, via une URL versionnée ou un hash :

<script src="/js/app.abcd1234.js"></script>

Changez le nom du fichier = le navigateur le re-télécharge

Service workers : proxy côté navigateur

Depuis l'avènement des Progressive Web Apps (PWA), les service workers sont devenus un outil clé dans la gestion du cache.
C'est un script JS qui intercepte les requêtes réseau du navigateur. Il peut :

  • Servir des fichiers depuis un cache local (via l'API Cache)
  • Gérer une stratégie de cache personnalisée : cache firstnetwork firststale-while-revalidate, etc.

Exemple :

event.respondWith(
  caches.match(request).then(cached => cached || fetch(request))
);

Attention : le cache d'un service worker persiste même après un refresh. Il faut donc bien penser à le mettre à jour sur chaque déploiement.

Le header Vary : subtil, mais crucial

Le header Vary indique aux caches sur quoi varier la version stockée. En clair, il dit : “Attention, cette réponse change selon tel ou tel paramètre.”

Cas classiques

Vary: Accept-Encoding

Une version GZIP et une version Brotli peuvent coexister.

Vary: User-Agent

Permet de servir une version mobile ou desktop du même URL.

Risques

  • SEOVary: User-Agent mal utilisé peut empêcher Google d'accéder à certaines versions de vos pages.
  • Sécurité : Vary: Cookie peut générer une version du cache par session utilisateur. Résultat : surcharge mémoire et possible fuite de données.

Bon réflexe : ne variez que si c'est nécessaire, et testez l'impact avec curl -I ou WebPageTest.

Directives avancées : stale-while-revalidate et stale-if-error

Cache-Control: max-age=60, stale-while-revalidate=30, stale-if-error=300 
  • stale-while-revalidate : sert une version périmée pendant qu’une nouvelle est récupérée en arrière-plan.
  • stale-if-error : sert l’ancienne version si le serveur est en erreur.

Bonnes pratiques à appliquer en 2025

Adoptez une stratégie claire

  • Assets statiques (JS, CSS, images) : versionnés, avec Cache-Control: max-age=31536000, immutable
  • HTML : TTL court ou désactivé (no-storemust-revalidate)
  • APIs : activer ETag ou Last-Modified
  • Sécuriténo-store, private pour tout contenu sensible.
  • HTTP2 / HTTP3 : attention au multiplexage et au push, qui peuvent modifier la pertinence de certaines stratégies de cache

Contrôlez vos caches intermédiaires

  • CDN ou reverse proxy : configurez les TTL selon le type de contenu
  • Activez les PURGE, BAN, ou xkey pour invalider au bon niveau

Automatisez l'invalidation

Sur chaque déploiement, purgez les pages ou ressources concernées, ou activez des headers conditionnels :

ETag: "v1.3.5"

C'est quoi un ETag ?
Un ETag (Entity Tag) est une sorte d'empreinte (hash) du contenu. Quand un navigateur refait une requête, il peut envoyer :

If-None-Match: "v1.3.5"

Si le contenu n’a pas changé, le serveur répond 304 Not Modifiedmoins de charge, plus de rapidité.

Surveillez ce qui est vraiment caché

  • Utilisez les DevTools du navigateur (onglet Réseau -> colonne "Size" ou "From Cache")
  • Testez en ligne (Lighthouse, WebPageTest), ou avec curl -I en ligne de commande

Gérez vos service workers proprement

  • Mettez à jour le service-worker.js à chaque release (via un nom ou un hash)
  • Dans le handler activate, supprimez les anciens caches

Maîtriser le cache, c'est dompter la vitesse

Le cache n'est pas une optimisation secondaire. C'est le levier central pour garantir des performances web de haut niveau en 2025.
Mais pour qu'il fonctionne à votre avantage, il faut :

  • Le comprendre
  • Le configurer précisément
  • L'invalider intelligemment
  • Et surtout, le tester régulièrement

Parce que oui : "ça marche chez moi" n'a jamais été un indicateur fiable.
Mais avec un cache bien pensé, ça peut enfin marcher partout.

  • Administration système
  • Performance
  • Bonnes pratiques
  • SEO
  • Code Quality
Jérôme Musialak

Jérôme Musialak

CEO @ Enodo

Développeur passionné depuis l'âge de 11 ans, Jérôme a fait ses armes chez MinuteBuzz puis en tant que CTO de MeltyGroup, où il a piloté l'infrastructure technique d'une trentaine de sites à fort trafic incluant Virgin Radio, L'Étudiant, ... et les médias du groupe. Fort de cette expérience et conscient des défis récurrents rencontrés par les entreprises pour créer et diffuser efficacement leur contenu, il fonde Enodo (du latin "dénouer les nœuds") avec pour mission de simplifier l'écosystème digital. Expert en optimisation de performance et en architecture haute disponibilité, il met son obsession du détail technique au service des enjeux business pour construire des systèmes fiables qui permettent à chacun de dormir tranquille.

Sur le même thème