Memorizzazione di Username in sessionStorage: cattiva idea?

1

Sto lavorando all'applicazione React-Django che utilizza JWT per l'autenticazione. L'utente accede con nome utente e password, il server convalida e risponde con JWT e nome utente e (attualmente) sto memorizzando solo il JWT in sessionStorage .

Il JWT viene quindi verificato come valido e aggiornato ogni volta che l'utente naviga tra le rotte protette. Se è ancora buono, viene aggiornato. cioè è inviato da sessionStorage.getItem('token') al server, ne viene inviato uno nuovo se quello inviato è ancora valido e sostituisce quello esistente in sessionStorage . Cool.

Il problema che ho riscontrato è mentre ho identificato che l'utente è autorizzato ad accedere e continuare ad accedere a questi percorsi protetti, non so davvero chi sono e quindi non sono in grado di estrarre i dati specifici per loro. (Non ho avuto fortuna nell'usare cose come user = request.user.username per raccogliere chi è l'utente corrente e il JWT dopo che il problema iniziale del JWT non ha nome utente insieme ... da quello che posso dire.)

Quindi vedo due opzioni per risolvere questo:

1) Memorizza il JWT nel DB con relazione all'utente e in sessionStorage in modo che possa essere chiamato da sessionStorage , confrontato con il DB, e quindi identificare l'utente da quello.

Sembra che questa potrebbe essere l'opzione "più sicura" da percorrere.

2) Poiché il server sta già rinviando username insieme al JWT quando l'utente esegue l'accesso, posso semplicemente iniziare a memorizzare entrambi in sessionStorage . In questo modo, posso sessionStorage.getItem('username') e richieste al server per recuperare informazioni specifiche dell'utente. Tuttavia, qualcuno potrebbe sessionStorage e ottenere il loro nome utente. (I JWT sono validi solo per 15 minuti e se soddisfa il limite di tempo, l'utente è disconnesso e sessionStorage.clear() è terminato.)

Il secondo, è quello che mi preoccupa della sicurezza. Sono ben lungi dall'essere un esperto di sicurezza, quindi solo curioso di sapere quali sono le ramificazioni della memorizzazione di username in sessionStorage e quale di questi sarebbe "migliore".

EDIT: Mentre continuo a leggere sull'argomento, sto trovando numerose guide e libri che utilizzano esempi in cui username è memorizzato in sessionStorage . Questo però non lo rende giusto. Ad esempio, questo bellissimo esempio memorizza il nome utente e la password in localStorage (potrei uscire su un ramo qui, ma questa è una pessima idea):

link

    
posta sockpuppet 10.11.2017 - 18:21
fonte

1 risposta

1

Ben fatto per riflettere sui limiti del JWT. La maggior parte delle persone non lo fa e, come hai visto, la maggior parte delle esercitazioni di JWT sul Web sono orribilmente non sicure.

Una cosa da notare è che la consegna di un JWT al server non dimostra che il dispositivo / browser di origine è quello a cui è stato assegnato il token in primo luogo. Questa è una delle ragioni per cui i JWT dovrebbero essere di breve durata perché da soli sono facilmente soggetti a attacchi di replay dei token. Anche TLS non garantisce la libertà da un attacco di replay JWT, se il PC originale era già compromesso.

Per aggiungere ulteriore sicurezza, devi essere sicuro di averne bisogno. Ovviamente uno dei motivi per l'utilizzo di JWT è quello di alleggerire il carico sul server. L'aggiunta della convalida del token lato server e / o di un archivio di sessioni rimuove chiaramente alcuni di questi vantaggi.

Se hai bisogno di ulteriore sicurezza, dovrai crittografare dati aggiuntivi nel token, ad es. indirizzo IP. O dovrai memorizzare abbastanza dati in un archivio di sessioni per essere in grado di validare validamente che il token è tornato da dove ti aspettavi, magari registrando ancora l'indirizzo IP di origine.

Un archivio di sessioni è probabilmente più sicuro ma probabilmente non di molto.

La tua domanda relativa all'identità viene facilmente risolta memorizzando l'ID utente sul token nel tuo archivio sessioni, se ne stai usando uno. Se si decide di non volere ulteriore sicurezza, è sufficiente memorizzare l'ID nel token purché i valori del token siano crittografati sul server.

    
risposta data 12.11.2017 - 14:21
fonte

Leggi altre domande sui tag