2016-07-14 11 views
0

Es gibt einen REST-API-Dienst in Entwicklung, der verschiedene Suchmethoden über die interne SQL-Datenbank für Benutzer bereitstellt, die eine Anfrage stellen. Die Datenbank enthält mehrere Tabellen, und jede davon hat die Spalte user_id, dh einen Referenzschlüssel für die ID-Spalte in der Benutzertabelle (eindeutige ganze Zahl, Primärschlüssel). Das ist wichtig.Ausblenden der internen Benutzer-ID aus dem JWT-Token

Wenn sich der Benutzer von der Client-App anmeldet, erhält er das JWT-Token, das den Abschnitt "sub" mit dem Benutzer-ID-Wert enthält. Wenn der Benutzer dann eine der API-Methoden aufruft, stellt er nur das JWT-Token zur Verfügung, sodass die API die Benutzer-ID von "sub" erhält und die Suchanfrage an die entsprechende Tabelle sendet. Da jede Tabelle eine user_id-Spalte hat, müssen in SQL-Abfragen keine Join-Benutzertabellen erstellt werden (wenn in der Antwort keine Benutzerinformationen benötigt werden).

Das Problem ist, dass das Aussetzen der internen Benutzer-ID eine schlechte Vorgehensweise ist, die Sicherheits-/geschäftliche Probleme verursachen kann. Also ich suche es zu verstecken. Im Moment sehe ich die folgenden Optionen:

  • Änderung des Benutzer-ID in String-Spalte (mit sequentieller GUID), aber dies ist eine große Bruchänderung für unser System

  • vorhandene Benutzertabelle mit zusätzlicher ext_user_id Spalte (GUID), und verwenden Sie diesen Wert im JWT-Token. Nachteil ist, dass jede SQL-Abfrage "Join" zur Benutzertabelle hat, um den Benutzer-ID-Wert zu erhalten.

  • Datenbank unverändert lassen, aber JWE-Token anstelle von JWT verwenden. Nachteil ist, dass jede API-Anfrage eine Token-Entschlüsselung durchführt, die die Leistung beeinträchtigen kann.

Vielleicht gibt es andere Option? Oder einer dieser Ansätze hat mehr Vorteile als andere (eigentlich außer dem ersten)?

Antwort

1

Grundsätzlich denke ich, das sind die Möglichkeiten, die Sie haben.

Sie konzentrieren sich auf die Leistung. Mit Lösung 2 und 3 müssen Sie den Aufwand einer SQL-Abfrage vergleichen/Join, um die Benutzer-ID mit der Entschlüsselung der JWE Token zu erhalten.

JWE Entschlüsselungszeit wird immer im Grunde die gleiche sein, mit einem symmetrischen Schlüssel wahrscheinlich ein paar Millisekunden Prozessorzeit. Eine Datenbankabfrage erfordert jedoch einen Festplattenzugriff und hängt von anderen Faktoren ab: Anzahl der Datensätze, Anzahl der Verknüpfungen, Zugriffszeit auf die Festplatte usw. Es ist nicht möglich, Ihnen ein absolutes Maß zu geben, ohne das Problem im Detail zu kennen. Ich schlage vor, Sie empirisch den Aufwand für das jeweils zu messen und beurteilen, ob es ein Problem für Sie

Neben Leistung Ich schlage vor, die Bewertung Sicherheiten Probleme durch die ID versteckt:

Müssen Sie, dass die Client kennt die ID in Ihrer REST-API?

Zum Beispiel, wenn Sie eine Ressource, die die ID wie dieses

/user/{userId}/getSomeData 

JWE wird nicht sinnvoll verwendet, da Sie eine Kennung in irgendeiner Weise

Sie zur Verfügung stellen müssen benötigen Sie dass ein Client JWT dekodiert?

Wenn Sie JWE verwenden, dekodieren kann der Client nicht, weil es nicht die Entschlüsselung hat Schlüssel

Wie viele Orte in Ihrem Server Sie die GUID-ID zu konvertieren?

Sie eine Abfrage für jeden benötigen, oder eine Abfrage allgemeinen Umwandlung in einem Filter am Eingangspunkt