Discutiamo fin dall'inizio:
JWT è un approccio molto moderno, semplice e sicuro che si estende ai token Web Json. I token Web Json sono una soluzione senza stato per l'autenticazione. Quindi non è necessario memorizzare alcuno stato di sessione sul server, il che è ovviamente perfetto per le API riposanti. Le API riposanti dovrebbero essere sempre senza stato e l'alternativa più utilizzata all'autenticazione con JWT è semplicemente memorizzare lo stato di accesso dell'utente sul server utilizzando le sessioni. Ma ovviamente non segue il principio secondo cui le API riposanti dovrebbero essere apolidi ed è per questo che soluzioni come JWT sono diventate popolari ed efficaci.
Quindi ora sappiamo come funziona l'autenticazione con i token Web Json. Supponendo che abbiamo già un utente registrato nel nostro database. Quindi il client dell'utente inizia facendo una richiesta post con il nome utente e la password, l'applicazione quindi controlla se l'utente esiste e se la password è corretta, quindi l'applicazione genererà un token Json Web univoco solo per quell'utente.
Il token viene creato utilizzando una stringa segreta che è memorizzato su un server . Successivamente, il server invia quindi quel JWT al client che lo memorizzerà in un cookie o nella memoria locale.
Proprio in questo modo, l'utente è autenticato e sostanzialmente connesso alla nostra applicazione senza lasciare alcuno stato sul server.
Quindi il server in realtà non sa quale utente ha effettivamente effettuato l'accesso, ma ovviamente l'utente sa che ha effettuato l'accesso perché ha un token Json Web valido che è un po 'come un passaporto per accedere a parti protette dell'applicazione.
Quindi, solo per essere sicuro che tu abbia avuto l'idea. Un utente ha effettuato l'accesso non appena ottiene il suo esclusivo token Json Web valido che non viene salvato in nessun punto del server. E quindi questo processo è quindi completamente apolide.
Quindi, ogni volta che un utente desidera accedere a un percorso protetto come i dati del suo profilo utente, ad esempio. Invia il suo token Web Json insieme a una richiesta, quindi è un po 'come mostrare il suo passaporto per ottenere l'accesso a quella rotta.
Una volta che la richiesta ha colpito il server, la nostra app verificherà quindi se il token Web Json è effettivamente valido e se l'utente è davvero chi dice di essere, allora i dati richiesti verranno inviati al client e, in caso contrario, ci sarà essere un errore che dice all'utente che non gli è permesso accedere a quella risorsa.
Tutta questa comunicazione deve avvenire tramite https, quindi Http crittografato sicuro per impedire a chiunque di accedere a password o token Web Json. Solo allora abbiamo un sistema davvero sicuro.
Quindi un token Json Web sembra la parte sinistra di questo screenshot che è stato preso dal debugger JWT su jwt.io In sostanza, è una stringa di codifica composta da tre parti. L'intestazione, il payload e la firma Ora l'intestazione è solo alcuni metadati relativi al token stesso e il payload sono i dati che possiamo codificare nel token, tutti i dati che realmente desideriamo. Quindi, più dati vogliamo codificare qui, più grande è il JWT. Ad ogni modo, queste due parti sono solo testo semplice che verrà codificato, ma non crittografato.
Quindi chiunque sarà in grado di decodificarli e di leggerli , qui non possiamo archiviare dati sensibili. Ma questo non è affatto un problema perché nella terza parte, quindi nella firma, è dove le cose diventano davvero interessanti. La firma viene creata utilizzando l'intestazione, il payload e il segreto che viene salvato sul server.
E l'intero processo viene quindi chiamato firma del token Web Json . L'algoritmo di firma accetta l'intestazione, il payload e il segreto per creare una firma univoca. Quindi solo questi dati e il segreto possono creare questa firma, va bene? Quindi, insieme all'intestazione e al payload, queste firme formano il JWT, che viene quindi inviato al client.
Una volta che il server riceve un JWT per concedere l'accesso a un percorso protetto, deve verificarlo per determinare se l'utente è realmente chi afferma di essere. In altre parole, verificherà se nessuno ha modificato l'intestazione e i dati del payload del token. Di nuovo, questo passaggio di verifica verificherà se nessuna terza parte ha effettivamente modificato l'intestazione o il payload del token Web Json.
Quindi, come funziona questa verifica? Bene, in realtà è abbastanza semplice. Una volta ricevuto il JWT, la verifica prenderà la sua intestazione e il suo payload e, insieme al segreto ancora salvato sul server, fondamentalmente creerà una firma di prova.
Ma la firma originale che è stata generata quando è stato creato il JWT è ancora nel token, giusto? E questa è la chiave per questa verifica. Perché ora tutto ciò che dobbiamo fare è confrontare la firma del test con la firma originale. E se la firma del test è la stessa della firma originale, significa che il payload e l'intestazione non sono stati modificati.
Perché se fossero stati modificati, la firma del test avrebbe dovuto essere diversa. Pertanto, in questo caso in cui non vi è stata alcuna modifica dei dati, possiamo quindi autenticare l'utente. E ovviamente, se le due firme sono effettivamente diverse, allora significa che qualcuno ha manomesso i dati. Di solito, provando a modificare il payload. Ma quella terza parte che manipola il payload non ha ovviamente accesso al segreto, quindi non può firmare il JWT. Quindi la firma originale non corrisponderà mai ai dati manipolati. E quindi, la verifica fallirà sempre in questo caso. E questa è la chiave per far funzionare l'intero sistema. È la magia che rende JWT così semplice, ma anche estremamente potente.
md5('original messaged' + secret) != md5('changed message' + secret)
quindi se qualcuno modifica il messaggio lo puoi rilevare