
In einem früheren Artikel habe ich über die Grundlagen von JWT
. Wenn Sie an Ihren Fingern sind, dann ist dies nur der Schlüssel, mit dem wir die Tür zu privaten Ressourcen öffnen. Aber was ist, wenn dieser Schlüssel gestohlen wird (genauer gesagt, sie machen ein Duplikat). Dann kann sich jemand anderes unter Ihrem Namen beim Server anmelden, und wir wissen möglicherweise nicht einmal davon. Wir wollen ein solches Szenario nicht zulassen. Aber was tun?
Erhöhen Sie die Sicherheit
Ich empfehle den Lesern, bevor sie unabhängig weitermachen, darüber nachzudenken, was wir mit Sicherheit tun können.
Hier sind einige Ansätze, die die Sicherheit verbessern können. Sie können in den Kommentaren schreiben, welche anderen Ansätze existieren - ich werde sie hinzufügen.
- Verwendung des
https
Protokolls, das den Datenkanal über das Internet schützt. Tatsächlich ist dies ein Wrapper über http
, der zusätzliche kryptografische Protokolle auferlegt - SSL
und TLS
- Hinzufügen von
IP
Informationen zur payload
. Dann besteht das Token von anderen IP
die Überprüfung nicht. IP
kann jedoch gefälscht werden und was mit dynamischen IP
Adressen zu tun ist oder wenn ein Benutzer eine Verbindung von einem Telefon in einem Café oder einer U-Bahn herstellt. Daher werden wir diesen Ansatz nicht verwenden. - Verwenden Sie
RS256
. Dies gewährleistet die Sicherheit des privaten Schlüssels. Aber mit Token bleibt alles absolut so wie es war. Wir benötigen RS256
wenn wir Angst haben, den geheimen Schlüssel an andere Server weiterzugeben, was möglicherweise unzuverlässig ist. Wir geben ihnen nur ein Token-Authentifizierungstool, das für einen Angreifer absolut nutzlos ist. - Verwenden Sie kurzlebige Token. Dann muss sich der Benutzer jedes Mal neu anmelden, wenn er abläuft. Der Benutzer wird sich früher oder später langweilen und unsere Ressource verlassen.
- Aber was ist, wenn Sie ohnehin kurzlebige Token verwenden, aber einen anderen Token geben, dessen Zweck nur darin besteht, einen neuen kurzlebigen Token ohne neue Berechtigung zu erhalten? Ein solches Token wird als Aktualisierungstoken bezeichnet und kann nur einmal verwendet werden. Dies wird mein Artikel sein.
Erinnern Sie sich, was JWT ist
JWT
nutzt die Codierungsansätze JWS
(Signatur) und JWE
(Verschlüsselung). Die Signatur erlaubt es niemandem, ein Token ohne Informationen über den geheimen Schlüssel zu fälschen, und die Codierung schützt vor dem Lesen von Daten durch Dritte.
Mal sehen, wie sie uns helfen können, den Benutzer auf der Site zu authentifizieren und zu autorisieren.
Authentifizierung (englische Authentifizierung; aus dem Griechischen. Αὐθεντικός [authentikos] - echt, authentisch; aus αὐθέντης [authentes] - der Autor) - Authentifizierungsverfahren. In unserem Fall überprüfen wir das Login + Passwort auf Übereinstimmung mit dem Eintrag in der Datenbank der Benutzerdaten.
Autorisierung (englische Autorisierung - Erlaubnis, Autorisierung) - dem Benutzer das Recht zu geben, bestimmte Aktionen auszuführen; und auch das Überprüfen (Bestätigen) dieser Rechte beim Versuch, diese Aktionen auszuführen.
Mit anderen Worten, die Authentifizierung überprüft die Rechtmäßigkeit des Benutzers. Wenn alles in Ordnung ist, wird der Benutzer autorisiert, dh er kann zulässige Aktionen mit der Datenbank ausführen. Normalerweise werden diese beiden Prozesse kombiniert, und daher besteht eine bekannte Verwirrung.
Arten von Token
- Access Tokens (JWTs) sind Token, mit denen auf geschützte Ressourcen zugegriffen werden kann. Sie sind kurzlebig , aber wiederverwendbar . Sie können zusätzliche Informationen enthalten, z. B. die Lebensdauer oder die
IP
Adresse, von der die Anforderung stammt. Es hängt alles vom Wunsch des Entwicklers ab. - Refresh Token (RT) - Diese Token führen nur eine bestimmte Aufgabe aus und erhalten ein neues Zugriffstoken. Und diesmal können Sie nicht auf einen Autorisierungsserver verzichten. Sie sind langlebig , aber wegwerfbar .
Der Hauptanwendungsfall ist folgender: Sobald das alte JWT
abläuft, können wir keine privaten Daten mehr damit empfangen, dann senden wir RT
und wir erhalten ein neues Paar JWT+RT
. Mit dem neuen JWT
wir uns wieder privaten Ressourcen zuwenden. Natürlich kann ein Aktualisierungstoken auch schlecht werden, aber es wird nicht bald passieren, da er viel länger lebt als sein Bruder.

Die Schlüsselidee der Token-Trennung besteht darin, dass Autorisierungstoken es uns einerseits ermöglichen, einen Benutzer ohne Autorisierungsserver einfach durch Vergleichen von Signaturen zu verifizieren.
const validateToken = token => { const [ header, payload, signature ] = token.split('.'); return signature === HS256(`${header}.${payload}`, SECRET_KEY); }
Auf der anderen Seite haben wir eine
, mit der wir das Zugriffstoken aktualisieren können, ohne ein Kennwort vom Benutzer einzugeben. In diesem Fall müssen wir jedoch noch einen teuren Vorgang für den Zugriff auf den Autorisierungsserver ausführen.
Abschließend
Dank dieses Ansatzes reduzieren wir die Zeitverzögerung für den Zugriff auf den latency
und die Serverlogik selbst wird viel einfacher. Und aus Sicherheitsgründen kann ein Zugriffstoken, das uns gestohlen wurde, nur von einer begrenzten Zeit verwendet werden - nicht mehr als seine Lebensdauer. Damit ein Angreifer länger verwenden kann, muss er auch eine Aktualisierung stehlen, aber dann weiß der echte Benutzer, dass er gehackt wurde, weil er aus dem System geworfen wird. Und sobald sich ein solcher Benutzer erneut anmeldet, erhält er ein aktualisiertes Paar JWT+RT
, und die gestohlenen verwandeln sich in einen Kürbis.
Nützliche Links
- Warum brauche ich ein Aktualisierungstoken, wenn ich ein Zugriffstoken habe?
- Token aktualisieren: Wann werden sie verwendet und wie interagieren sie mit JWTs?
- Weitere OAuth 2.0-Überraschungen: Das Aktualisierungstoken