(Aus diesem Thread hervorgegangen, da dies wirklich eine eigene Frage ist und nicht spezifisch für NodeJS usw.)
Ich implementiere einen REST-API-Server mit Authentifizierung und habe die Behandlung von JWT-Token erfolgreich implementiert, sodass sich ein Benutzer über einen / login-Endpunkt mit Benutzername / Kennwort anmelden kann, auf dem ein JWT-Token aus einem Servergeheimnis generiert und an das zurückgegeben wird Klient. Das Token wird dann in jeder authentifizierten API-Anforderung vom Client an den Server übergeben, bei der das Servergeheimnis zur Überprüfung des Tokens verwendet wird.
Ich versuche jedoch, die Best Practices genau zu verstehen, wie und in welchem Umfang das Token validiert werden sollte, um ein wirklich sicheres System zu erstellen. Was genau sollte bei der "Validierung" des Tokens eine Rolle spielen? Reicht es aus, dass die Signatur mithilfe des Servergeheimnisses überprüft werden kann, oder sollte ich auch das Token und / oder die Token-Nutzdaten mit einigen auf dem Server gespeicherten Daten vergleichen?
Ein tokenbasiertes Authentifizierungssystem ist nur so sicher wie die Übergabe von Benutzername / Passwort bei jeder Anforderung, vorausgesetzt, es ist genauso oder schwieriger, ein Token zu erhalten, als das Passwort eines Benutzers. In den Beispielen, die ich gesehen habe, sind die einzigen Informationen, die zum Erstellen eines Tokens erforderlich sind, der Benutzername und das serverseitige Geheimnis. Bedeutet dies nicht, dass ein böswilliger Benutzer, der für eine Minute Kenntnis vom Servergeheimnis erlangt, nun im Namen eines jeden Benutzers Token erstellen kann , wodurch er nicht nur auf einen bestimmten Benutzer zugreifen kann, wie dies bei einem Kennwort der Fall wäre erhalten, aber in der Tat zu allen Benutzerkonten?
Dies bringt mich zu den Fragen:
1) Sollte sich die JWT-Token-Validierung darauf beschränken, die Signatur des Tokens selbst zu überprüfen, sich nur auf die Integrität des Servergeheimnisses zu verlassen oder von einem separaten Validierungsmechanismus begleitet zu werden?
In einigen Fällen habe ich die kombinierte Verwendung von Token und Serversitzungen gesehen, bei denen nach erfolgreicher Anmeldung über den Endpunkt / login eine Sitzung eingerichtet wird. API-Anforderungen validieren das Token und vergleichen die im Token gefundenen decodierten Daten mit einigen in der Sitzung gespeicherten Daten. Die Verwendung von Sitzungen bedeutet jedoch die Verwendung von Cookies und macht in gewissem Sinne den Zweck der Verwendung eines tokenbasierten Ansatzes zunichte. Dies kann auch bei bestimmten Clients zu Problemen führen.
Man könnte sich vorstellen, dass der Server alle derzeit verwendeten Token in einem Memcache oder ähnlichem aufbewahrt, um sicherzustellen, dass selbst wenn das Servergeheimnis kompromittiert wird, sodass ein Angreifer "gültige" Token erstellen kann, nur die genauen Token, die über den Endpunkt / login generiert wurden würde akzeptiert werden. Ist das vernünftig oder nur überflüssig / übertrieben?
2) Wenn die Überprüfung der JWT-Signatur das einzige Mittel zur Validierung von Token ist, dh die Integrität des Servergeheimnisses die Bruchstelle darstellt, wie sollten Servergeheimnisse verwaltet werden? Aus einer Umgebungsvariablen lesen und einmal pro bereitgestelltem Stapel erstellen (randomisiert?)? In regelmäßigen Abständen neu aktualisiert oder gedreht (und wenn ja, wie mit vorhandenen gültigen Token umgegangen wird, die vor der Drehung erstellt wurden, aber nach der Drehung überprüft werden müssen, reicht es möglicherweise aus, wenn der Server zu einem bestimmten Zeitpunkt das aktuelle und das vorherige Geheimnis beibehält). ? Etwas anderes?
Vielleicht bin ich einfach zu paranoid, wenn es um das Risiko geht, dass das Servergeheimnis kompromittiert wird, was natürlich ein allgemeineres Problem ist, das in allen kryptografischen Situationen angegangen werden muss ...
RSAPrivateKey privateKey
??