Sto implementando un token di aggiornamento JWT e ho sviluppato il seguente modo di token di aggiornamento. Quello che segue è il flusso del programma:
- Quando il server recupera le informazioni di accesso, verifica la password database e crea token JWT con un token di aggiornamento come uno dei suoi crediti nel carico utile. (personaggi casuali). Memorizzerà l'aggiornamento token in un database.
- Al momento dell'accesso, il server ha restituito l'accesso: true e il token di accesso JWT
- Poiché il token di aggiornamento si trova all'interno della JWT, non è necessario che due token essere inviato
- Se il client invia un token di accesso scaduto, lo farà il server controlla il token di aggiornamento nelle attestazioni e verifica se si trova all'interno del db. Se lo è, genererà un nuovo token con un nuovo token di aggiornamento e sostituisci il vecchio token di aggiornamento nel db con quello nuovo.
- Se il cliente vuole disconnettersi da tutti i dispositivi, può semplicemente revocare tutto dei loro token di aggiornamento e verranno disconnessi quando tutti loro Scadenza dei token (token JWT di 15 minuti).
I vantaggi che vedo in questa implementazione sono:
- Non è necessario inviare due token. L'aggiornamento è incorporato all'interno del JWT e non può essere modificato perché ciò invaliderebbe la firma.
- Non è necessario crittografare il token di aggiornamento nel database perché se un l'attaccante ha afferrato il token di aggiornamento, non possono fare nulla con esso perché è all'interno del JWT e non può essere modificato. (Nel altre implementazioni con token separati dovremmo assumere un l'attaccante prende comunque entrambe le cose)
I problemi che vedo con questo sono:
- Le JWT contengono sempre il token di aggiornamento, quindi l'autore dell'attacco sarà SEMPRE in grado di eseguire un aggiornamento e utilizzare il token di aggiornamento fino alla sua scadenza, a meno che il client non lo revochi effettuando la disconnessione (di tutti i dispositivi).
- Il client può eseguire la chiamata di accesso in un ciclo e riempire il database perché ogni volta che si accede, viene creato un nuovo token di accesso e a il nuovo token di aggiornamento è archiviato nel database.
Questo metodo è sicuro? Se è così, sono principalmente interessato a qualcuno che riempie il database con nuovi token di aggiornamento e riempiendo il disco. Come evito che ciò accada?