JWT <=> WTF? ![Minion](https://octodex.github.com/images/minion.png =200x200) # Show & Tell - JSON Web Token <!-- .element: class="fragment" data-fragment-index="1" --> --- ### Vorteile Wird nicht auf dem Server gespeichert <!-- .element: class="fragment" data-fragment-index="2" --> Kein Datenbankzugriff notwendig <!-- .element: class="fragment" data-fragment-index="3" --> Prüft valide Signatur mit dem geheimen Schlüssel <!-- .element: class="fragment" data-fragment-index="4" --> Keine Probleme beim CORS (Cross-Origin Request Sharing) <!-- .element: class="fragment" data-fragment-index="5" --> = höhere Verarbeitungsgeschwindigkeit <!-- .element: class="fragment" data-fragment-index="6" --> --- ### Nachteile ??? <!-- .element: class="fragment" data-fragment-index="7" --> --- Funktionsweise === <!-- 1. Client sendet Login mit Benutzerdaten 2. Bekommt Token als Antwort bei erfolgreichem Loign 3. Token wird bei nachfolgenden Anfragen immer mitgesendet 4. Server validiert das Token und gewährt Zugriff --> ![JWTPrinzip](https://proxy.duckduckgo.com/iu/?u=https%3A%2F%2Fi.ytimg.com%2Fvi%2FqlIFmv5Z5DU%2Fmaxresdefault.jpg&f=1 =800x450) --- # Aufbau Besteht aus 3 Teilen: Header, Payload und Signatur <!-- .element: class="fragment" data-fragment-index="8" --> ---- ## Header Der Header enthält Metadaten des Token: ```javascript= { "alg": "HS256", "typ": "JWT" } ``` Base64: ```eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9``` <!-- .element: class="fragment" data-fragment-index="9" --> --- ## Payload Der Payload enthält Informationen(Claims), für den Server. ---- #### Registered Claims Sind offiziell im IANA JSON Web Token Register eingetragen z.B. "iss" und "exp" ---- #### Public Claims Sind selbst definierte, öffentliche Claims mit eindeutigem Namen z.B. "https://example.com/jwt/role" ---- #### Private Claims Sind selbst definierte, oftmals auf geschlossene Netzwerke beschränkte Claims z.B. "userrole" und "user" --- ## Payload ```javascript= { "iss": "example.com", "exp": 1431061608, "https://example.com/jwt/role": "admin", "user": 12345 } ``` Base64: eyJpc3MiOiJleGFtcGxlLmNvbSIsImV4cCI6MTQzMTA2MTYwOCwiaHR0cHM6Ly9leGFtcGxlLmNvbS9qd3Qvcm9sZSI6ImFkbWluIiwidXNlciI6MTIzNDV9 ---- ## Gängige JWT Payload Claims Issuer (iss) Subject (sub) Audience (aud) Expiration time (exp) Not before (nbf) Issued at (iat) JWT ID (jti) --- ## Signature Signatur = HS256(base64(Header) . base64(Payload), "secret") ---- ## Gängige JWT Signatur Algorithmen HMAC + SHA256 RSASSA-PKCS1-v1_5 + SHA256 ECDSA + P-256 + SHA256 --- ## Komplettes JWT base64(Header) . base64(Payload) . Signature ``` eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJleGFtcGxlLmNvbSIsImV4cCI6MT QzMTA2MTYwOCwiaHR0cHM6Ly9leGFtcGxlLmNvbS9qd3Qvcm9sZSI6ImFkbWluIiwidXNlciI6M TIzNDV9.frJ26CLtf3ywwaezZ6DKzyyqV0kYe3as76Pjv_zaXOM= ``` --- # Empfohlene Links https://jwt.io/ https://www.jsonwebtoken.io/
{"type":"slide","slideOptions":{"transition":"slide"}}