JSON Web Token (JWT)
Besonders in verteilten und auf Micro-Services basierten Anwendungen hat sich in den letzten Jahren eine rollenbasierte Zugriffskontrolle herauskristallisiert. Vor allem auch im beliebten und äußerst komfortablen SSO-Prozess (Single-Sign-On) haben sich die JSON Web Token (JWT) besonders bewährt. Die JWT sind darüber hinaus aber auch noch wesentlich flexibler in Client-Server Prozessen einsetzbar, wo signierte und verschlüsselte Informationen übertragen werden müssen.
Das Thema Sicherheit spielt hier eine besonders große Rolle und stellt im Umfeld von Micro-Services und einem dazu passenden Design auch eine besondere Herausforderung dar. Im Vergleich zu Sessions und Cookies sind die JSON Web Tokens „zustandslos“. Aus diesem Grund müssen jedwede Client-Server-Anfragen auch mit allen benötigten Informationen für die Verarbeitung bestückt werden. Der auf OpenID Connect (OIDC) basierte JWT-Standard ist hierfür jedoch besonders geeignet.
Die Vorteile von JSON Web Token
Im Vergleich mit herkömmlichen Methoden zur Autorisierung wie beispielsweise der Möglichkeit Cookies auf den Systemen abzulegen oder mit einer PHP-Session zu arbeiten, bietet die Anwendung von JSON Web Tokens erhebliche Vorteile. Die wichtigsten Vorteile auf einen Blick:
-
Die Verwendung von JSON Web Tokens ist zustandslos und damit sicherer, als ein Einsatz mit Sessions-Variablen und Cookies. Die für eine Authentifizierung nötigen Informationen werden bei jedem Request erneut mitgeliefert und verifiziert.
-
Die JSON Web Token können sehr einfach in vielen Frameworks und Programmiersprachen wie beispielsweise .NET, Phyton, Java, Java-Script, Pearl oder Ruby ohne großen Integrationsaufwand eingebunden und genutzt werden. Eine vollständige Liste finden Sie im Projekt jwt.io.
-
Einer der größten Vorteile der JWT ist die äußerst zuverlässige Authentifizierung. Zudem wird der erforderliche Netzwerk-Overhead auf ein absolutes Minimum reduziert, was vor allem bei der Performance von mobilen Anwendungen deutlich zum Tragen kommt.
-
Beim Einsatz von JSON Web Tokens entsteht ein beispielsweise im Vergleich zu SAML-Anwendungen und RESTful-API’s deutlich kleinerer Footprint, was sich positiv auf die Gesamtperformance auswirkt.
Aufbau und Funktion des JWT
Ein JSON Web Token ist ein vergleichsweise einfaches Konstrukt, das ausschließlich als Textstring ausgelegt ist. Dieser String wird dann entweder als Request-Parameter oder im Header einer Client-/Serveranfrage übertragen. Der Aufbau des Tokens folgt dabei immer dem folgenden dreiteiligen Schema, wobei die Sequenzen mit Punkten getrennt werden:
-
Die erste Sequenz bezeichnet den Header des Tokens. Der Inhalt beschreibt zum einen den verwendeten Signatur- und/oder Verschlüsselungsalgorithmus sowie auch den verwendeten Token-Typ. Alle Informationen werden dabei im JSON-Format abgelegt und zusätzlich mit einem Base64-Algorithmus kodiert. Die Angaben werden als Wertepaare nach dem Schema
{"alg":"HS256", "typ":"JWT"}
erzeugt. Der Base64-Code für diesen Header wäre[e+KAnmFsZ+KAnDri
gJxIUzI1NuKAnCwg4
oCedHlw4oCcOu
KAnEpXVOKAnH0=]
. -
In der zweiten Sequenz wird der Payload, also eine beliebige Auflistung von Wertepaaren, angegeben. Die Wertepaare werden dabei auch als „Claims“ bezeichnet und können in registrierte, öffentliche und private Typen unterteilt werden. Ein entsprechendes Beispiel wäre hierzu;
{"IdNr":“140075“, "name":"Test", "vorname":"Manfred"}
. Dieser Payload entspricht in Base64 codiert der Sequenz[e+KAnklkTnLig
Jw64oCcMTQw
MDc14oCcLCDigJ5uY ` `W1l4oCcOuKAn
FRlc3TigJwsIO
KAnnZvcm5hbWXi
gJw64oCcTWFuZ
nJlZOKAnH0=]
. -
In der letzten Sequenz wird eine Signatur eingefügt, die aus den beiden Teilen mit Header und Payload und einem Secret-Parameter separat berechnet wird. Ein entsprechender Pseudocode soll die Berechnung symbolisch darstellen:
content=bas64UrlEncode(header)
.base64UrlEncode(payload)
.signature=HMACSHA256(content,secret)
.
Standarisierte Claims
Im Header eines Tokens wird in der Regel ein Claim (Wertepaar) verwendet, der einen bestimmten Zweck abbildet. Ein registriertes Claim ist seiner Funktion nach im RFC-7519 Standard festgelegt. Beispiele wären hier „sub“ für eine Benutzerangabe oder „exp“ für eine Zeitspanne und die Gültigkeit eines Tokens. Mit öffentlichen Claims können zusätzliche Wertepaare genutzt werden. Um Kollisionen mit registrierten Claims zu vermeiden, sind diese öffentlich registriert. Eine Übersicht hierzu finden Sie unter www.iana.org. Private Claims sind eigene Keys, die jedoch eine abweichende Semantik aufweisen können. Diese werden immer dann eingesetzt, wenn zwei Parteien einen expliziten Anwendungsfall abbilden möchten und hierzu einen speziellen Key vereinbaren wollen.
Der JWT-Flow - kurz und knapp
Der Einsatz von JSON Web Tokens ist sehr einfach gestaltet und der Autorisierungsflow schnell erklärt. Als Anwendungsbeispiel kann ein SSO oder auch ein klassisches Benutzerlogin dienen. Der Ablauf ist nach dem Login wie folgt:
-
Nach dem Absenden der Login-Daten prüft ein Autorisierungsservice die Anmeldedaten und erstellt ein neues JSON Web Token. In diesem Token sind neben dem Header auch das Payload und das Privat-Secret eingearbeitet und entsprechend signiert. Idealerweise verwendet man auch ein Ablaufdatum für die Token-Gültigkeit und erhöht damit auch die Sicherheit.
-
Eine Anwendung kann nun das so erstellte Token im Authorization-Header senden, um sich beispielsweise bei einer Webseite entsprechend zu autorisieren. Wie oben erwähnt, werden dabei die einzelnen Sequenzen des JWT mit Punkten voneinander getrennt.
-
Die Webseite oder auch ein Micro-Service kann nun das Token auf seine Gültigkeit prüfen. Im Positivfall ist der Nutzer dadurch legitimiert, wird als vertrauenswürdig eingestuft und darf nun die angebotenen Dienste des Anbieters nutzen.
Fazit
Mit JSON Web Tokens steht eine gut und vielseitig integrierbare und vor allem standardisierte Lösung für SSO und klassische Login-Implementierungen bereit. Daher sind die JWT besonders gut für die Autorisierung und den Informationsaustausch in gesicherten Umgebungen zwischen zwei Partnern geeignet. Durch die optionale und mehrfache Verschlüsselung wird die Integrität und Authentizität der Inhalte sichergestellt. Um die JSON Web Token in eigene Projekte zu integrieren, muss in der Regel nicht mehr selbst Hand angelegt werden. Es existieren eine Vielzahl an fertigen Implementierungen für unterschiedliche Programmiersprachen, die einfach genutzt werden können. Da in den JWT jedoch auch einige Sicherheitslücken bestehen, sollte man bei besonders sensiblen Daten vor allem den Payload sorgfältig und hoch verschlüsseln.