2014-10-06 26 views
39

Con un sistema di token di sessione del database Potrei avere un accesso utente con un nome utente/password, il server potrebbe generare un token (un uuid per esempio) e memorizzarlo nel database e restituire quel token al client. Ogni richiesta da lì includerebbe il token e il server controllerebbe se il token è valido e a quale utente appartiene.JSON Web Token (JWT) trae beneficio da un token di sessione del database

Utilizzando JWT non sarebbe necessario salvare nulla nel database rispetto a sessioni/token grazie alla combinazione della chiave segreta mantenuta sul server e del token firmato che il client conserva e invia con ogni richiesta.

Questo è buono ma oltre a salvare un database controlla ogni richiesta (che sarebbe comunque veloce poiché si tratta solo di una tabella hash) non mi è chiaro quali siano i vantaggi dell'utilizzo di JWT. Qualcuno può familiarizzare con questo spiegare? Ignoriamo i cookie, in particolare è un token personalizzato del database come descritto sopra e JWT che sto cercando di confrontare e comprendere i vantaggi.

risposta

0

Un JSON token di base (JWT) supera i seguenti problemi:

problemi
  1. cellulari applicazioni mobili native sembra avere problemi a lavorare con i biscotti, quindi se abbiamo bisogno di interrogare un API a distanza, forse sessione di autenticazione non è la migliore soluzione.
  2. Problemi CSRF: se si seguono i cookie in modo corretto, è necessario disporre di CSRF per evitare richieste cross-site.

Ma JWT non usa sessioni, non ha problemi con il cellulare, non ha bisogno di CSRF e funziona anche molto bene con CORS. Se non hai un token valido non puoi fare nulla.

Un altro in quanto questo token viene memorizzato nella memoria di archiviazione/sessione locale del client in modo da poter passare questi token anche ad altri client ma è necessario condividere le stesse credenziali utilizzate per generare questo JWT.

+7

Questi sono benefici che JWT fornisce sull'utilizzo dei cookie, lo capisco, ma chiedo dei token di sessione memorizzati in un db e generati da un server. –

+0

Inoltre, questi sono token (sia JWT che opachi) che beneficiano dei cookie. –

22

La differenza principale è la dimensione della memoria di sessione e di ricerca lavoro richiesto dal server:

  • Sul lato server, negozi di JWT un singolo tasto in memoria (o nel file di configurazione) - chiamato chiave segreta. Quella chiave ha due scopi, consente di creare nuovi token crittografati e funziona anche come una chiave master che "apre tutte le serrature" - o nella vita reale verifica tutti i token. Di conseguenza il server risponde molto più velocemente alle richieste di autenticazione, perché non importa se hai due o due milioni di utenti loggati - lo stesso numero di record (uno, quella chiave del server) sarà usato per autenticare tutte le richieste del client .

  • Autenticazione tradizionale che memorizza le sessioni utente in un database, crea un record nel db per ogni singolo utente, che risulta in chiavi multiple. Quindi, se si hanno due milioni di utenti connessi, il server creerà due milioni di record e con ogni richiesta del client il server dovrà individuare il record della sessione pertinente nel database *.

JWT lascia il lato client per archiviare e gestire l'intera sessione/oggetto utente. In realtà ha molto più senso perché ogni client gestisce solo i propri dati, quindi non provoca un sollevamento pesante per il lato client.

Per quanto riguarda ciò che hai scritto nel tuo ultimo paragrafo, non sono solo le chiamate db che salviamo qui. JWT è in realtà molto più scalabile a causa della sua natura indipendente e leggera, non fallisce quando le richieste di autenticazione si accumulano e consente al server di gestire l'autenticazione su più dispositivi e servizi senza gestire le sessioni sul lato server.

Sicurezza saggio, però, le sessioni di db ha senza dubbio il sopravvento: possono essere più sicuro perché di che la latenza, e sono anche meno vulnerabili agli dirottamento di sessione dopo il logout dell'utente.

* Il metodo delle sessioni memorizzate in db può essere ottimizzato con un caching efficace e memorizzando solo l'id di sessione (in contrapposizione all'intero oggetto utente) in un server chiave/valore veloce come Redis. Detto questo, sceglierei comunque il metodo JWT su db per la maggior parte dei casi.

+0

I primi due punti erano qualcosa che ho toccato nella domanda, ma dal momento che la memoria extra e il recupero erano entrambi a buon mercato per me, non considero questo un enorme vantaggio, ma posso vedere che potrebbe davvero essere utile per alcuni casi d'uso davvero interessante è il punto che si pone sulla scalabilità delle richieste di autenticazione, questo è un vantaggio, e la possibilità di un dirottamento di sessione è uno svantaggio. Ho finito con l'utilizzo di jwt btw, ma ho ancora bisogno di capire il modo migliore per gestire il potenziale hijack di sessione diverso dal richiedere il re-inserimento della password per gli apis sensibili. –

+2

In realtà, il dirottamento è qualcosa che potrebbe verificarsi anche con sessioni, è solo che con le sessioni è possibile cancellare sessioni di singoli utenti dove, come con jwt, non è possibile, cambiando la chiave segreta si registrano tutti ma non possono farlo per un singolo utente . La scalabilità e la mancanza di gestione associate al mantenimento delle sessioni probabilmente danno un vantaggio. –

+1

Dai un'occhiata a questo thread e alle risposte sui problemi di sicurezza dei token jwt http://stackoverflow.com/questions/26739167/jwt-json-web-token-automatic-prolongation-of-expiration l'idea è di mantenere il ciclo di vita del token breve e rinnova i token spesso, o cerca google per "auth0 refresh token" (senza virgolette) per un'altra soluzione – EranG