Was ist ein JSON Web Token (JWT)
Ein JSON Web Token, kurz JWT, ist ein genormtes Access-Token, das einen sicheren Austausch von Daten in Form von JSON-Objekten zwischen zwei Parteien ermöglicht. Da es alle wichtigen Informationen über eine Entität enthält, muss keine Datenbankabfrage erfolgen und die Session muss nicht auf dem Server gespeichert werden. Verifiziert durch eine digitale Signatur, werden JWTs häufig zur Authentifizierung und Autorisierung eingesetzt, wie z.B. zur Aktivierung von Single Sign-On (SSO)-Prozessen oder zur Sicherung von APIs. Durch die kompakte Struktur in Kombination mit der kryptografischen Validierung bieten JWTs eine robuste Option, um die Kommunikation zwischen den Beteiligten abzusichern.
Definiert und standardisiert sind JSON Web Tokens in der Spezifikation RFC 7519. RFC steht dabei für “Request for Comments”, das eine Reihe von nummerierten Dokumenten beschreibt, die Internetstandards, Protokolle und Konzepte definiert. Diese dienen als Grundlage für die Kommunikation zwischen verschiedenen Geräten im Internet.
JSON Web Tokens bestehen aus dem Textformat JSON und aus digitalen Berechtigungsnachweisen in Form von Token.
JSON
JSON steht für JavaScript Object Notation einem offenen und sprachunabhängigen Textformat, mit dem sich Daten speichern und übertragen lassen. Durch seine einfache Anwendung ist es ideal für Webanwendungen und APIs, da Menschen es leicht verstehen und es für Maschinen leicht zu generieren oder zu parsen ist.
Token
Token sind digitale Berechtigungsnachweise, die aus modernen Authentifizierungssystemen nicht mehr wegzudenken sind. Sie speichern die Identität und die Berechtigung eines Nutzers in einer kompakten und sicheren Form und stellen sicher, dass nur autorisierte Nutzer auf geschützte Ressourcen zugreifen können.
Aufbau des JSON Web Token
Ein signiertes JSON Web Token ist ein einfacher Zeichenstring, der aus drei Teilen besteht, die durch Punkte getrennt und in Base64 kodiert sind. Nutzer selbst sehen die Zeichenkette eines JSON Web Token in der Regel nicht. Aber sie interagieren damit bei der Nutzung einer Website oder Anwendung, die im Hintergrund JWTs verwendet. Die drei Teile, aus denen ein JSON Web Token bestehen sind Header, Payload und Signatur.
Header
Der Header, der meist aus zwei Teilen besteht, liefert wichtige Informationen über das Token. Er beschreibt, um welchen Token-Typ es sich handelt und welche Signatur- und/oder Verschlüsselungsmethode zum Einsatz kommt.
Payload
Der Payload enthält die tatsächlichen Nutzerinformationen, die an die Anwendung übermittelt werden sollen. Das können zum Beispiel Benutzer-ID, Name oder Ablaufzeit sein. Bereitgestellt als Key-/Value-Paare, werden diese Informationen auch als Claims bezeichnet, wobei hier eine Unterscheidung zwischen privaten, öffentlichen und registrierten Claims stattfindet. Payloads können dabei beliebig viele Claims enthalten. Je größer aber das JSON Web Token wird, desto mehr Ressourcen werden bei der (DE-)Kodierung benötigt. Ein JWT wird üblicherweise in den Kopfzeilen von HTTP-Requests übertragen. Darum gilt: Je größer das Token, desto größer wird auch der eigentliche Request. Es wird deshalb empfohlen, die im JWT enthaltenen Informationen auf das Nötigste zu begrenzen.
Signatur
Den Abschluss bildet die Signatur. Erstellt wird diese durch Kombination des kodierten Headers, der kodierten Payload, eines geheimen Schlüssels und der im Header vorgegebenen Signatur- beziehungsweise Verschlüsselungsmethode. Durch das Signieren ist sichergestellt, dass die Nachricht unterwegs nicht verändert wird und das der Absender des JSON Web Tokens derjenige ist, für den er sich ausgibt.
Dabei gibt es unterschiedliche Verfahren, je nach Sensibilität der Daten.
-
Keine Sicherung: Bei einem geringen Schutzfaktor kann auf eine Signatur verzichtet werden. Das JWT besteht hierbei nur aus Header und Payload und ist nach der Base64-Entschlüsselung im Klartext lesbar. Ob die Nachricht vom richtigen Absender stammt oder ob sie unterwegs verändert wurde, lässt sich in dem Fall nicht verifizieren. Eingesetzt wird dieses Verfahren so gut wie nie. Ohne Signatur bietet ein JWT keinen sicherheitsrelevanten Mehrwert und kann funktional durch andere, einfachere Datenformate ersetzt werden.
-
Signatur (JWS): Das Schema JSON Web Signature (JWS) kommt dann zum Einsatz, wenn sichergestellt werden soll, dass die Nachricht vom richtigen Absender stammt und unterwegs nicht verändert wurde. Im Normalfall reicht diese Prüfung aus. Auch bei diesem Verfahren kann nach der Base64-Entschlüsselung, die Payload im Klartext gelesen werden. Signatur (JWS) gilt als Standard-Verfahren und wird von fast allen Systemen eingesetzt.
-
Signatur (JWS) und Verschlüsselung (JWE): Zusätzlich zur JSON Web Signature (JWS) kann eine JSON Web Encryption (JWE) eingesetzt werden. Hierbei verschlüsselt die JWE die Inhalte des Payloads, die im Anschluss mit JWS signiert werden. Entschlüsselt werden die Inhalte durch Angabe eines gemeinsamen Kennworts oder eines privaten Schlüssels. Der Payload ist nach der Base64-Entschlüsselung nicht im Klartext lesbar, der Absender ist verifiziert und die Nachricht authentisch und vertraulich. Dieses Verfahren ist eine Randerscheinung und wird nur selten eingesetzt, da die Unterstützung durch Anwendungen sehr begrenzt ist. In der Praxis reicht es in der Regel aus, das Signaturverfahren (JWS, siehe Punkt 2) in Kombination mit gesicherten und geschützten Verbindungen zu verwenden und die im Payload enthaltenen Informationen auf das notwendige Minimum zu beschränken.
Bei jedem der genannten Verfahren sollte zusätzlich SSL (Secure Sockets Layer) verwendet werden, um eine verschlüsselte Verbindung zwischen Client (z. B. einem Webbrowser) und Server herzustellen, um die Daten während der Kommunikation zu schützen.
Funktionsweise eines JSON Web Token
Die Funktionsweise eines JSON Web Tokens lässt sich gut anhand eines Benutzer-Logins erklären:
Meldet sich ein Benutzer mit seiner E-Mail-Adresse und seinem Passwort an, erstellt der Server ein JSON Web Token. Dieser Token wird mit den entsprechenden Informationen kodiert und mit einem geheimen Schlüssel (secret) oder einem privaten Schlüssel (bei asymmetrischer Signatur) signiert, um Missbrauch zu verhindern. Nach der Erstellung des JWT, wird dieses an den Client gesendet und lokal gespeichert.
Bei jeder erneuten Anfrage an den Server, sendet der Client das JWT beispielsweise als Parameter im GET-Request. Der Server entschlüsselt das JWT, prüft die Authentizität des Tokens und die Angaben wie Aussteller, Zielgruppe und Gültigkeitsdauer. Nach erfolgreicher Prüfung erhält der Client Zugriff auf die angefragte Ressource.
Für zusätzliche Sicherheit sorgt eine Ablaufzeit mit der JWTs in der Regel versehen sind. So prüft der Server während der Validierung die Gültigkeitsdauer des Tokens und lehnt eine Bearbeitung ab, wenn es abgelaufen ist. In diesem Fall wird der Client aufgefordert, das Token zu aktualisieren.
Vorteile bei der Verwendung von JSON Web Tokens
Für Anwendungen die Informationen zwischen verschiedenen Systemen austauschen, sind JSON Web Tokens sehr nützlich. Sie ermöglichen den sicheren Austausch sensibler Daten, sind äußerst flexibel, skalierbar und leichtgewichtig. So können sie von mobilen Anwendungen, einfach verwendet werden.
Weitere Vorteile sind:
-
Sicherheit: JSON Web Tokens werden mit einem gemeinsamen Geheimnis (secret) oder asymmetrisch mit einem Paar öffentlicher/privater Schlüssel signiert. So wird sichergestellt, dass die Daten bei der Übertragung nicht manipuliert werden. Darüber hinaus lässt sich die Gültigkeit eines JWT durch ein Ablaufdatum zeitlich begrenzen.
-
Authentifizierung: Alle erforderlichen Informationen sind im Token kodiert, was serverseitige Datenbanken und die Abfrage von Datenbanken während der Nutzerauthentifizierung überflüssig macht. Dies verbessert die Performance und führt zu schnelleren Antwortzeiten.
-
Datenintegrität: Beim Versuch ein Token zu missbrauchen, wird die Signatur ungültig gemacht. JWTs stellen so sicher, dass die Daten nicht manipuliert wurden und der Absender immer der Richtige ist.
-
Flexibilität: JWT sind mit mehreren Programmiersprachen kompatibel und lassen sich in verschiedene Plattformen integrieren. Dies ermöglicht eine einfache Integration in diverse Umgebungen und Technologie-Stacks.
-
Zustandslos: Benutzerinformationen werden direkt im JWT gespeichert, sodass der Server selbst, keinen Sitzungsstatus speichern muss. Somit eignen sich JWTs perfekt für skalierbare Systeme.
Nachteile bei der Verwendung von JSON Web Tokens
Wo Licht ist, da ist auch Schatten. Und auch wenn JWTs viele Vorteile bieten, so wollen wir hier auch die Nachteile nennen, die es bei der Verwendung von JSON Web Tokens gibt.
-
Der größte Nachteil von JWTs ist die Nicht-Widerrufbarkeit. Ein einmal signiertes JSON Web Token kann nicht widerrufen oder aktualisiert werden, selbst bei einer Änderung der Benutzerrechte. Es wird so lange als gültig angesehen, wie die Signatur gültig und nicht abgelaufen ist. Die Gültigkeitsdauer des JWTs sollte deshalb mit Bedacht gewählt werden. Hier hat sich der Wert 15 Minuten als Standard-Kompromiss etabliert.
-
Ein weiterer Nachteil ist die Größe. JSON Web Tokens enthalten Daten (Claims), eine Signatur und oft auch ein Request und sind somit größer als traditionelle Session-Tokens, was zu einem höheren Bandbreitenverbrauch führt. Auch werden JWTs fast immer in den Kopfzeilen (Headern) des HTTP-Requests übertragen, wofür es gute Gründe gibt. Diese Header haben aber zumeist eine technische Längenbeschränkung, die durch ein zu großes JWT schnell erreicht werden kann. Dies führt dazu, dass HTTP-Requests schlicht vom Server abgelehnt werden, bevor sie überhaupt verarbeitet werden. Die Längenbeschränkung dient dabei oft dazu, um z.B. Hacker auszusperren oder um DDoS-Attacken zu erschweren. Deshalb sollte ein JSON Web Token nur die nötigsten Informationen enthalten, um den Traffic möglichst gering zu halten.
-
Zu guter Letzt das Thema Datenschutz. Die Nutzdaten, also die Payload eines JWTs sind in Base64-kodiert und nicht verschlüsselt. Die Daten werden zwar in ein für Menschen schwer lesbares Textformat umgewandelt, allerdings lässt sich dieser Vorgang leicht rückgängig machen. Jeder, der einen Token abfängt, kann die darin enthaltenen Informationen (z.B. die Benutzer-ID) lesen. Wichtig ist deshalb die richtige Kombination von Signatur, einer kurzen Gültigkeitsdauer und von Refresh-Tokens, um zu verhindern, dass Daten offengelegt werden und es zu einem unbefugten Zugriff kommt.
Anwendungsfälle für JSON Web Token
Aufgrund der erhöhten Sicherheit und Flexibilität sind JSON Web Tokens die ideale Wahl für unterschiedliche Authentifizierungsverfahren. Sie werden hauptsächlich für die zustandslose Authentifizierung, Autorisierung und Sitzungsverwaltung in modernen Anwendungen genutzt. JWTs ermöglichen sowohl serverseitigen als auch clientseitigen Anwendungen, Benutzer sicher zu authentifizieren und wichtige Informationen auszutauschen, ohne dass für jede Anfrage eine Datenbankabfrage erfolgen muss. Nachfolgend einige der häufigsten Anwendungsfälle für JSON Web Tokens:
-
Single Sign-On (SSO) Systeme: Benutzer melden sich einmal an und können dann auf unterschiedliche verbundene Anwendungen zugreifen, ohne erneute Authentifizierung.
-
Microservice-Architektur: Indem JSON Web Tokens die Authentifizierungsinformationen direkt weitergeben, erleichtern sie die sichere Kommunikation über mehrere Dienste hinweg.
-
API-Sicherheit: JWTs werden verwendet, um eine sichere API-Autorisierung zu gewährleisten und um sicherzustellen, dass nur autorisierte Anfragen verarbeitet werden.
-
Mobile Anwendungen: JWTs sind einfach zu handhaben und leichtgewichtig und somit ideal für die sichere Authentifizierung für API-Anfragen auf iOS und Android Geräten.
-
Cross-Origin Resource Sharing (CORS): Da JSON Web Tokens nicht auf Cookies angewiesen sind, vereinfachen sie die Authentifizierung über verschiedene Domains hinweg.
-
Einmalige Zugänge: JWTs haben einen integrierten Ablaufmechanismus was sie perfekt für temporäre Links wie E-Mail-Verifizierungen oder Passwort-Resets macht.
Fazit
Ein JSON Web Token (JWT) ist ein mächtiges Werkzeug und somit ideal für Authentifizierung und Datenaustausch. Server müssen keinen Sitzungsstatus speichern, da JWTs alle notwendigen Informationen enthalten. Sie sind flexibel, skalierbar, kompakt und leicht übertragbar.
Aber JWTs sind nicht per se verschlüsselt. Sensible Daten müssen deshalb zusätzlich durch JSON Web Encryption (JWE) verschlüsselt werden. Auch sollte die Gültigkeitsdauer mit Bedacht gewählt werden, wobei kurze Zeiten empfohlen werden.
So bilden JSON Web Tokens zusammen mit OpenID Connect (OIDC) und OAuth 2.0, eine gute, moderne Basis für die sichere Authentifizierung und Autorisierung.
