it-swarm.com.de

Speichern von Informationen in JWT-Nutzdaten

Derzeit läuft das Zugriffstoken in 15 Minuten ab und die einzige in der Nutzlast gespeicherte Information ist die Benutzer-ID.

Jeder Benutzer hat ein Guthaben, das er in der App verwenden kann. Sollte ich bei jeder Anfrage die Datenbank abfragen, damit ich den Kontostand ziehen kann? Wäre es unsicher, die Nutzlast zu speichern?

17
civ15

tl/dr : Obwohl Sie das Guthaben in Ihrem JWT speichern könnten und es vor Manipulationen geschützt wäre, gibt es viele Möglichkeiten, wie das Guthaben im JWT erstellt werden kann möglicherweise technisch gültig, aber immer noch falsch. Daher ist es wahrscheinlich am besten, jedes Mal den Kontostand in der Datenbank zu überprüfen, und Sie müssen ihn auf jeden Fall überprüfen, bevor Sie Transaktionen durchführen

Es gibt zwei Arten von Zeugen Jehovas:

  1. JWS: Payload ist im "Klartext" und hat eine Signatur, um den Inhalt zu bestätigen
  2. JWE: Die Nutzdaten sind vollständig verschlüsselt.

Diese haben leicht unterschiedliche Anwendungsfälle. Wenn Sie lediglich überprüfen müssen, ob die im JWT gespeicherten Daten korrekt sind und nicht manipuliert wurden, ist ein JWS in Ordnung (vorausgesetzt, Sie implementieren es ordnungsgemäß und überprüfen die Signatur bei allen Anforderungen). Daher können Sie den Kontostand in einem JWS speichern und später bestätigen, dass der gemeldete Kontostand dem entspricht, den Sie ursprünglich gespeichert haben.

Wenn Sie die Daten auch privat halten möchten, können Sie einen JWE verwenden. Die Verschlüsselung garantiert auch, dass die Daten nicht geändert werden (vorausgesetzt, Sie implementieren das JWE ordnungsgemäß). Beachten Sie, dass die einzige Person, die normalerweise Zugriff auf das JWT hat, der Endbenutzer ist. Wir sprechen daher davon, es für sie privat zu halten - wahrscheinlich nicht erforderlich für Ihren Anwendungsfall (h/t EdC ).

Daher ist die Waage vor Manipulationen geschützt.

In beiden Fällen sollten Sie den Kontostand mit der Datenbank überprüfen, bevor Sie eine tatsächliche Transaktion durchführen, da:

Der Kontostand ist möglicherweise immer noch falsch. Wenn eine andere Transaktion ohne Aktualisierung eines JWT durchgeführt wurde oder wenn ein alter JWT angezeigt wird (auch bekannt als Wiederholungsangriff), dann Sie können eine gültige JWT haben, die das falsche Guthaben hat. Dies ist sehr wahrscheinlich auch ohne aktive Angreifer. Stellen Sie sich einen Benutzer vor, der mehr als eine App verwendet. Was passiert in Ihrem hypothetischen Szenario, wenn ein Kontostand in einem JWT auf einem Gerät gespeichert ist und sich der Benutzer dann bei einem anderen Gerät anmeldet und eine Transaktion durchführt? Die Daten im JWT für das erste Gerät sind jetzt falsch, obwohl das JWT selbst gültig ist und nicht abgelaufen ist. Dies ist nur eine von vielen Möglichkeiten, wie gültige, aber falsche JWTs auftreten können.

Es gibt viele Möglichkeiten, Probleme mit veralteten Daten in einem JWT zu beheben, aber am Ende sind diese Korrekturen möglicherweise mehr Arbeit als jedes Mal die Datenbank zu überprüfen. Dies ist jedoch ein Balanceakt, der letztendlich bei Ihnen liegt! Da gibt es keine richtige Antwort.

30
Conor Mancone

Ja, Sie sollten die Datenbank bei jeder Anforderung abfragen. Wenn Sie einen JWT-Ansatz verwenden, verlassen Sie sich darauf, dass der Client die richtige JWT sendet. Wenn Sie vorschlagen, das Guthaben auf dem JWT zu speichern, gehe ich davon aus, dass Sie bei jeder Änderung des Guthabens ein neues JWT generieren möchten. Das Problem besteht darin, dem Client zu vertrauen, dass er die richtige JWT sendet.

Beispiel

  • 00:00 - Ich greife auf die App zu. Ein JWT wird mit meinem Guthaben (10 USD) und einer Lebenszeit von 15 Minuten erstellt. Nennen wir dies "Token 1".
  • 00:05 - Ich kaufe 5 US-Dollar. Dies führt vermutlich dazu, dass der Server eine neue JWT mit einem Saldo von 5 USD generiert. Nennen wir dies "Token 2".
  • 00:10 - Ich versuche einen Kauf von 10 $ zu tätigen. Ich habe jedoch meine App so geändert, dass Token 1 gesendet wird (anstatt Token 2). Es ist immer noch effektiv und hat einen Saldo von 10 US-Dollar. Warum würde die Transaktion ohne Überprüfung der Datenbank nicht abgeschlossen werden?
18
Andy N

Das Abfragen der Datenbank bei jeder Anforderung würde den Hauptvorteil der Verwendung eines JWT zunichte machen - dass Sie nicht auf die Datenbank zugreifen müssen. Angenommen, Sie sind mit JWT korrekt , ist es sicher, Informationen darin zu speichern. Da es signiert ist, kann ein Angreifer nicht mit dem Inhalt herumspielen.

Edit : Die Signatur stellt zwar sicher, dass die Nutzdaten nicht verfälscht werden, garantiert jedoch nicht es ist immer noch auf dem neuesten Stand. Siehe Andy Ns sehr gute Antwort .

4
Anders