Base64-Strings dekodieren (und JWT-Payloads)

Base64 ist eine umkehrbare Kodierung, keine Verschlüsselung. Dekodiere in einem Schritt, behandle Unicode korrekt und lies JWT-Abschnitte, die Base64url verwenden.

Was Base64 wirklich ist

Base64 bildet Binärdaten auf 64 druckbare ASCII-Zeichen ab. Es ist vollständig umkehrbar und braucht keinen Schlüssel — es ist also eine Kodierung, keine Verschlüsselung. Verwende es niemals, um Geheimnisse zu verstecken.

Kodieren und dekodieren

Im Browser kodierst du mit btoa und dekodierst mit atob. Für Nicht-ASCII-Text gehst du über UTF-8, damit Zeichen wie é, ü oder 你 überleben statt zu kaputten Bytes zu werden.

Einen JWT lesen

Ein JWT besteht aus drei Base64url-Abschnitten, getrennt durch Punkte: Header, Payload und Signature. Dekodiere die ersten beiden, um die Claims zu lesen. Die Signature ist binär und nicht für Menschen gedacht.

Base64 vs. Base64url

Standard-Base64 nutzt + und / mit = als Padding. Die URL-sichere Variante Base64url ersetzt sie durch - und _ und lässt das Padding weg, damit der Wert sicher in URLs und JWTs steht.

Dekodieren ist nicht verifizieren

Das Dekodieren eines JWT zeigt die Claims, sagt aber nichts über die Echtheit. Jede:r kann einen Token fälschen, dessen Payload "role":"admin" enthält; nur die mit dem Schlüssel des Ausstellers geprüfte Signature beweist, dass der Token echt ist. Triff niemals eine Vertrauensentscheidung auf Basis eines ungeprüften Tokens.

Häufige JWT-Claims und ihre Bedeutung

iss ist der Aussteller, sub das Subjekt (User-ID), aud die vorgesehene Audience, exp die Ablaufzeit (Unix-Sekunden), iat die Ausstellungszeit, nbf «not before» und jti eine eindeutige ID. Eigene Claims liegen neben diesen. Prüfe exp und aud immer serverseitig, nicht nur im Client.

Padding und URL-sichere Varianten

Base64url kommt oft ohne = Padding. Zum Dekodieren im Code füllst du die Länge mit = auf ein Vielfaches von 4 auf, tauschst dann - gegen + und _ gegen / und schickst den String durch einen normalen Base64-Decoder. Das atob im Browser akzeptiert Base64url nicht direkt — die Umwandlung muss vorher passieren.