3. JSON Web Token (JWT) Overview (JWT-Übersicht)
JWTs stellen eine Menge von Ansprüchen als JSON-Objekt dar, das in einer JWS- und/oder JWE-Struktur kodiert ist. Dieses JSON-Objekt ist das JWT Claims Set (JWT-Anspruchssatz). Gemäß Abschnitt 4 von RFC 7159 [RFC7159] besteht das JSON-Objekt aus null oder mehr Name/Wert-Paaren (oder Membern), wobei die Namen Zeichenketten und die Werte beliebige JSON-Werte sind. Diese Member sind die vom JWT dargestellten Ansprüche. Gemäß Abschnitt 2 von RFC 7159 [RFC7159] kann (MAY) dieses JSON-Objekt Leerzeichen und/oder Zeilenumbrüche vor oder nach beliebigen JSON-Werten oder Strukturzeichen enthalten.
Die Membernamen innerhalb des JWT Claims Set werden als Claim Names (Anspruchsnamen) bezeichnet. Die entsprechenden Werte werden als Claim Values (Anspruchswerte) bezeichnet.
Der Inhalt des JOSE Headers beschreibt die kryptografischen Operationen, die auf das JWT Claims Set angewendet werden. Wenn der JOSE Header für ein JWS ist, wird das JWT als JWS dargestellt und die Ansprüche werden digital signiert oder MACed, wobei das JWT Claims Set das JWS Payload ist. Wenn der JOSE Header für ein JWE ist, wird das JWT als JWE dargestellt und die Ansprüche werden verschlüsselt, wobei das JWT Claims Set der vom JWE verschlüsselte Klartext ist. Ein JWT kann (MAY) in eine andere JWE- oder JWS-Struktur eingeschlossen werden, um ein Nested JWT (Verschachteltes JWT) zu erstellen, wodurch verschachtelte Signierung und Verschlüsselung durchgeführt werden können.
Ein JWT wird als Sequenz von URL-sicheren Teilen dargestellt, die durch Punkt-Zeichen ('.') getrennt sind. Jeder Teil enthält einen base64url-kodierten Wert. Die Anzahl der Teile im JWT hängt von der Darstellung des resultierenden JWS unter Verwendung der JWS Compact Serialization oder des JWE unter Verwendung der JWE Compact Serialization ab.
3.1. Example JWT (JWT-Beispiel)
Der folgende Beispiel-JOSE Header erklärt, dass das kodierte Objekt ein JWT ist und dass das JWT ein JWS ist, das mit dem HMAC SHA-256-Algorithmus MACed ist:
{"typ":"JWT",
"alg":"HS256"}
Um potenzielle Mehrdeutigkeiten in der Darstellung des obigen JSON-Objekts zu beseitigen, ist die tatsächliche UTF-8-Darstellung, die in diesem Beispiel für den obigen JOSE Header verwendet wird, ebenfalls unten enthalten. (Beachten Sie, dass Mehrdeutigkeiten aufgrund unterschiedlicher Plattformdarstellungen von Zeilenumbrüchen (CRLF versus LF), unterschiedlichen Abständen am Anfang und Ende von Zeilen, ob die letzte Zeile einen abschließenden Zeilenumbruch hat oder nicht, und anderen Ursachen entstehen können. In der in diesem Beispiel verwendeten Darstellung hat die erste Zeile keine führenden oder nachfolgenden Leerzeichen, zwischen der ersten und zweiten Zeile tritt ein CRLF-Zeilenumbruch (13, 10) auf, die zweite Zeile hat ein führendes Leerzeichen (32) und keine nachfolgenden Leerzeichen, und die letzte Zeile hat keinen abschließenden Zeilenumbruch.) Die UTF-8-Darstellung des in diesem Beispiel verwendeten JOSE Headers (unter Verwendung der JSON-Array-Notation) ist:
[123, 34, 116, 121, 112, 34, 58, 34, 74, 87, 84, 34, 44, 13, 10, 32,
34, 97, 108, 103, 34, 58, 34, 72, 83, 50, 53, 54, 34, 125]
Die Base64url-Kodierung der Bytes der UTF-8-Darstellung des JOSE Headers ergibt diesen kodierten JOSE Header-Wert:
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
Das Folgende ist ein Beispiel für ein JWT Claims Set:
{"iss":"joe",
"exp":1300819380,
"http://example.com/is_root":true}
Die folgende Byte-Sequenz, die die in diesem Beispiel verwendete UTF-8-Darstellung für das obige JWT Claims Set ist, ist das JWS Payload:
[123, 34, 105, 115, 115, 34, 58, 34, 106, 111, 101, 34, 44, 13, 10,
32, 34, 101, 120, 112, 34, 58, 49, 51, 48, 48, 56, 49, 57, 51, 56,
48, 44, 13, 10, 32, 34, 104, 116, 116, 112, 58, 47, 47, 101, 120, 97,
109, 112, 108, 101, 46, 99, 111, 109, 47, 105, 115, 95, 114, 111,
111, 116, 34, 58, 116, 114, 117, 101, 125]
Die Base64url-Kodierung des JWS Payload ergibt dieses kodierte JWS Payload (mit Zeilenumbrüchen nur für Anzeigezwecke):
eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly
9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
Die Berechnung des MAC des kodierten JOSE Headers und des kodierten JWS Payload unter Verwendung des HMAC SHA-256-Algorithmus und die Base64url-Kodierung des HMAC-Werts auf die in [JWS] angegebene Weise ergibt diese kodierte JWS Signature:
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
Die Verkettung dieser kodierten Teile in dieser Reihenfolge mit Punkt-Zeichen ('.') zwischen den Teilen ergibt dieses vollständige JWT (mit Zeilenumbrüchen nur für Anzeigezwecke):
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
.
eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt
cGxlLmNvbS9pc19yb290Ijp0cnVlfQ
.
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
Diese Berechnung ist in Anhang A.1 von [JWS] ausführlicher dargestellt. Siehe Anhang A.1 für ein Beispiel eines verschlüsselten JWT.