„JSON Web Token“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Keine Bearbeitungszusammenfassung
RFC7515 ist nicht JWE sondern JWS
 
(25 dazwischenliegende Versionen von 21 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Ein '''JSON Web Token''' ('''JWT''', vorgeschlagene {{IPA2|dʒɒt}}) ist ein auf [[JavaScript Object Notation|JSON]] basiertes und nach RFC 7519 genormtes [[Access-Token]]. Das JWT ermöglicht den Austausch von verifizierbaren [[Claim (Informatik)|Claims]]. Es wird typischerweise verwendet, um in einem System mit einem Drittanbieter die Identität eines Benutzers zwischen einem [[Authentifizierung#Authentifizierung als IT-Dienst|Identity-Provider]] und einem Service-Provider auszutauschen. Des Weiteren eignet sich JWT zur Implementierung einer Stateless Session, denn da alle für die Authentifikation benötigten Informationen in dem Token übertragen werden, muss die Sitzung nicht auf dem Server gespeichert werden.
Ein '''JSON Web Token''' ('''JWT''', vorgeschlagene {{IPA2|dʒɒt}}) ist ein auf [[JavaScript Object Notation|JSON]] basiertes und nach <nowiki>RFC&nbsp;7519</nowiki><ref>{{RFC-Internet |RFC=7519 |Titel=JSON Web Token (JWT) |Datum=2015-05}}</ref> genormtes [[Access-Token]]. Das JWT ermöglicht den Austausch von verifizierbaren [[Claim (Informatik)|Claims]]. Es wird typischerweise verwendet, um in einem System mit einem [[Drittanbieter]] die Identität eines Benutzers zwischen einem [[Authentifizierung#Authentifizierung als IT-Dienst|Identity-Provider]] und einem Service-Provider auszutauschen. JWT eignen sich vor allem zur Implementierung von „Stateless Sessions“, da sämtliche authentifizierungsrelevanten Informationen im Token übertragen werden können und die [[Sitzung (Informatik)|Sitzung]] nicht zusätzlich auf einem Server gespeichert werden muss.


== Aufbau ==
== Aufbau ==
Ein JWT besteht aus drei Teilen: dem Header, Payload und der Signatur.
Ein JWT besteht aus drei Teilen: dem [[Header]], [[Nutzdaten|Payload]] und der [[Digitale Signatur|Signatur]].


=== Header ===
=== Header ===
Der ''Header'' ist ein JSON-Element, welches beschreibt, um welchen Token-Typ es sich handelt und welche Verschlüsselungsmethode zum Einsatz kommt.
Der ''Header'' ist ein JSON-Element, welches beschreibt, um welchen Token-Typ es sich handelt und welche Signaturmethode zum Einsatz kommt.


{|class="wikitable"
{| class="wikitable"
|-
! Feld !! Name !! Bedeutung
! Feld !! Name !! Bedeutung
|-
|-
| typ || Type || Beschreibt den IANA Medientyp des Tokens. Dieser Wert ist immer <code>JWT,</code> um den Medientyp <code>application/jwt</code> zu beschreiben.
| typ || Type || Beschreibt den [[Internet Assigned Numbers Authority|IANA]]-[[Internet Media Type|Medientyp]] des Tokens. Dieser Wert ist immer <code>JWT</code>, um den Medientyp <code>application/jwt</code> zu beschreiben.
|-
|-
| cty || Content Type || Dieses Feld wird benötigt, wenn das JWT ein anderes JWT als Payload enthält. In diesem Fall wird es auf <code>JWT</code> gesetzt. Andernfalls sollte dieses Feld weggelassen werden.
| cty || Content Type || Dieses Feld wird benötigt, wenn das JWT ein anderes JWT als Payload enthält. In diesem Fall wird es auf <code>JWT</code> gesetzt. Andernfalls sollte dieses Feld weggelassen werden.
|-
|-
| alg || Algorithm
| alg || Algorithm
| Beschreibt, welche Verschlüsselungsmethode zum Einsatz kommt. Als Verschlüsselungsmethode kommt üblicherweise [[Keyed-Hash Message Authentication Code|HMAC]] mit [[SHA-256]] (<code>HS256</code>) oder [[RSA-Kryptosystem|RSA]] mit SHA-256 (<code>RS256</code>) zum Einsatz. Es ist möglich, keine Verschlüsselung zu verwenden (<code>none</code>), was jedoch nicht empfohlen wird. Die möglichen Werte sind durch die [[JSON Web Encryption]] (JWE) nach RFC 7516 genormt.
| Beschreibt, welche Signaturmethode zum Einsatz kommt. Als Signaturmethode kommt üblicherweise [[Keyed-Hash Message Authentication Code|HMAC]] mit [[SHA-256]] (<code>HS256</code>) oder [[RSA-Kryptosystem|RSA]] mit SHA-256 (<code>RS256</code>) zum Einsatz. Es ist möglich, keine Signatur zu verwenden (<code>none</code>), was jedoch nicht empfohlen wird. Die möglichen Werte sind durch die [[JSON Web Encryption]] (JWE) nach <nowiki>RFC&nbsp;7516</nowiki><ref>{{RFC-Internet |RFC=7516 |Titel=JSON Web Encryption (JWE) |Datum=2015-05}}</ref> genormt.
|}
|}


Der Header sieht beispielsweise wie folgt aus:
Der Header sieht beispielsweise wie folgt aus:


<syntaxhighlight lang="json">
<syntaxhighlight lang="json">
Zeile 28: Zeile 29:


=== Payload ===
=== Payload ===
Beim ''Payload'' handelt es sich um ein JSON-Element, welches die Claims beschreibt.
Beim ''Payload'' handelt es sich um ein JSON-Element, welches die Claims beschreibt.


<syntaxhighlight lang="json">
<syntaxhighlight lang="json">
Zeile 40: Zeile 41:
Einige Claims sind hierbei reserviert:
Einige Claims sind hierbei reserviert:


{|class="wikitable sortable"
{| class="wikitable sortable"
|-
!style="width:2em"| Feld
! Feld
!style="width:7em"| Name
! Name
! Bedeutung
! Bedeutung
|-
|-
| iss || Issuer
| iss || Issuer
| Der Aussteller des Tokens
| Der Aussteller des Tokens
|-
|-
| sub || Subject
| sub || Subject
| Definiert für welches Subjekt die Claims gelten. Das <code>sub</code>-Feld definiert also für wen oder was die Claims getätigt werden.
| Definiert für welches Subjekt die Claims gelten. Das <code>sub</code>-Feld definiert also für wen oder was die Claims getätigt werden.
|-
|-
| aud || Audience || Die Zieldomäne, für die das Token ausgestellt wurde.
| aud || Audience || Die Zieldomäne, für die das Token ausgestellt wurde.
|-
|-
| exp || Expiration Time
| exp || Expiration Time
| Das Ablaufdatum des Tokens in [[Unixzeit]], also der Anzahl der Sekunden seit <code>1970-01-01T00:00:00Z</code>.
| Das Ablaufdatum des Tokens in [[Unixzeit]], also der Anzahl der Sekunden seit <code>1970-01-01T00:00:00Z</code>.
|-
|-
| nbf || Not Before
| nbf || Not Before
| Die [[Unixzeit]], ab der das Token gültig ist.
| Die [[Unixzeit]], ab der das Token gültig ist.
|-
|-
| iat || Issued At
| iat || Issued At
| Die [[Unixzeit]], zu der das Token ausgestellt wurde.
| Die [[Unixzeit]], zu der das Token ausgestellt wurde.
|-
|-
| jti || JWT ID
| jti || JWT ID
| Eine eindeutige [[case-sensitiv]]e Zeichenfolge, welche das Token eindeutig identifiziert. Hiermit kann verhindert werden, dass das Token repliziert wird. Hierbei kann es sich etwa um eine durchgezählte Nummer, einen [[Globally Unique Identifier|GUID]] oder einen [[Hashwert]] handeln. Falls der Token-Empfänger von mehreren Ausstellern einen Token empfängt, kann es sein, dass die JWT ID nicht eindeutig ist. Durch die Kombination des Ausstellers (iss) und der JWT ID (jti) kann diese wieder eindeutig werden.<ref>{{Literatur |Autor=[https://www.linkedin.com/in/prabathsiriwardena Prabath Siriwardena] |Datum=2020 |Titel=Advanced API Security: OAuth 2.0 and Beyond |Ort=New York |Verlag=Apress |Seiten=163 |ISBN=978-1-4842-2049-8}}</ref>
| Eine eindeutige [[case-sensitiv]]e Zeichenfolge, welche das Token eindeutig identifiziert. Hiermit kann verhindert werden, dass das Token repliziert wird. Hierbei kann es sich etwa um eine durchgezählte Nummer, einen [[Globally Unique Identifier|GUID]] oder einen [[Hashwert]] handeln. Falls der Token-Empfänger von mehreren Ausstellern einen Token empfängt, kann es sein, dass die JWT ID nicht eindeutig ist. Durch die Kombination des Ausstellers (iss) und der JWT ID (jti) kann diese wieder eindeutig werden.<ref>{{Literatur |Autor=Prabath Siriwardena |Titel=Advanced API Security: OAuth 2.0 and Beyond |Verlag=Apress |Ort=New York |Datum=2020 |ISBN=978-1-4842-2049-8 |Seiten=163}}</ref>
|}
|}


Des Weiteren sind noch ''Public Claims'' durch die IANA definiert.<ref name="public"/> Zudem kann der Aussteller des JWT auch einen ''Private Claim'' definierten [[Uniform Resource Identifier|URI]] verwenden, welche jedoch nicht standardisiert ist. Beispielsweise kann hier eine Ontologie wie [[Dublin Core]] oder [[FOAF]] zum Einsatz kommen.
Des Weiteren sind noch ''Public Claims'' durch die IANA definiert.<ref name="public" /> Zudem kann der Aussteller des JWT auch einen ''Private Claim'' definierten [[Uniform Resource Identifier|URI]] verwenden, welche jedoch nicht standardisiert ist. Beispielsweise kann hier eine Ontologie wie [[Dublin Core]] oder [[FOAF]] zum Einsatz kommen.


=== Signatur ===
=== Signatur ===
Der Aufbau der Signatur wird durch '''JSON Web Signature''' ('''JWS'''), einem nach RFC 7515 genormten Standard, definiert.
Der Aufbau der Signatur wird durch '''JSON Web Signature''' ('''JWS'''), einem nach <nowiki>RFC&nbsp;7515</nowiki><ref>{{RFC-Internet |RFC=7515 |Titel=JSON Web Signature (JWS) |Datum=2015-05}}</ref> genormten Standard, definiert.


Die Signatur wird dadurch erzeugt, dass der Header und der Payload im Base64 kodierten und durch einen Punkt getrennten Format mit der spezifizierten Hashmethode gehashed wird:
Die Signatur wird dadurch erzeugt, dass der Header und der Payload im [[Base64]] kodierten und durch einen Punkt getrennten Format mit der spezifizierten Hashmethode gehasht wird:
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
Zeile 78: Zeile 80:


=== Codierung ===
=== Codierung ===
Header, Payload und Signatur werden jeweils mit [[Base64]] kodiert und durch jeweils einen Punkt voneinander getrennt. Ein JWT Token kann wie folgt aussehen:
Header, Payload und Signatur werden jeweils mit Base64-[[Uniform Resource Locator|URL]] kodiert und durch jeweils einen Punkt voneinander getrennt. Ein JWT Token kann wie folgt aussehen:


<syntaxhighlight lang="javascript">
jwt = base64(header) + "." + base64(payload) + "." + base64(hash)
var jwt = base64UrlEncode(header) + "." + base64UrlEncode(payload) + "." + base64UrlEncode(hash)
</syntaxhighlight>


:<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzY290Y2guaW8iLCJleHAiOjEzMDA4MTkzODAsIm5hbWUiOiJDaHJpcyBTZXZpbGxlamEiLCJhZG1pbiI6dHJ1ZX0.03f329983b86f7d9a9f5fef85305880101d5e302afafa20154d094b229f75773</code>
:<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzY290Y2guaW8iLCJleHAiOjEzMDA4MTkzODAsIm5hbWUiOiJDaHJpcyBTZXZpbGxlamEiLCJhZG1pbiI6dHJ1ZX0.03f329983b86f7d9a9f5fef85305880101d5e302afafa20154d094b229f75773</code>


== Übertragung mit HTTP ==
== Übertragung mit HTTP ==
Das JWT kann in der URL oder im HTTP-Header übertragen werden.
Das JWT kann in der URL oder im [[HTTP-Header]] übertragen werden.


<code>http://example.com/path?jwt_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...</code>
<code><nowiki>http://example.com/path?jwt_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…</nowiki></code>


Für die Übertragung im HTTP-Header gibt es zwei Möglichkeiten: Das Authorization-Feld oder das Cookie-Feld.
Für die Übertragung im HTTP-Header gibt es zwei Möglichkeiten: Das Authorization-Feld oder das Cookie-Feld.
* im Authorization-Feld als Bearer-Token: <code>Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...</code>
* im Authorization-Feld als Bearer-Token: <code style="white-space:nowrap">Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…</code>
* im Cookie-Feld: <code>Cookie: token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...</code>
* im Cookie-Feld: <code style="white-space:nowrap">Cookie: token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…</code>
Die beiden Methoden haben unterschiedliche Vor- und Nachteile:
Die beiden Methoden haben unterschiedliche Vor- und Nachteile:


{|class="wikitable"
{| class="wikitable"
!style="width:10em| &nbsp; !! Bearer-Token !! Cookie
|-
|-
! s!! Bearer-Token !! Cookie
| Header
|-
| <syntaxhighlight inline lang="json">Authorization: Bearer <JWT></syntaxhighlight>
| Header
| <syntaxhighlight inline lang="json">Cookie: token=<JWT></syntaxhighlight>
|
<code style="white-space:nowrap">Authorization: Bearer <JWT></code>
|
<code>Cookie: token=<JWT></code>
|-
|-
| [[Cross-Origin Resource Sharing|CORS]]
| [[Cross-Origin Resource Sharing|CORS]]
| Funktioniert mit CORS, jedoch ist eine Implementierung in [[JavaScript]] nötig.
| Funktioniert mit CORS, jedoch ist eine Implementierung in [[JavaScript]] nötig.
| Das Cookie wird vom Browser nur für die aktuelle Domäne übermittelt. CORS ist nicht möglich.
| Das Cookie wird vom Browser nur für die aktuelle Domäne übermittelt. CORS ist nicht möglich.
|-
|-
| Speicherung
| Speicherung
| Alle durch JavaScript ansprechbaren Speichermethoden wie [[WebStorage]] und der [[Cookie]]-Store sind möglich.
| Alle durch JavaScript ansprechbaren Speichermethoden wie [[WebStorage]] und der [[HTTP-Cookie|Cookie]]-Store sind möglich.
| Cookie wird im Cookie-Store hinterlegt.
| Cookie wird im Cookie-Store hinterlegt.
|-
|-
| Schutz gegen [[Man-in-the-Middle-Angriff|MITM]]
| Schutz gegen [[Man-in-the-Middle-Angriff|MITM]]
| Das Vorhandensein von [[Transport Layer Security|TLS]] muss in JavaScript geprüft werden.
| Das Vorhandensein von [[Transport Layer Security|TLS]] muss in JavaScript geprüft werden.
| Wenn das Flag <code>secure</code> am Cookie gesetzt wird, wird TLS erzwungen.
| Wenn das Flag <code>secure</code> am Cookie gesetzt wird, wird TLS erzwungen.
|-
|-
| Schutz gegen [[Cross-Site-Scripting|XSS]]
| Schutz gegen [[Cross-Site-Scripting|XSS]]
| Muss in JavaScript implementiert werden.
| Muss in JavaScript implementiert werden.
| Implizit, wenn das Flag <code>HttpOnly</code> am Cookie gesetzt wird, um den Zugriff mittels [[JavaScript]] zu verhindern.
| Implizit, wenn das Flag <code>HttpOnly</code> am Cookie gesetzt wird, um den Zugriff mittels [[JavaScript]] zu verhindern.
|-
|-
| Schutz gegen [[Cross-Site-Request-Forgery|CSRF]]
| Schutz gegen [[Cross-Site-Request-Forgery|CSRF]]
| Implizit, da Header vom Browser im Gegensatz zu Cookies nicht automatisch gesendet werden.
| Nicht möglich. Hier sind andere Maßnahmen nötig.
| Muss in JavaScript implementiert werden.
| Muss in JavaScript implementiert werden.
|}
|}


Zeile 126: Zeile 133:


== Security Event Token ==
== Security Event Token ==
Ein '''Security Event Token''' ('''SET''') erweitert den JWT Standard um den <code>events</code> Claim, welcher eine Liste von sicherheitsrelevanten Ereignissen aufzeichnet.<ref name="selfissued"/> Diese Tokens haben einen Zeitstempel und unbegrenzte Gültigkeit. Ein SET-Payload kann wie folgt aussehen:
Ein '''Security Event Token''' ('''SET''') erweitert den JWT Standard um den <code>events</code> Claim, welcher eine Liste von sicherheitsrelevanten Ereignissen aufzeichnet.<ref name="selfissued" /> Diese Tokens haben einen digitalen [[Zeitstempel]] und unbegrenzte Gültigkeit. Ein SET-Payload kann wie folgt aussehen:


<syntaxhighlight lang="json">
<syntaxhighlight lang="json">
Zeile 142: Zeile 149:
</syntaxhighlight>
</syntaxhighlight>


SETs kommen beim [[Auditing (Informationstechnik)|Auditing]] zum Einsatz. SETs werden in RFC 8417 spezifiziert.
SETs kommen beim [[Auditing (Informationstechnik)|Auditing]] zum Einsatz. SETs werden in <nowiki>RFC&nbsp;8417</nowiki><ref>{{RFC-Internet |RFC=8417 |Titel=Security Event Token (SET) |Datum=2018-07}}</ref> spezifiziert.


== Siehe auch ==
== Siehe auch ==
Zeile 150: Zeile 157:
== Weblinks ==
== Weblinks ==
* {{Internetquelle
* {{Internetquelle
|autor=Bernd Schönbach
|url=https://www.heise.de/developer/artikel/Nutzer-Authentifizierung-in-Microservice-Umgebungen-3651632.html
|titel=Nutzer-Authentifizierung in Microservice-Umgebungen
|url=https://www.heise.de/developer/artikel/Nutzer-Authentifizierung-in-Microservice-Umgebungen-3651632.html
|titel=Nutzer-Authentifizierung in Microservice-Umgebungen
|autor=Bernd Schönbach
|werk=Heise Developer
|datum=2017-06-09
|abruf=2017-06-11
|datum=2017-06-09
|abruf=2017-06-11}}
|werk=Heise Developer
|hrsg=[[Verlag Heinz Heise]]
}}


== Quellen ==
== Einzelnachweise ==
<references>
<references>
<ref name="implementations">{{Internetquelle
<ref name="implementations">
{{Internetquelle
|url=https://jwt.io/
|url=https://jwt.io/
|titel=JWT
|titel=JWT
|sprache=en
|hrsg=Auth0 |sprache=en
|abruf=2017-05-14
|abruf=2017-05-14}}
</ref>
|hrsg=[http://auth0.com Auth0]
}}</ref>
<ref name="public">
<ref name="public">{{Internetquelle
{{Internetquelle
|url=https://www.iana.org/assignments/jwt/jwt.xhtml
|titel=JSON Web Token Claims
|titel=JSON Web Token Claims
|url=https://www.iana.org/assignments/jwt/jwt.xhtml
|datum=2017-02-23
|datum=2017-02-23
|abruf=2017-05-14
|abruf=2017-05-14
|kommentar=Liste der JWT Public Claims
|kommentar=Liste der JWT Public Claims}}
}}</ref>
</ref>
<ref name="selfissued">{{Internetquelle
<ref name="selfissued">
{{Internetquelle
|url=https://self-issued.info/?p=1620
|url=https://self-issued.info/?p=1620
|titel=Security Event Token (SET) Specification and IETF Security Events Working Group
|titel=Security Event Token (SET) Specification and IETF Security Events Working Group
|sprache=en
|sprache=en
|abruf=2017-05-14
|abruf=2017-05-14}}
}}</ref>
</ref>
</references>
</references>



Aktuelle Version vom 27. Dezember 2023, 18:09 Uhr

Ein JSON Web Token (JWT, vorgeschlagene Aussprache [dʒɒt]) ist ein auf JSON basiertes und nach RFC 7519[1] genormtes Access-Token. Das JWT ermöglicht den Austausch von verifizierbaren Claims. Es wird typischerweise verwendet, um in einem System mit einem Drittanbieter die Identität eines Benutzers zwischen einem Identity-Provider und einem Service-Provider auszutauschen. JWT eignen sich vor allem zur Implementierung von „Stateless Sessions“, da sämtliche authentifizierungsrelevanten Informationen im Token übertragen werden können und die Sitzung nicht zusätzlich auf einem Server gespeichert werden muss.

Ein JWT besteht aus drei Teilen: dem Header, Payload und der Signatur.

Der Header ist ein JSON-Element, welches beschreibt, um welchen Token-Typ es sich handelt und welche Signaturmethode zum Einsatz kommt.

Feld Name Bedeutung
typ Type Beschreibt den IANA-Medientyp des Tokens. Dieser Wert ist immer JWT, um den Medientyp application/jwt zu beschreiben.
cty Content Type Dieses Feld wird benötigt, wenn das JWT ein anderes JWT als Payload enthält. In diesem Fall wird es auf JWT gesetzt. Andernfalls sollte dieses Feld weggelassen werden.
alg Algorithm Beschreibt, welche Signaturmethode zum Einsatz kommt. Als Signaturmethode kommt üblicherweise HMAC mit SHA-256 (HS256) oder RSA mit SHA-256 (RS256) zum Einsatz. Es ist möglich, keine Signatur zu verwenden (none), was jedoch nicht empfohlen wird. Die möglichen Werte sind durch die JSON Web Encryption (JWE) nach RFC 7516[2] genormt.

Der Header sieht beispielsweise wie folgt aus:

{
  "alg": "HS256",
  "typ": "JWT"
}

Beim Payload handelt es sich um ein JSON-Element, welches die Claims beschreibt.

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Einige Claims sind hierbei reserviert:

Feld Name Bedeutung
iss Issuer Der Aussteller des Tokens
sub Subject Definiert für welches Subjekt die Claims gelten. Das sub-Feld definiert also für wen oder was die Claims getätigt werden.
aud Audience Die Zieldomäne, für die das Token ausgestellt wurde.
exp Expiration Time Das Ablaufdatum des Tokens in Unixzeit, also der Anzahl der Sekunden seit 1970-01-01T00:00:00Z.
nbf Not Before Die Unixzeit, ab der das Token gültig ist.
iat Issued At Die Unixzeit, zu der das Token ausgestellt wurde.
jti JWT ID Eine eindeutige case-sensitive Zeichenfolge, welche das Token eindeutig identifiziert. Hiermit kann verhindert werden, dass das Token repliziert wird. Hierbei kann es sich etwa um eine durchgezählte Nummer, einen GUID oder einen Hashwert handeln. Falls der Token-Empfänger von mehreren Ausstellern einen Token empfängt, kann es sein, dass die JWT ID nicht eindeutig ist. Durch die Kombination des Ausstellers (iss) und der JWT ID (jti) kann diese wieder eindeutig werden.[3]

Des Weiteren sind noch Public Claims durch die IANA definiert.[4] Zudem kann der Aussteller des JWT auch einen Private Claim definierten URI verwenden, welche jedoch nicht standardisiert ist. Beispielsweise kann hier eine Ontologie wie Dublin Core oder FOAF zum Einsatz kommen.

Der Aufbau der Signatur wird durch JSON Web Signature (JWS), einem nach RFC 7515[5] genormten Standard, definiert.

Die Signatur wird dadurch erzeugt, dass der Header und der Payload im Base64 kodierten und durch einen Punkt getrennten Format mit der spezifizierten Hashmethode gehasht wird:

var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
var hash = HMACSHA256(encodedString, secret);

Header, Payload und Signatur werden jeweils mit Base64-URL kodiert und durch jeweils einen Punkt voneinander getrennt. Ein JWT Token kann wie folgt aussehen:

var jwt = base64UrlEncode(header) + "." + base64UrlEncode(payload) + "." + base64UrlEncode(hash)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzY290Y2guaW8iLCJleHAiOjEzMDA4MTkzODAsIm5hbWUiOiJDaHJpcyBTZXZpbGxlamEiLCJhZG1pbiI6dHJ1ZX0.03f329983b86f7d9a9f5fef85305880101d5e302afafa20154d094b229f75773

Übertragung mit HTTP

[Bearbeiten | Quelltext bearbeiten]

Das JWT kann in der URL oder im HTTP-Header übertragen werden.

http://example.com/path?jwt_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…

Für die Übertragung im HTTP-Header gibt es zwei Möglichkeiten: Das Authorization-Feld oder das Cookie-Feld.

  • im Authorization-Feld als Bearer-Token: Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…
  • im Cookie-Feld: Cookie: token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…

Die beiden Methoden haben unterschiedliche Vor- und Nachteile:

s Bearer-Token Cookie
Header

Authorization: Bearer <JWT>

Cookie: token=<JWT>

CORS Funktioniert mit CORS, jedoch ist eine Implementierung in JavaScript nötig. Das Cookie wird vom Browser nur für die aktuelle Domäne übermittelt. CORS ist nicht möglich.
Speicherung Alle durch JavaScript ansprechbaren Speichermethoden wie WebStorage und der Cookie-Store sind möglich. Cookie wird im Cookie-Store hinterlegt.
Schutz gegen MITM Das Vorhandensein von TLS muss in JavaScript geprüft werden. Wenn das Flag secure am Cookie gesetzt wird, wird TLS erzwungen.
Schutz gegen XSS Muss in JavaScript implementiert werden. Implizit, wenn das Flag HttpOnly am Cookie gesetzt wird, um den Zugriff mittels JavaScript zu verhindern.
Schutz gegen CSRF Implizit, da Header vom Browser im Gegensatz zu Cookies nicht automatisch gesendet werden. Muss in JavaScript implementiert werden.

Implementierungen

[Bearbeiten | Quelltext bearbeiten]

Implementierungen für JWT steht für eine Vielzahl von Plattformen zur Verfügung. Eine aktuelle Liste findet sich beispielsweise auf der Seite JWT.io.[6]

Security Event Token

[Bearbeiten | Quelltext bearbeiten]

Ein Security Event Token (SET) erweitert den JWT Standard um den events Claim, welcher eine Liste von sicherheitsrelevanten Ereignissen aufzeichnet.[7] Diese Tokens haben einen digitalen Zeitstempel und unbegrenzte Gültigkeit. Ein SET-Payload kann wie folgt aussehen:

{
  "iss": "https://server.example.com",
  "sub": "248289761001",
  "aud": "s6BhdRkqt3",
  "iat": 1471566154,
  "jti": "bWJq",
  "sid": "08a5019c-17e1-4977-8f42-65a12843ea02",
  "events": {
    "http://schemas.openid.net/event/backchannel-logout": {}
  }
}

SETs kommen beim Auditing zum Einsatz. SETs werden in RFC 8417[8] spezifiziert.

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. RFC 7519 – JSON Web Token (JWT). Mai 2015 (englisch).
  2. RFC 7516 – JSON Web Encryption (JWE). Mai 2015 (englisch).
  3. Prabath Siriwardena: Advanced API Security: OAuth 2.0 and Beyond. Apress, New York 2020, ISBN 978-1-4842-2049-8, S. 163.
  4. JSON Web Token Claims. 23. Februar 2017, abgerufen am 14. Mai 2017 (Liste der JWT Public Claims).
  5. RFC 7515 – JSON Web Signature (JWS). Mai 2015 (englisch).
  6. JWT. Auth0, abgerufen am 14. Mai 2017 (englisch).
  7. Security Event Token (SET) Specification and IETF Security Events Working Group. Abgerufen am 14. Mai 2017 (englisch).
  8. RFC 8417 – Security Event Token (SET). Juli 2018 (englisch).