Sto implementando i JWT nella mia app e mi piacerebbe renderli il più sicuri possibile. Preparerò tutto ciò che sto pianificando, apprezzerei molto qualsiasi suggerimento sulla sicurezza di questa implementazione. Questo è il mio sito, ho pieno accesso ad ogni aspetto di esso, sia front-end che back-end.
Questa sarà una SPA, utilizzando un'API per accedere al back-end. Sto usando JWT per salvare le chiamate DB con ogni hit dell'API.
JWTs
Le JWT sono memorizzate in un cookie access_token
. Vengono prima firmati e poi crittografati utilizzando jose-jwt . L'algoritmo di firma è HS256, la crittografia è DIR. Includono l'ID dell'utente, una richiesta di scadenza exp
e diverse altre attestazioni personalizzate. Le JWT scadono tra 30 minuti e il cookie JWT scade tra 7 giorni.
(versione breve):
- JWT memorizzato nel cookie
- JWT include l'ID utente
- JWT firmato e quindi crittografato
- JWT
exp
reclamo impostato su 30 minuti in futuro - Il cookie JWT ha una scadenza di 7 giorni in futuro
Protezione CSRF
Le JWT includono una dichiarazione cst
che memorizza un token CSRF generato in modo casuale. Il token CSRF viene inviato nel corpo della risposta al momento dell'accesso e quando viene emesso un nuovo JWT. Il token CSRF è memorizzato nel localStorage del browser. Viene inviato con ogni richiesta e convalidato rispetto al valore nel JWT.
(versione breve):
- JWT include un token CSRF generato a caso
- Token CSRF inviato al momento dell'accesso e archiviato in localStorage
- Token CSRF inviato nell'intestazione della richiesta di tutte le richieste
- Token CSRF dell'intestazione rispetto al token CSRF nel JWT
Token di aggiornamento
Poiché i JWT scadono tra 30 minuti, è necessario aggiornarli. Il JWT include un'affermazione rfs
che memorizza un token di aggiornamento casuale. Questo token di aggiornamento viene anche memorizzato nel DB (una tabella separata dagli utenti per consentire più sessioni). Se il JWT è scaduto (in base alla sua rivendicazione exp
), il DB viene controllato per garantire che l'utente sia ancora valido (ad esempio, account non cancellato, password non modificata, ecc.). Se l'utente è valido, il token di aggiornamento viene verificato e un nuovo token JWT / CSRF viene generato e restituito nella risposta. Se l'utente non è valido, il access_token
viene rinviato con un valore arbitrario come 0
e la sua scadenza viene impostata sul passato in modo che il browser la cancelli. Il token CSRF viene passato vuoto, quindi verrà cancellato da localStorage. Tutti i token di aggiornamento per l'utente vengono cancellati dal DB.
(versione breve):
- Se JWT è scaduto, controlla il DB utente per verificare che l'utente sia ancora valido
- SE VALIDA:
- Confronta il token di aggiornamento con DB (supponi che corrisponda per il resto di questo)
- Genera nuovo token di aggiornamento, sovrascrivi il valore precedente in DB
- Reimposta JWT con nuova
exp
data - Passa nuovamente il token di aggiornamento e archivia in localStorage
- SE NON VALIDO:
- Cancella cookie JWT di a) impostando su un valore non valido, b) impostando la scadenza su passato
- Dire al browser di cancellare il token CSRF localStorage
- Cancella tutti i token di aggiornamento per l'utente da DB
TL veloce e sporco; DR
- Al momento dell'accesso, aggiungi un token CSRF casuale al JWT.
- Invia lo stesso token CSRF al client nel corpo della risposta.
- Archivia il token CSRF in localStorage.
- Includi un token di aggiornamento nel JWT.
- Imposta il cookie JWT per scadere dopo 1 settimana.
- Imposta la rivendicazione JWT exp a 30 minuti.
- Se il reclamo JWT è scaduto, verifica il token di aggiornamento sul DB per verificare che l'utente sia ancora valido.
- SE UTENTE VALIDO:
- Problema JWT aggiornato con nuovo token CSRF e nuovo token di aggiornamento.
- Imposta la scadenza del cookie JWT a una settimana in futuro. (riemettere il cookie, in pratica)
- Invia un nuovo token CSRF nel corpo della risposta, sovrascrivi il valore di localStorage esistente.
- SE NON VALIDO L'UTENTE:
- Restituisce il cookie JWT con lo stesso nome ma nessun contenuto.
- Imposta la scadenza del cookie su una data arbitraria nel passato.
- Chiedi al browser di cancellare il valore di LocalStorage.