[Security] JWT stocké en localStorage — vulnérable au XSS #38

Closed
opened 2026-08-05 15:42:15 -04:00 by NixCyRy · 0 comments
NixCyRy commented 2026-08-05 15:42:15 -04:00 (Migrated from github.com)

Problème

Le JWT est actuellement stocké en localStorage, ce qui le rend accessible via JavaScript. Combiné avec l'usage résiduel d'innerHTML += (voir #34), un XSS réussi permettrait de voler le token de session.

Solution recommandée

Migrer le stockage du JWT vers un cookie HttpOnly + Secure + SameSite=Lax:

  • Le backend Flask émet le cookie Set-Cookie au login
  • Le frontend ne lit plus le token depuis localStorage, le navigateur l'envoie automatiquement
  • Invalider le cookie au logout côté serveur

Contexte

  • Lié à #34 (XSS résiduel via innerHTML +=)
  • Si cette migration est faite, CSRF protection devient obligatoire (voir issue séparée)

Priorité

P1-high — le combo XSS + localStorage JWT est la classe d'attaque la plus courante sur les SPAs authentifiées.

## Problème Le JWT est actuellement stocké en `localStorage`, ce qui le rend accessible via JavaScript. Combiné avec l'usage résiduel d'`innerHTML +=` (voir #34), un XSS réussi permettrait de voler le token de session. ## Solution recommandée Migrer le stockage du JWT vers un cookie `HttpOnly` + `Secure` + `SameSite=Lax`: - Le backend Flask émet le cookie `Set-Cookie` au login - Le frontend ne lit plus le token depuis `localStorage`, le navigateur l'envoie automatiquement - Invalider le cookie au logout côté serveur ## Contexte - Lié à #34 (XSS résiduel via `innerHTML +=`) - Si cette migration est faite, **CSRF protection devient obligatoire** (voir issue séparée) ## Priorité P1-high — le combo XSS + localStorage JWT est la classe d'attaque la plus courante sur les SPAs authentifiées.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
SlopVibe-org/nutri-food#38
No description provided.