JWT

Veröffentlicht am:

Die wichtigsten Befehle zum Merken

  • python3 -m pip show PyJWT — die Bibliothek dieses Interpreters prüfen.
  • python3 - — das lokale Validierungsbeispiel über die Standardeingabe ausführen.

Befehle und Optionen

Befehl oder Syntax Bedeutung
python3 -m pip show PyJWT Metadaten des installierten Pakets zeigen; nichts installieren.
python3 - Python-Quelltext aus der Standardeingabe lesen.
<<'PYTHON' Mehrzeiliges Skript ohne Variablenersetzung durch die Shell übergeben.

Im Skript erzeugt jwt.encode das Testtoken. jwt.decode prüft festen Algorithmus, Aussteller und Zielgruppe. require verlangt die genannten Claims. exp ist ein Ablaufzeitpunkt in Sekunden seit der Unix-Epoche.

Die entscheidenden Konzepte

1. JWT ist ein Token-Format

Ein JSON Web Token enthält Claims: Aussagen wie Subjektkennung oder vorgesehene Zielgruppe. Ein übliches signiertes kompaktes JWT besteht aus drei durch Punkte getrennten Teilen: Header, Nutzdaten und Signatur beziehungsweise Authentifizierungstag.

Header und Nutzdaten sind base64url-kodiert und ohne Signierschlüssel lesbar. Kodierung ist keine Verschlüsselung. Andere JWT-Formen unterstützen Verschlüsselung; ein gewöhnliches signiertes Token darf gegenüber seinem Besitzer geheimzuhaltende Informationen nicht einfach offen enthalten.

2. Eine gültige Signatur ist nur eine Prüfung

Die Signaturprüfung kontrolliert Integrität unter einem ausgewählten Schlüssel. Der Empfänger muss zusätzlich den vorgesehenen Einsatz prüfen: vertrauenswürdiger Aussteller, richtige Zielgruppe, Pflichtangaben, Zeitgrenzen und Berechtigungen für die Operation.

Ein einwandfrei signiertes Token für eine andere API muss abgelehnt werden. JSON dekodieren belegt nur Lesbarkeit, keine dieser Vertrauensbedingungen.

3. Der Prüfer bestimmt seine Vertrauensregeln

Der Empfänger konfiguriert erlaubte Algorithmen und vertrauenswürdige Schlüssel. Er darf nicht beliebige Algorithmen oder Schlüsselquellen übernehmen, die ein ungeprüftes Token verlangt. Eine Schlüsselkennung kann unter bekannten Schlüsseln auswählen, aber keinen neuen Schlüssel vertrauenswürdig machen.

Bei symmetrischem HMAC kann jeder Besitzer des Prüfgeheimnisses auch Tokens erzeugen. Asymmetrische Signaturen erlauben die Prüfung mit einem öffentlichen Schlüssel ohne Signierschlüssel. Beide benötigen sichere Schlüsselverteilung und Verwaltung.

4. Ablauf bedeutet keinen sofortigen Widerruf

Ein geprüftes Ablaufdatum begrenzt die Lebensdauer. Es lässt ein Token nicht beim Abmelden verschwinden und informiert nicht automatisch jede API über geänderte Kontoregeln.

Lokal geprüfte Tokens können ohne zusätzlichen Widerruf oder Zustandsprüfung bis zum Ablauf akzeptiert werden. Kurze Laufzeiten verkleinern dieses Fenster. Refresh Tokens und Sitzungsende gehören zum gesamten Autorisierungsentwurf, nicht zum JWT-Format allein.

Ein kleines Beispiel

Optional: Verwende eine vorhandene PyJWT-2.x-Umgebung. Das Beispiel erzeugt ein zufälliges Geheimnis im Arbeitsspeicher und prüft ausschließlich sein eigenes Testtoken. Es gibt keine Netzwerkanfragen.

python3 -m pip show PyJWT
python3 - <<'PYTHON'
import secrets
import time
import jwt

key = secrets.token_bytes(32)
claims = {"iss": "lab-issuer", "aud": "lab-api", "sub": "lab-user", "exp": int(time.time()) + 60}
token = jwt.encode(claims, key, algorithm="HS256")
print(jwt.decode(token, key, algorithms=["HS256"], issuer="lab-issuer", audience="lab-api", options={"require": ["iss", "aud", "sub", "exp"]}))
try:
    jwt.decode(token, key, algorithms=["HS256"], issuer="lab-issuer", audience="different-api")
except jwt.InvalidAudienceError:
    print("Rejected: wrong audience")
PYTHON

Die erste Prüfung sollte die validierten Claims ausgeben. Die zweite erwartet bei identischem Token und Schlüssel eine andere Zielgruppe und sollte Rejected: wrong audience melden. Ein authentisches Token kann also für einen Empfänger ungültig sein.

Signierer und Prüfer teilen hier bewusst ein Geheimnis in einem Prozess. Das ist kein produktiver Vertrauensverteilungsentwurf. Schlüssel und Token werden nicht gespeichert. Bei fehlendem PyJWT oder Importfehler fand das Experiment nicht statt.

Merke dir: Lesbare Claims sind Eingaben. Vertrauen entsteht durch kryptografische Prüfung und die ausdrücklichen Regeln des Empfängers.