JSON Web Tokens sind ein Standard, um sogenannte Claims sicher zu übertragen. Claims im Zusammenhang mit JWT können Definitionen oder Bestätigungen eines Objektes oder einer Person sein. Im Falle der Authentifizierung mit JWT ist der Claim eine Bestätigung der Identität eines Anwenders.
JWT haben mittlerweile in alle grösseren, und auch viele kleinere, Frameworks Einzug gehalten, und es gibt viele Möglichkeiten, die Funktionalitäten von JWT für beliebige Webprojekte einzubinden.
Was ist ein JSON Web Token?
Konkret sieht ein JWT zum Beispiel so aus:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3 ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95Or M7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
Während man dieser Zeichenfolge von Auge kaum einen Sinn oder Bedeutung abgewinnen kann, handelt es sich hier tatsächlich um eine sehr kompakte Darstellung von einer Serie von Claims, zusammen mit einer Signatur, um die Authentizität, also die Vertrauenswürdigkeit, des JWT zu bestätigen. Genauer genommen ist es eine abgewandelte Form der Base64-Codierung, welchhe URI-sicher ist, das heisst alle Zeichen des Base64-Satzes, welche in URI's spezielle Verwendungszwecke haben wurden durch andere Zeichen ersetzt. Die drei Teil eines JWT - Header, Payload und Signatur, werden durch einen Punkt (".") getrennt.
Der eigentliche Inhalt dieses Tokens könnte als JSON-Objekt dargestellt zum Beispiel wie folgt sein:
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Der erste Block ist der sogenannte "Header" und enthält Information darüber, was für eine Art JWT es ist, da es eine grosse Bandbreite an Untertypen und -standards gibt.
Der zweite Block wird "Payload" genannt und enthält die eigentlich interessanten Daten: Die Claims. Jede Zeile ist dabei ein Claim. Einige dieser Claims sind in der JWT-Spezifikation definiert, andere können individuell definiert werden.
JWTs werden in der Regel in Headers von GET und POST-Requests verschickt.
Anwendungsfälle
JSON Web Tokens sind hauptsächlich für ihre Verwendung in Loginsystemen bekannt. Aber neben diesem Anwendungsfall gibt es noch viele weitere, wovon zwei hier kurz vorgestellt werden sollen:
Client-side/Stateless Sessions
Stateless Sessions sind Daten, welche auf Benutzerseite generiert werden. Für den Fall, dass sie an das Backend gesendet werden, kann JWT verwendet werden, um die Daten zu signieren und verschlüsseln. Denn client-seitige Daten stehen immer im Risiko, verfälscht oder sabotiert zu werden, weshalb diese im Backend mit grosser Vorsicht behandelt werden müssen. JWT kann mit zwei anderen, jedoch simultan entwickelten Standards verknüpft werden: JWS (JSON Web Signatures) kann für die Signierung von JWT's verwendet werden, um deren Integrität sicherzustellen. JWE (JSON Web Encryption) dient dazu, JWT's zu verschüsseln, um zu verhindern, dass diese unerlaubt ausgelesen werden.
Ein Beispiel für diese Art von JWT wäre etwa die Auswahl in einem Warenkorb eines Webshops, welcher mit einem clientseitigen Framework (z.B. Angular) aufgebaut ist. Diese Daten müssen vor Verfälschung und unerlaubtem Auslesen geschützt werden.
Federated Identity
In gewissen Login-Systemen übernimmt ein separater Server, ein sogenannter Authentication Provider, die Authentifizierung. Das bedeutet, wenn der Benutzer einen Request absetzt, welcher benötigt, dass sich der Benutzer zuerst authentifiziert, wird dieser an den Authentication Provider weitergeleitet. Bei dieser kann sich der Benutzer dann einloggen. Der Authentication Provider generiert dann das Token, welches ein JWT sein kann, um die ursprünglich angefragte Ressource zu erhalten.
JWT funktioniert gut mit den bekannten Authentifizierungs-Protokollen OpenID Connect und OAuth2, obschon diese auch mit anderen Standards als JWT funktionieren würden.
Für die konkrete Implementierung gibt es für jedes geläufige Webframework entsprechende JWT-Frameworks und ausführliche Tutorials zur Einbindung.
Quelle für alle Angaben ist das sehr empfehlenswerte und weit ausführlichere E-Book "The JWT Handbook" von Sebastián Peyrott, welches kostenlos heruntergeladen werden kann: https://auth0.com/resources/ebooks/jwt-handbook