MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Soll ich JWT-Token in Redis speichern?

TLDR:Wenn Sie die Möglichkeit haben möchten, das Token irgendwann zu widerrufen, ja, speichern Sie es in etwas schnellem wie Redis.

Einer der gut dokumentierten Nachteile der Verwendung von JWT ist, dass es keine einfache Möglichkeit gibt, ein Token zu widerrufen, wenn beispielsweise ein Benutzer abgemeldet werden muss oder das Token kompromittiert wurde. Das Widerrufen eines Tokens würde bedeuten, es in einem Speicher nachzuschlagen und dann zu entscheiden, was als nächstes zu tun ist. Da einer der Punkte von JWT darin besteht, Roundtrips zur DB zu vermeiden, wäre es ein guter Kompromiss, sie in etwas weniger Belastendem als einem RDBMS zu speichern. Das ist ein perfekter Job für Redis.

Wie in den Kommentaren vorgeschlagen, besteht ein guter Ansatz darin, die Liste zu einer schwarzen Liste zu machen (d. H. Eine Liste ungültig gemachter Token). Bei jeder Anfrage schlagen Sie in der Liste nach, um sicherzustellen, dass das Token nicht darin vorhanden ist. Sie können den Speicherplatz und die Leistung während des Suchschritts weiter verbessern, indem Sie einen probabilistischen Algorithmus zum Speichern des Tokens verwenden. Ein einfacher Ansatz besteht darin, geschichtete Lookups zu haben. Sie könnten beispielsweise einen kleinen In-App-Store haben, der nur die ersten paar (z. B. 1 bis 4) Bytes Ihrer Token auf der schwarzen Liste verfolgt. Dann würde der Redis-Cache eine etwas vollständigere Version derselben Token verfolgen (z. B. die ersten 2 bis 8 Bytes). Sie können dann eine Vollversion der Token auf der schwarzen Liste speichern, indem Sie eine dauerhaftere Lösung (Dateisystem, RDBMS usw.) verwenden. Dies ist eine optimistische Suchstrategie, die schnell bestätigt, dass ein Token nicht auf der schwarzen Liste steht (was der häufigere Fall wäre). Wenn ein gesuchtes Token zufällig mit einem Element in der In-App-Blacklist übereinstimmt (weil die ersten paar Bytes übereinstimmen), fahren Sie mit einer zusätzlichen Suche im Redis-Speicher fort, dann im dauerhaften Speicher, falls erforderlich. Einige (oder alle) Speicher können als Versuche oder Hash-Tabellen implementiert werden. Eine weitere effiziente und relativ einfach zu implementierende Datenstruktur ist ein sogenannter Bloom-Filter.

Offensichtlich müssten Sie den obigen Ansatz anpassen, wenn Sie routinemäßig Millionen langlebiger Token auf die schwarze Liste setzen (was auch darauf hindeuten kann, dass Sie ein anderes Problem haben).