<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Shaytone G.O.B</title>
    <description>The latest articles on Forem by Shaytone G.O.B (@aymrick).</description>
    <link>https://forem.com/aymrick</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3756973%2Fedfe6a2b-fe27-4f81-ad8c-f13f001f9769.png</url>
      <title>Forem: Shaytone G.O.B</title>
      <link>https://forem.com/aymrick</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/aymrick"/>
    <language>en</language>
    <item>
      <title>Pourquoi j’ai arrêté d’utiliser JWT pour mes dashboards admin (et ce que j’utilise à la place)</title>
      <dc:creator>Shaytone G.O.B</dc:creator>
      <pubDate>Fri, 06 Feb 2026 17:12:51 +0000</pubDate>
      <link>https://forem.com/aymrick/pourquoi-jai-arrete-dutiliser-jwt-pour-mes-dashboards-admin-et-ce-que-jutilise-a-la-place-3m8</link>
      <guid>https://forem.com/aymrick/pourquoi-jai-arrete-dutiliser-jwt-pour-mes-dashboards-admin-et-ce-que-jutilise-a-la-place-3m8</guid>
      <description>&lt;p&gt;Le JWT est partout.&lt;/p&gt;

&lt;p&gt;La majorité des tutoriels recommandent JWT par défaut pour l’authentification dans les applications web, y compris les dashboards admin.&lt;br&gt;
Je l’ai utilisé pendant des années… jusqu’à ce que je construise de vrais tableaux de bord SaaS et back-offices utilisés quotidiennement par des utilisateurs non techniques.&lt;/p&gt;

&lt;p&gt;J’ai rapidement compris que JWT ne résolvait pas le bon problème pour mes projets.&lt;/p&gt;

&lt;p&gt;Cet article explique pourquoi JWT est souvent inadapté aux dashboards admin, et ce que j’utilise maintenant à la place.&lt;/p&gt;

&lt;p&gt;Les problèmes réels du JWT pour les dashboards admin&lt;/p&gt;

&lt;p&gt;JWT n’est pas intrinsèquement dangereux.&lt;br&gt;
Le problème, c’est son implémentation classique.&lt;/p&gt;

&lt;p&gt;Dans la plupart des frontends, le JWT est stocké dans :&lt;/p&gt;

&lt;p&gt;localStorage&lt;/p&gt;

&lt;p&gt;sessionStorage&lt;/p&gt;

&lt;p&gt;parfois en mémoire avec un refresh token&lt;/p&gt;

&lt;p&gt;Cela pose plusieurs problèmes majeurs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. XSS : le risque est réel&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si un attaquant injecte du JavaScript, il peut lire le token et se faire passer pour un utilisateur.&lt;/p&gt;

&lt;p&gt;Dans un dashboard admin, c’est inacceptable :&lt;/p&gt;

&lt;p&gt;accès aux données utilisateurs&lt;/p&gt;

&lt;p&gt;accès à la facturation&lt;/p&gt;

&lt;p&gt;accès aux outils internes&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Les refresh tokens ajoutent de la complexité&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Il faut gérer :&lt;/p&gt;

&lt;p&gt;expiration des tokens&lt;/p&gt;

&lt;p&gt;rotation des refresh tokens&lt;/p&gt;

&lt;p&gt;réauthentification silencieuse&lt;/p&gt;

&lt;p&gt;multiples cas limites et bugs potentiels&lt;/p&gt;

&lt;p&gt;Pour un dashboard privé, cette complexité est inutile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. JWT stateless… mais les dashboards ne le sont pas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Les dashboards admin ont souvent besoin de :&lt;/p&gt;

&lt;p&gt;sessions côté serveur&lt;/p&gt;

&lt;p&gt;vérification de rôles&lt;/p&gt;

&lt;p&gt;accès premium&lt;/p&gt;

&lt;p&gt;gestion des équipes&lt;/p&gt;

&lt;p&gt;révocation instantanée des accès&lt;/p&gt;

&lt;p&gt;Le JWT se bat contre ces besoins au lieu de les faciliter.&lt;/p&gt;

&lt;p&gt;L’alternative : les cookies HttpOnly&lt;/p&gt;

&lt;p&gt;Pour mes dashboards admin, j’utilise désormais l’authentification basée sur les cookies HttpOnly.&lt;/p&gt;

&lt;p&gt;Comment ça fonctionne&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewmn61wqoj5yqlyijfin.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewmn61wqoj5yqlyijfin.png" alt=" " width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;L’utilisateur se connecte avec email/mot de passe&lt;/p&gt;

&lt;p&gt;Le backend crée un cookie HttpOnly&lt;/p&gt;

&lt;p&gt;Le frontend ne voit jamais le token&lt;/p&gt;

&lt;p&gt;Chaque requête protégée inclut automatiquement le cookie&lt;/p&gt;

&lt;p&gt;Exemple de requête frontend :&lt;/p&gt;

&lt;p&gt;axios.get("/api/me", { withCredentials: true });&lt;/p&gt;

&lt;p&gt;Pas de token à gérer, pas de refresh token, pas de localStorage. Simple et sécurisé.&lt;/p&gt;

&lt;p&gt;Pourquoi c’est mieux pour un dashboard admin&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Protection contre les XSS&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Les cookies HttpOnly :&lt;/p&gt;

&lt;p&gt;ne sont pas accessibles par JavaScript&lt;/p&gt;

&lt;p&gt;sont automatiquement envoyés par le navigateur&lt;/p&gt;

&lt;p&gt;réduisent fortement la surface d’attaque&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Frontend simplifié&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Le frontend :&lt;/p&gt;

&lt;p&gt;ne gère pas l’état d’authentification&lt;/p&gt;

&lt;p&gt;ne manipule aucun token&lt;/p&gt;

&lt;p&gt;réagit simplement aux erreurs 401 ou 403&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Contrôle des rôles côté serveur&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Avec cette approche, il est trivial d’appliquer les middlewares :&lt;/p&gt;

&lt;p&gt;isAuth&lt;/p&gt;

&lt;p&gt;isAdmin&lt;/p&gt;

&lt;p&gt;isPremium&lt;/p&gt;

&lt;p&gt;Chaque requête est validée côté serveur.&lt;/p&gt;

&lt;p&gt;Quand JWT est approprié&lt;/p&gt;

&lt;p&gt;JWT n’est pas “mauvais”.&lt;br&gt;
Il est juste souvent mal utilisé.&lt;/p&gt;

&lt;p&gt;Il reste pertinent pour :&lt;/p&gt;

&lt;p&gt;applications mobiles&lt;/p&gt;

&lt;p&gt;APIs publiques&lt;/p&gt;

&lt;p&gt;intégrations tierces&lt;/p&gt;

&lt;p&gt;microservices stateless&lt;/p&gt;

&lt;p&gt;Mais pour un dashboard privé, les cookies HttpOnly sont généralement plus adaptés.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vavvayd2mzqgt8yve8s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vavvayd2mzqgt8yve8s.png" alt=" " width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mon implémentation dans AdminCraft V2&lt;/p&gt;

&lt;p&gt;Dans mon starter kit AdminCraft V2 :&lt;/p&gt;

&lt;p&gt;Cookies HttpOnly pour l’authentification&lt;/p&gt;

&lt;p&gt;Middlewares de rôle (isAuth, isAdmin, isPremium)&lt;/p&gt;

&lt;p&gt;Validation serveur à chaque requête&lt;/p&gt;

&lt;p&gt;Abonnements Stripe liés aux rôles&lt;/p&gt;

&lt;p&gt;Gestion d’équipes via parentUser&lt;/p&gt;

&lt;p&gt;Le frontend ne touche jamais aux tokens.&lt;br&gt;
Résultat : code auditable, maintenable et sécurisé.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1omrte1a8hm588fgc7mg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1omrte1a8hm588fgc7mg.png" alt=" " width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Résumé&lt;/p&gt;

&lt;p&gt;JWT est populaire parce qu’il résout un vrai problème.&lt;br&gt;
Mais tous les projets n’ont pas les mêmes contraintes.&lt;/p&gt;

&lt;p&gt;Pour les dashboards admin et back-offices SaaS :&lt;/p&gt;

&lt;p&gt;simplicité et sécurité &amp;gt; tendance&lt;/p&gt;

&lt;p&gt;moins de code → moins de bugs&lt;/p&gt;

&lt;p&gt;moins de risques de sécurité&lt;/p&gt;

&lt;p&gt;Voir AdminCraft V2 en action&lt;/p&gt;

&lt;p&gt;Le frontend AdminCraft V2 est public et open-source sur GitHub :&lt;br&gt;
👉 GitHub &lt;a href="https://github.com/Aymrick97/admincraft-react-admin-dashboard" rel="noopener noreferrer"&gt;https://github.com/Aymrick97/admincraft-react-admin-dashboard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le backend Premium (auth, rôles, Stripe, équipes) est disponible séparément :&lt;br&gt;
👉 Gumroad &lt;a href="https://admincore.gumroad.com/l/kgevy" rel="noopener noreferrer"&gt;https://admincore.gumroad.com/l/kgevy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💬 Et vous ? Quelle stratégie d’authentification utilisez-vous pour vos dashboards admin ?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>jwt</category>
      <category>node</category>
      <category>react</category>
    </item>
  </channel>
</rss>
