Bislang haben wir über die technischen Eigenschaften von JWT-Token gesprochen. Die Verwendung von JWT in der Praxis erfordert jedoch eine sorgfältige Prüfung der Sicherheitsmerkmale eines JWTs.
In den meisten Fällen werden JWT in Form von Inhaber-Token verwendet. Ein Inhaber-Token ist ein Token, das von jedem verwendet werden kann, der es besitzt. Folglich reicht es, wenn ein Angreifer ein solches Token erhält, damit er die mit diesem Token verbundenen Rechte missbrauchen kann. In diesem letzten Abschnitt werden wir kurz einige Anwendungsfälle beleuchten.
JWT in OpenID Connect
Wir haben die Verwendung von JWT in OpenID Connect bereits erwähnt. Der Anbieter stellt dem Client ein Identitäts-Token aus. Dieses Identitäts-Token enthält Informationen über die Authentifizierung des Benutzers beim Provider. Das Identitäts-Token ist ein JWT-Token, das mit dem privaten Schlüssel des Providers signiert ist.
OpenID Connect hat große Anstrengungen unternommen, um die Sicherheitsmerkmale der Identitäts-Token zu verbessern. So schreibt das Protokoll beispielsweise die Verwendung der Ansprüche "exp", "iss" und "aud" vor. Außerdem enthält das Token eine Nonce, um Replay-Angriffe zu verhindern. Diese Anforderungen bewirken, dass der Missbrauch eines gestohlenen Identitäts-Tokens erschwert oder sogar ausgeschlossen wird.
JWT als OAuth 2.0-Zugangs-Token
Ein OAuth 2.0-Zugangs-Token ist ein weiterer guter Anwendungsfall für ein JWT. Es ermöglicht einer Client-Anwendung den Zugriff auf eine geschützte Ressource, wie z. B. eine API. OAuth 2.0-Zugangs-Token gibt es in zwei Varianten: Referenz-Token und in sich geschlossene Token.
Ein Referenz-Token verweist auf serverseitige Metadaten, die vom Autorisierungsserver aufbewahrt werden. Ein Referenz-Token fungiert als Bezeichner, ähnlich wie eine herkömmliche Sitzungskennung (Session-ID).
Ein in sich geschlossenes Token liegt als JWT vor. Alle Metadaten sind in der Nutzlast enthalten. Zum Schutz der Daten signiert der Aussteller das Token mit einem privaten Schlüssel.
Herkömmliche OAuth 2.0-Token sind Inhaber-Token. Wird eines dieser Token kompromittiert, kann es von demjenigen, der es besitzt, uneingeschränkt genutzt werden. Ein kompromittiertes Referenz-Token kann vom Autorisierungsserver widerrufen werden. Bei in sich geschlossenen Token ist der Widerruf wesentlich schwieriger.
Es wird daher dringend empfohlen, die Lebensdauer von Zugangs-Token so kurz wie möglich zu halten. Es ist durchaus üblich, dass Token nach Minuten oder Stunden ablaufen. Ablaufzeiten von mehreren Tagen oder Monaten sind nicht empfohlen. Wenn möglich, sollten kurzlebige Zugangstoken mit Refresh-Token kombiniert werden, um die Sicherheit zu erhöhen.
Darüber hinaus sollen moderne Ergänzungen der Spezifikation die Eigenschaften von Inhaber-Token verbessern, indem JWT mit Mechanismen für den Besitznachweis.
als Sitzungsobjekte eingeführt werden
Protokolle wie OpenID Connect und OAuth 2.0 sind ein tatkräftiger Versuch, die Schwachstellen von JWT auszumerzen. Leider gibt es auch viele Anwendungen, die JWT in ihre Architektur einbauen, ohne diese Vorsichtsmaßnahmen zu berücksichtigen.
Ein konkretes Beispiel ist eine Anwendung, die JWT einsetzt, um den Autorisierungsstatus auf dem Client zu speichern. Dies ermöglicht die Verwendung eines zustandslosen Backends und erleichtert damit die Bereitstellung erheblich.
Ein solcher Kunden-seitiger Token ist jedoch ein Inhaber-Token. Ohne eine kurze Ablaufzeit oder einen Widerrufsmechanismus ist ein solches Szenario extrem anfällig.
Darauf genauer einzugehen, würde den Rahmen dieses Artikels sprengen. Wenn Sie mehr über diese Themen erfahren möchten, empfehlen wir Ihnen die Lektüre von „Stop using JWT for sessions.“