Lassen Sie uns von Anfang an davon sprechen:
JWT ist ein sehr moderner, einfacher und sicherer Ansatz, der sich auch auf Json Web Tokens erstreckt. Json Web Tokens sind eine zustandslose Lösung für die Authentifizierung. Es ist also nicht erforderlich, einen Sitzungsstatus auf dem Server zu speichern, was natürlich perfekt für erholsame APIs ist. Restful APIs sollten immer zustandslos sein. Die am häufigsten verwendete Alternative zur Authentifizierung mit JWTs besteht darin, den Anmeldestatus des Benutzers nur mithilfe von Sitzungen auf dem Server zu speichern. Aber dann folgt natürlich nicht das Prinzip, dass erholsame APIs zustandslos sein sollten, und deshalb wurden Lösungen wie JWT populär und effektiv.
Lassen Sie uns nun wissen, wie die Authentifizierung mit Json-Web-Tokens tatsächlich funktioniert. Vorausgesetzt, wir haben bereits einen registrierten Benutzer in unserer Datenbank. Der Client des Benutzers stellt zunächst eine Post-Anfrage mit dem Benutzernamen und dem Kennwort. Die Anwendung prüft dann, ob der Benutzer vorhanden ist. Wenn das Kennwort korrekt ist, generiert die Anwendung ein eindeutiges Json-Web-Token nur für diesen Benutzer.
Das Token wird mithilfe einer geheimen Zeichenfolge erstellt , die auf einem Server gespeichert ist . Als nächstes sendet der Server diese JWT an den Client zurück, der sie entweder in einem Cookie oder in einem lokalen Speicher speichert.
Auf diese Weise wird der Benutzer authentifiziert und im Grunde genommen in unserer Anwendung angemeldet, ohne dass ein Status auf dem Server verbleibt.
Der Server weiß also tatsächlich nicht, welcher Benutzer tatsächlich angemeldet ist, aber natürlich weiß der Benutzer, dass er angemeldet ist, weil er über ein gültiges Json-Web-Token verfügt, das ein bisschen wie ein Pass für den Zugriff auf geschützte Teile der Anwendung ist.
Also noch einmal, nur um sicherzugehen, dass Sie auf die Idee gekommen sind. Ein Benutzer wird angemeldet, sobald er sein eindeutiges gültiges Json-Web-Token zurückerhält, das nirgendwo auf dem Server gespeichert ist. Und so ist dieser Prozess völlig zustandslos.
Jedes Mal, wenn ein Benutzer auf eine geschützte Route zugreifen möchte, wie beispielsweise seine Benutzerprofildaten. Er sendet sein Json-Web-Token zusammen mit einer Anfrage. Es ist also ein bisschen so, als würde er seinen Reisepass vorzeigen, um Zugang zu dieser Route zu erhalten.
Sobald die Anfrage den Server erreicht, überprüft unsere App, ob das Json-Web-Token tatsächlich gültig ist und ob der Benutzer wirklich der ist, von dem er sagt, dass er er ist. Nun, dann werden die angeforderten Daten an den Client gesendet, und wenn nicht, wird dies der Fall sein ein Fehler sein, der dem Benutzer mitteilt, dass er nicht auf diese Ressource zugreifen darf.
All diese Kommunikation muss über https erfolgen, also sicheres verschlüsseltes HTTP, um zu verhindern, dass jeder Zugriff auf Passwörter oder Json-Web-Token erhält. Nur dann haben wir ein wirklich sicheres System.
Ein Json-Web-Token sieht also wie der linke Teil dieses Screenshots aus, der aus dem JWT-Debugger bei jwt.ioSo stammt. Es handelt sich also im Wesentlichen um eine Codierungszeichenfolge, die aus drei Teilen besteht. Der Header, die Nutzdaten und die Signatur Jetzt sind die Kopfzeilen nur noch einige Metadaten über das Token selbst und die Nutzdaten sind die Daten, die wir in das Token codieren können, alle Daten, die wir wirklich wollen. Je mehr Daten wir hier codieren möchten, desto größer ist die JWT. Wie auch immer, diese beiden Teile sind nur einfacher Text, der verschlüsselt, aber nicht verschlüsselt wird.
Damit jeder sie entschlüsseln und lesen kann , können wir hier keine sensiblen Daten speichern. Aber das ist überhaupt kein Problem, denn im dritten Teil, also in der Signatur, werden die Dinge wirklich interessant. Die Signatur wird anhand des Headers, der Nutzdaten und des auf dem Server gespeicherten Geheimnisses erstellt.
Dieser gesamte Vorgang wird dann als Signieren des Json-Web-Tokens bezeichnet . Der Signaturalgorithmus verwendet den Header, die Nutzdaten und das Geheimnis, um eine eindeutige Signatur zu erstellen. Nur diese Daten und das Geheimnis können diese Signatur erstellen. Diese Signatur bildet dann zusammen mit dem Header und der Nutzlast die JWT, die dann an den Client gesendet wird.
Sobald der Server eine JWT erhält, um Zugriff auf eine geschützte Route zu gewähren, muss er diese überprüfen, um festzustellen, ob der Benutzer wirklich der ist, für den er sich ausgibt. Mit anderen Worten, es wird überprüft, ob niemand den Header und die Nutzdaten des Tokens geändert hat. Dieser Überprüfungsschritt überprüft also erneut, ob kein Dritter tatsächlich den Header oder die Nutzdaten des Json-Web-Tokens geändert hat.
Wie funktioniert diese Überprüfung tatsächlich? Nun, es ist eigentlich ganz einfach. Sobald die JWT empfangen wurde, nimmt die Überprüfung ihren Header und ihre Nutzdaten und erstellt zusammen mit dem Geheimnis, das noch auf dem Server gespeichert ist, im Grunde eine Testsignatur.
Aber die ursprüngliche Signatur, die beim ersten Erstellen des JWT generiert wurde, befindet sich immer noch im Token, oder? Und das ist der Schlüssel zu dieser Überprüfung. Denn jetzt müssen wir nur noch die Testsignatur mit der Originalsignatur vergleichen. Und wenn die Testsignatur mit der ursprünglichen Signatur identisch ist, bedeutet dies, dass die Nutzlast und der Header nicht geändert wurden.
Denn wenn sie geändert worden wären, müsste die Testsignatur anders sein. Daher können wir in diesem Fall, in dem die Daten nicht geändert wurden, den Benutzer authentifizieren. Und wenn die beiden Signaturen tatsächlich unterschiedlich sind, bedeutet dies natürlich, dass jemand die Daten manipuliert hat. Normalerweise durch den Versuch, die Nutzlast zu ändern. Aber dieser Dritte, der die Nutzlast manipuliert, hat natürlich keinen Zugriff auf das Geheimnis, so dass er das JWT nicht unterzeichnen kann. Die ursprüngliche Signatur entspricht also niemals den manipulierten Daten. Daher schlägt die Überprüfung in diesem Fall immer fehl. Und das ist der Schlüssel, damit dieses ganze System funktioniert. Es ist die Magie, die JWT so einfach, aber auch extrem mächtig macht.
md5('original messaged' + secret) != md5('changed message' + secret)
Wenn also jemand die Nachricht ändert, können Sie sie erkennen