Les applications web modernes dépendent fortement de la capacité à stocker des données côté client. Qu'il s'agisse de préférences utilisateur, de jetons d'authentification, de données en cache, du contenu d'un panier d'achat ou d'ébauches de formulaires, les navigateurs mettent à disposition diverses méthodes de persistance. Chaque mécanisme possède ses propres spécificités, et une mauvaise sélection peut entraîner des problèmes de performance, des failles de sécurité ou une perte de données précieuses.

Aperçu Comparatif

Options de Stockage en un coup d'œil
Caractéristique    localStorage    sessionStorage   Cookies          IndexedDB
──────────────────────────────────────────────────────────────────────────────
Capacité           5-10 Mo         5-10 Mo          ~4 Ko/cookie     100Mo+
Persistance        Permanent       Durée de l'onglet Configurable     Permanent
Envoyé au serveur  Non             Non              Oui (chaque req) Non
Accès              JS synchrone    JS synchrone     JS + HTTP        JS asynchrone
Format des données Chaîne          Chaîne           Chaîne           Tout (objets)
Cas d'utilisation  Préférences     État temporaire  Jetons d'authent. Grands ensembles

localStorage

Le localStorage permet de stocker des paires clé-valeur de manière persistante, sans date d'expiration. Les données y demeurent disponibles d'une session à l'autre, jusqu'à ce qu'elles soient explicitement supprimées par l'utilisateur via les paramètres du navigateur, ou par votre propre code JavaScript.

API localStorage
// Stocker des données (chaînes de caractères uniquement)
localStorage.setItem('theme', 'dark');
localStorage.setItem('user', JSON.stringify({ name: 'Alice', id: 123 }));

// Récupérer des données
const theme = localStorage.getItem('theme'); // "dark"
const user = JSON.parse(localStorage.getItem('user'));

// Supprimer un élément spécifique
localStorage.removeItem('theme');

// Effacer toutes les données
localStorage.clear();

// Vérifier l'utilisation du stockage
const used = new Blob(Object.values(localStorage)).size;
console.log(`${(used / 1024).toFixed(1)} KB utilisés`);

Idéal pour : Préférences de thème, choix de langue, état de l'interface utilisateur (barre latérale ouverte/fermée), ou tout paramètre non sensible qui doit persister.

⚠️ Ne jamais stocker : Les jetons d'authentification, mots de passe, ou toute donnée confidentielle. Le localStorage est directement accessible à tout script JavaScript exécuté sur la page, y compris ceux potentiellement injectés via des attaques XSS.

sessionStorage

L'API de sessionStorage est en tous points identique à celle de localStorage, mais sa portée est limitée à l'onglet du navigateur en cours. Les données stockées sont automatiquement effacées dès que l'onglet est fermé, ou en cas de crash du navigateur.

Cas d'utilisation de sessionStorage
// Stocker les données de formulaire (récupérables en cas de navigation accidentelle)
const formData = { name: nameInput.value, email: emailInput.value };
sessionStorage.setItem('formDraft', JSON.stringify(formData));

// Restaurer au chargement de la page
window.addEventListener('load', () => {
  const draft = sessionStorage.getItem('formDraft');
  if (draft) {
    const { name, email } = JSON.parse(draft);
    nameInput.value = name;
    emailInput.value = email;
  }
});

Idéal pour : Données de formulaires multi-étapes, états temporaires de "wizards", données spécifiques à un onglet qui ne devraient pas être partagées entre plusieurs instances.

Cookies

Mécanisme de stockage le plus ancien et le plus familier, les cookies se distinguent par une caractéristique cruciale : ils sont transmis au serveur avec chaque requête HTTP. Cette propriété les rend indispensables pour l'authentification et la gestion de sessions, mais totalement inadaptés au stockage de volumes importants de données.

Configuration Sécurisée des Cookies
// Définition d'un cookie (côté serveur — Express.js)
res.cookie('session_id', 'abc123', {
  httpOnly: true,   // JavaScript ne peut pas accéder à ce cookie (protection XSS)
  secure: true,     // Envoyé uniquement via HTTPS
  sameSite: 'Lax',  // Protection CSRF
  maxAge: 86400000, // Expire dans 24 heures (millisecondes)
  path: '/',
});

// Définition d'un cookie (côté client JavaScript)
document.cookie = "theme=dark; path=/; max-age=31536000; SameSite=Lax";

// Lecture des cookies (côté client) — API peu pratique
const theme = document.cookie
  .split('; ')
  .find(row => row.startsWith('theme='))
  ?.split('=')[1]; // "dark"

Idéal pour : IDs de session, jetons d'authentification (avec les attributs httpOnly, secure et sameSite configurés correctement).

⚠️ Attributs importants des cookies :

  • httpOnly — Empêche l'accès du cookie par JavaScript, protégeant ainsi contre le vol de jetons par XSS.
  • secure — Garantit que le cookie n'est envoyé qu'avec des requêtes HTTPS.
  • sameSite=Lax|Strict — Offre une protection contre les attaques CSRF (Cross-Site Request Forgery).

IndexedDB

IndexedDB est une véritable base de données NoSQL côté client, intégrée au navigateur. Il permet de stocker des données structurées (objets JavaScript, fichiers, BLOBs) et de les indexer pour des requêtes complexes. Son API est entièrement asynchrone et offre une capacité de stockage pouvant atteindre plusieurs centaines de mégaoctets, voire des gigaoctets sur certains navigateurs.

Exemple IndexedDB
// Ouvrir la base de données
const request = indexedDB.open('MyApp', 1);

request.onupgradeneeded = (event) => {
  const db = event.target.result;
  const store = db.createObjectStore('products', { keyPath: 'id' });
  store.createIndex('category', 'category', { unique: false });
};

request.onsuccess = (event) => {
  const db = event.target.result;

  // Ajouter des données
  const tx = db.transaction('products', 'readwrite');
  tx.objectStore('products').add({
    id: 1,
    name: 'Widget',
    category: 'tools',
    price: 29.99,
  });

  // Lire des données
  const getTx = db.transaction('products', 'readonly');
  const getReq = getTx.objectStore('products').get(1);
  getReq.onsuccess = () => console.log(getReq.result);
};

Idéal pour : Applications hors ligne (Offline-first), mise en cache de grands ensembles de données, stockage de fichiers volumineux ou de BLOBs, applications web progressives (PWA).

Guide de Décision

  • Préférence de thème/langue ? → localStorage
  • Ébauche de données de formulaire ? → sessionStorage
  • Session d'authentification ? → Cookie HttpOnly Sécurisé
  • Panier d'achat ? → localStorage (visiteur) ou côté serveur (utilisateur connecté)
  • Cache de données hors ligne ? → IndexedDB
  • Stockage de fichiers volumineux ? → IndexedDB
  • Données nécessaires au serveur ? → Cookie

Découvrez Nos Outils Gratuits pour Développeurs

Encodez et décodez vos données pour le stockage côté client.