JSON Web Tokens (JWT) sind heutzutage eine der gebräuchlichsten Methoden zur Authentifizierung und Autorisierung von Benutzern in Webanwendungen und APIs. Sie bieten eine kompakte und sichere Möglichkeit, Informationen zwischen verschiedenen Parteien auszutauschen und zu überprüfen. Heute geht es um die Grundlagen von JSON Web Tokens, ihre Struktur, Vorteile und Nutzungsszenarien sowie mögliche Sicherheitsbedenken. Wem JSON so gar nicht bekannt ist, dem ist der Beitrag über JSON vorab zu empfehlen 😉
Grundlagen von JSON Web Tokens
JWTs sind als offener Standard definiert (RFC 7519) (Siehe Beitrag über RFC und HAL) und sind in vielen Programmiersprachen und Plattformen implementiert. Ein JWT besteht aus drei Teilen: Header, Nutzlast (Payload) und Signatur. Diese Teile sind durch Punkte getrennt und bilden einen kompakten Token, die man beispielsweise in einem https-Header oder einer URL übertragen kann.
Struktur von JWT
Header
Der Header enthält Informationen über den verwendeten Algorithmus zur Signatur des Tokens und den Token-Typ. Typischerweise sieht ein Header folgendermaßen aus:
{
"alg": "HS256",
"typ": "JWT"
}
Nutzlast (Payload)
Die Nutzlast enthält die eigentlichen Informationen, die man zwischen den Parteien austauscht. Diese Informationen bezeichnet man auch als Claims. Der Payload kann sowohl vordefinierte als auch benutzerdefinierte Claims enthalten.
Siehe nachfolgendes Beispiel:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
oder
{
"user_id": "42"
}
Im zweiten Beispiel ist user_id der Claim-Schlüssel und 42 der zugehörige Wert. Diesen Claim kann man beispielsweise in einem JWT verwenden, um den authentifizierten Benutzer zu identifizieren.
Signatur
Die Signatur dient dazu, die Integrität des Tokens sicherzustellen und zu verhindern, dass man dessen Inhalt manipulieren kann. Dier Erstellung erfolgt durch die Verwendung eines geheimen Schlüssels und des im Header angegebenen Algorithmus (z. B. HMAC-SHA256).
Vorteile von JWT
Stateless und skalierbar
JWTs ermöglichen eine stateless Authentifizierung, da die Nutzlast alle erforderlichen Informationen enthält. Dies bedeutet, dass man keine Sitzungsdaten auf der Serverseite speichern muss. Dadurch sind und bleiben Anwendungen leichter skalierbar.
Einfache Implementierung
Da JWTs auf dem weit verbreiteten JSON-Format basieren, ist ihre Implementierung einfach und sie unterstützt eine Vielzahl von Bibliotheken und Frameworks.
Selbstenthaltend
JWTs enthalten alle erforderlichen Informationen in sich selbst. Dadurch sind keine zusätzlichen Datenbankabfragen zur Verifizierung des Benutzers erforderlich.
Nutzungsszenarien von JWT
Authentifizierung
Man nutzt JWTs häufig zur Authentifizierung von Benutzern in Single-Page-Anwendungen (SPAs) Single Page Applications und APIs.
Autorisierung
Man kann ein JWT auch zur Autorisierung verwenden. Dies lässt sich bewerkstelligen, sofern Informationen über die Rollen und Berechtigungen des Benutzers in den Claims des Tokens enthalten sind.
Informationen teilen
Da JWTs einfach zu erstellen und zu verifizieren sind, kann man sie verwenden, um Informationen zwischen verschiedenen Diensten oder Parteien sicher auszutauschen.
Sicherheitsbedenken und Best Practices
Sichere Übertragung
Man sollte JWTs immer über sichere Kommunikationskanäle wie https übertragen, um Man-in-the-Middle-Angriffe zu verhindern.
Gültigkeit bzw. Ablaufzeit
Tokens sollten eine Gültigkeit bzw. Ablaufzeit (Expiration Time) enthalten, um das Risiko einer Kompromittierung zu minimieren. Sobald ein Token abgelaufen ist, kann man nicht mehr auf die Ressource zugreifen. Dies schafft eine weitere Sicherheitsinstanz, da der Angreifer, selbst wenn er den Zugang gehacked hat, im Besitz des immer wieder neu generierten Tokens sein muss.
Aufbewahrung von geheimen Zugangsdaten
Man sollte den geheimen Schlüssel, den man zur Signatur von JWTs verwendet, sicher aufbewahren und vor unbefugtem Zugriff schützen.
Die Wahl des richtigen Algorithmus
Man sollte einen sicheren Algorithmus für die Signatur von Tokens verwenden. Beispielsweise HMAC-SHA256 oder RSA. Dies, davon ist auszugehen, kann sich mit der fortschreitenden Entwicklung der Quantencomputertechnologie ändern. Folglich ist es immer von enormer Wichtigkeit, die Entwicklungen dahingehend zu beobachten.
Token – Hijacking)
Man sollte darauf achten, dass JWTs nicht im Local Storage oder Session Storage des Browsers gespeichert sind. Dies kann die Seite bzw. Anwendung anfällig für Cross-Site-Scripting-Angriffe (XSS) machen. Daher kann es Sinn machen, https-Only-Cookies zu verwenden.
Fazit
JSON Web Tokens bieten eine moderne, flexible und sichere Methode zur Authentifizierung und Autorisierung von Benutzern in Webanwendungen und APIs. Durch die Stateless-Natur, einfache Implementierung und Selbstenthaltung von JWTs lassen sich skalierbare Lösungen für die Identitätsverwaltung erstellen. Dennoch sollte man sich der Sicherheitsrisiken bewusst sein und Best Practices befolgen, um die Integrität und Sicherheit der Anwendung zu gewährleisten.