[{"data":1,"prerenderedAt":310},["ShallowReactive",2],{"post-\u002Fde\u002Fist-jwt-sicher-oder-verwundbar":3},{"page":4,"translations":265,"nav":273,"related":302,"random":303},{"id":5,"title":6,"body":7,"categories":234,"category":236,"changeHistory":237,"date":245,"description":246,"disclosures":236,"draft":247,"extension":248,"image":249,"imageAlt":250,"kind":236,"lang":251,"meta":252,"navigation":253,"path":254,"publishedAt":236,"readingTime":255,"rights":236,"seo":256,"seoTitle":236,"slug":257,"sources":236,"stem":258,"tags":259,"translationKey":263,"type":235,"updated":243,"__hash__":264},"postsDe\u002Fde\u002Fist-jwt-sicher-oder-verwundbar.md","Ist JWT sicher oder verwundbar?",{"type":8,"value":9,"toc":221},"minimark",[10,34,37,40,43,48,51,64,67,86,90,97,100,110,113,117,122,133,141,145,152,159,163,192,196,207,210,213],[11,12,13,21],"blockquote",{},[14,15,16,17],"p",{},"💡 ",[18,19,20],"strong",{},"Kurzfassung:",[22,23,24,28,31],"ul",{},[25,26,27],"li",{},"Ein JWT kann ungültig gemacht werden, aber Sperrlisten, Introspektion oder Sitzungsstatusprüfungen nehmen einem zustandslosen Token einen Teil seiner Einfachheit.",[25,29,30],{},"Eine Signatur schützt Integrität, nicht Vertraulichkeit oder die aktuelle Berechtigung. Die Anwendung muss das erwartete Token prüfen und den Zugriff weiterhin entscheiden.",[25,32,33],{},"Kurzlebige Access-Tokens und geschützte Refresh-Tokens können passen. Hängt jede Anfrage ohnehin von serverseitigem Sitzungsstatus ab, ist ein herkömmliches Sitzungs-Cookie oft die einfachere Lösung.",[14,35,36],{},"JWT steht für JSON Web Token. Dieser Beitrag erklärt nicht, wie JWT Sicherheit erhöht, sondern wie ein unvorsichtiger Einsatz sie schwächen kann.",[14,38,39],{},"JWT ist ein offener Standard für Access-Tokens. Der Server erstellt ein Token und sendet es oft an den Client. Ein integritätsgeschütztes JWT kann ein gemeinsames Secret mit HMAC oder eine asymmetrische Signatur wie RSA oder ECDSA nutzen. Im asymmetrischen Fall signiert der Aussteller mit einem privaten Schlüssel, der Empfänger prüft mit einem öffentlichen. Ein JWT ist also nicht immer „mit dem privaten Schlüssel des Servers signiert“.",[14,41,42],{},"Wenn die Signatur gültig ist, weiß der Empfänger, dass keine unbefugte Person das Token verändert hat und dass es von einem Inhaber des passenden Schlüssels stammt. Ein signiertes JWT ist dadurch nicht verschlüsselt. Wer es lesen kann, kann normalerweise auch seine Nutzdaten lesen; Geheimnisse gehören nicht hinein. Eine gültige Signatur sagt ebenso wenig aus, ob ein Konto noch aktiv ist, seine Berechtigungen unverändert sind oder der Nutzer diese Ressource in dieser Anfrage nutzen darf. Das sind weiter Anwendungsentscheidungen.",[44,45,47],"h2",{"id":46},"was-jwt-nicht-ist","Was JWT nicht ist",[14,49,50],{},"JWT ist kein magisches Sicherheitsmittel. Signaturprüfung ersetzt keine Autorisierung bei einer kritischen Aktion.",[11,52,53],{},[14,54,55],{},[56,57,58,59,63],"em",{},"„Die Informationen im JWT sind signiert und zuverlässig. Im Token steht der Benutzername ",[60,61,62],"code",{},"evrenbal",", der Server hat ihn bei der Anmeldung geprüft. Was kann schon schiefgehen?“",[14,65,66],{},"Stellen Sie sich vor, einem Nutzer wird sein Passwort gestohlen oder er hat sich an einem öffentlichen Computer nicht abgemeldet. Er ändert sein Passwort und nimmt an, das Problem sei gelöst. Prüft das Backend aber nur Struktur und Ablaufzeit des Tokens, bleibt das aktive Token auf diesem Computer gültig, bis es abläuft oder die Anwendung Widerrufszustand prüft.",[14,68,69,70,81,82,85],{},"Zwei Prüfungen sind zu unterscheiden: erstens die kryptografische Validierung, zweitens die Entscheidung der Anwendung über diese Anfrage. Lassen Sie nicht den Token-Header Algorithmus oder Schlüssel wählen. Konfigurieren Sie erlaubte Algorithmen und binden Sie jeden Schlüssel an seinen vorgesehenen Algorithmus. Prüfen Sie kryptografische Operationen, erwarteten Aussteller, Zielgruppe, Zweck und gegebenenfalls Tokentyp. Prüfen Sie anschließend Claims im Anwendungskontext und treffen Sie die aktuelle Autorisierungsentscheidung. ",[71,72,80],"a",{"href":73,"className":74,"rel":76,"target":79},"https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc8725.html",[75],"dofollow",[77,78],"nofollow","noopener","_blank","RFC 8725"," beschreibt diese Praktiken, einschließlich Schutz gegen ",[60,83,84],{},"alg: \"none\""," und Schlüsselverwechslung.",[44,87,89],{"id":88},"ablaufzeit-und-refresh-token-dilemma","Ablaufzeit und Refresh-Token-Dilemma",[11,91,92],{},[14,93,94],{},[56,95,96],{},"„Dann setze ich eben eine sehr kurze Ablaufzeit für das JWT.“",[14,98,99],{},"Ein kurzlebiges Access-Token mit länger lebendem Refresh-Token kann angemessen sein. Die Ausgabe eines Refresh-Tokens ist jedoch eine Risikoentscheidung, kein Standard. Es erlaubt, ein gestohlenes Access-Token rasch wirkungslos werden zu lassen, ohne eine erneute Anmeldung zu erzwingen.",[14,101,102,103,109],{},"Um das langlebige Refresh-Token zu prüfen und rasch widerrufen zu können, braucht das Autorisierungssystem aber Zustand in einer Datenbank oder einem Cache wie Redis. Stimmt ein eingehendes Refresh-Token mit dem gespeicherten überein, kann ein neues Access-Token entstehen. Bei Passwortänderung können aktive Refresh-Tokens gelöscht oder widerrufen und Sitzungen ungültig gemacht werden. Für öffentliche Clients empfiehlt die aktuelle OAuth-Leitlinie Refresh-Token-Rotation oder absendergebundene Refresh-Tokens sowie Ablauf und Widerruf. ",[71,104,108],{"href":105,"className":106,"rel":107,"target":79},"https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc9700.html",[75],[77,78],"RFC 9700"," erläutert die risikobasierte Ausgabe und beide Ansätze zur Erkennung von Wiederverwendung.",[14,111,112],{},"Das löst nicht alles. Während ein gestohlenes kurzlebiges Access-Token aktiv ist, bleibt seine Übernahme unentdeckt. Wird die Lebensdauer auf ein oder zwei Minuten verkürzt, erneuert der Client häufiger. Das kann richtig sein. Prüft aber jede Anfrage zusätzlich Datenbank oder Cache, ist der zustandslose Vorteil deutlich kleiner.",[44,114,116],{"id":115},"sicherere-muster","Sicherere Muster",[118,119,121],"h3",{"id":120},"muster-1-passwortalter-prüfen","Muster 1: Passwortalter prüfen",[14,123,124,125,128,129,132],{},"Vergleichen Sie beim Prüfen eines JWT dessen Erstellungszeit (",[60,126,127],{},"iat",") mit ",[60,130,131],{},"last_password_change"," des Nutzers in einem schnellen Cache wie Redis. Wurde das Passwort nach Ausstellung geändert, verweigern Sie die Anfrage.",[22,134,135],{},[25,136,137,140],{},[18,138,139],{},"Ergebnis:"," Bei Passwortänderung wird der Nutzer sofort auf allen Geräten abgemeldet; das betrifft auch seine legitimen Sitzungen.",[118,142,144],{"id":143},"muster-2-sitzungen-pro-anmeldung-nachverfolgen","Muster 2: Sitzungen pro Anmeldung nachverfolgen",[14,146,147,148,151],{},"Erzeugen Sie bei jeder Anmeldung eine eindeutige Sitzungs-ID, etwa ",[60,149,150],{},"\"ABCDE\"",", speichern Sie sie in Redis und betten Sie sie in die JWT-Nutzdaten ein. Vergleichen Sie sie bei jeder Anfrage mit den aktiven Sitzungen. IP-Adresse, User Agent und Betriebssystemdetails können Nutzern helfen, eine Sitzung zu erkennen oder eine ungewöhnliche Änderung zu markieren. Sie sind unterstützende Signale, keine kryptografische Gerätebindung oder verlässlicher Identitätsnachweis.",[22,153,154],{},[25,155,156,158],{},[18,157,139],{}," Bei einer Passwortänderung können alle aktiven Sitzungen aus Redis entfernt und damit alle ausgegebenen JWTs sofort ungültig werden. Eine Seite „Geräte“ kann einzelne Sitzungen widerrufbar machen.",[44,160,162],{"id":161},"browser-speicher-ist-eine-eigene-entscheidung","Browser-Speicher ist eine eigene Entscheidung",[14,164,165,166,169,170,173,174,177,178,181,182,184,185,191],{},"Ein JWT in ",[60,167,168],{},"localStorage"," ist für JavaScript derselben Origin verfügbar. Ein XSS-Fehler kann das Token daher preisgeben. ",[60,171,172],{},"HttpOnly","-, ",[60,175,176],{},"Secure","- und passend gewählte ",[60,179,180],{},"SameSite","-Cookies oder eine BFF-Architektur für den Browser können dieses Risiko senken. Sie lassen den Browser Zugangsdaten aber auch automatisch senden; CSRF-Schutz und der übrige Sitzungsentwurf bleiben nötig. ",[60,183,180],{}," ist Defense in Depth, nicht die gesamte CSRF-Strategie. Das ",[71,186,190],{"href":187,"className":188,"rel":189,"target":79},"https:\u002F\u002Fcheatsheetseries.owasp.org\u002Fcheatsheets\u002FSession_Management_Cheat_Sheet.html",[75],[77,78],"OWASP Cheat Sheet für Sitzungsverwaltung"," erläutert diese Grenze.",[44,193,195],{"id":194},"ist-jwt-überhaupt-nötig","Ist JWT überhaupt nötig?",[14,197,198,199,202,203,206],{},"Speichern Sie Sitzungs-IDs wie ",[60,200,201],{},"ABCDE"," in einem Cache, fragen ihn bei jeder Anfrage ab und verwalten Sitzungslebensdauern serverseitig, haben Sie ein ",[18,204,205],{},"zustandsbehaftetes System"," gebaut.",[14,208,209],{},"Warum dann den Aufwand großer Base64-codierter JWT-Nutzdaten und JWT-Bibliotheken tragen? In den meisten klassischen monolithischen oder Single-Domain-Webanwendungen ist ein schlankes, sicheres Cookie mit Sitzungs-ID oft die einfachere, sicherere und bewährte Wahl.",[14,211,212],{},"JWT ist nützlich, aber nicht automatisch der beste Standard. Fragen Sie vor der Integration, ob es für diesen Client, diese Vertrauensgrenze und diesen Widerrufsbedarf wirklich besser ist als ein herkömmliches Sitzungs-Cookie.",[14,214,215,216,220],{},"Das ist auch eine wichtige Leitplanke, wenn ein KI-Agent beim Bau einer API hilft. JWT sollte nicht durch einen Prompt zum Standard werden. Der Agent sollte Clienttyp, Widerrufsbedarf, Vertrauensgrenze und den Grund erklären, weshalb JWT einer Serversitzung vorzuziehen ist. Wie diese Entscheidungen erhalten bleiben, behandle ich in ",[71,217,219],{"href":218},"\u002Fde\u002Frest-api-qualitaet-in-ki-gestuetzter-entwicklung-sichern","KI-gestützter REST-API-Entwicklung",".",{"title":222,"searchDepth":223,"depth":223,"links":224},"",2,[225,226,227,232,233],{"id":46,"depth":223,"text":47},{"id":88,"depth":223,"text":89},{"id":115,"depth":223,"text":116,"children":228},[229,231],{"id":120,"depth":230,"text":121},3,{"id":143,"depth":230,"text":144},{"id":161,"depth":223,"text":162},{"id":194,"depth":223,"text":195},[235],"technical",null,[238,242],{"date":239,"type":240,"summary":241},"2026-06-21","substantive-update","Bereinigte Überbleibsel aus der türkisch-englischen Übersetzung, ergänzte verbreitete JWT-Fehlerbilder und korrigierte Variablen- und Verbverwendung.",{"date":243,"type":240,"summary":244},"2026-08-27","Aktualisierte Hinweise zu Signierung, Validierung, Refresh-Tokens, Widerruf, Browser-Speicher und Gerätesignalen; ergänzte den Entscheidungslink zur API-Entwicklung.","2022-05-12","JSON Web Tokens sind sehr verbreitet – aber sind sie sicher? Über Risiken zustandsloser Sitzungen, gestohlene Tokens, Browser-Speicher und wichtige Entwurfsentscheidungen.",false,"md","\u002Fimages\u002Fhero\u002Fjwt-security.avif","Zwei verschlossene Zugangsschranken schützen einen zentralen Kontrollpunkt für Zugangsdaten und ein Referenzbuch.","de",{},true,"\u002Fde\u002Fist-jwt-sicher-oder-verwundbar",5,{"title":6,"description":246},"ist-jwt-sicher-oder-verwundbar","de\u002Fist-jwt-sicher-oder-verwundbar",[260,261,262],"security","vulnerability","jwt","is-jwt-safe-or-is-it-vulnerable","BTP5PLWJ-bGi8yIU3yyw2wIg-6TZAjD_llbXxwY2UgQ",{"de":266,"en":267,"tr":270},{"path":254,"title":6},{"path":268,"title":269},"\u002Fis-jwt-safe-or-is-it-vulnerable","Is JWT Safe or Is It Vulnerable?",{"path":271,"title":272},"\u002Ftr\u002Fjwt-guvenli-mi-guvenlik-acigi-olusturmayin","JWT Güvenli Derken Güvenlik Açığı Oluşturmayın",{"prev":274,"next":277,"others":280,"lucky":301,"readingTime":255},{"path":275,"title":276},"\u002Fde\u002Fhello-world-eine-neue-mehrsprachige-reise","Hello World: Eine neue mehrsprachige Reise",{"path":278,"title":279},"\u002Fde\u002Fheadless-wordpress-was-es-ist-und-wann-sich-der-mehraufwand-lohnt","Headless WordPress: Was es ist und wann sich der Mehraufwand lohnt",[281,284,287,290,293,296,297,298],{"path":282,"title":283},"\u002Fde\u002Fwarum-ich-einige-technische-artikel-ausgemustert-habe","Warum ich einige meiner technischen Artikel ausgemustert habe",{"path":285,"title":286},"\u002Fde\u002Fbrauchen-sie-fuer-google-consent-mode-v2-eine-kostenpflichtige-cmp","Brauchen Sie für Google Consent Mode v2 eine kostenpflichtige CMP?",{"path":288,"title":289},"\u002Fde\u002Fci-cd-fuer-php-ein-umfassender-leitfaden","CI\u002FCD für PHP: Ein umfassender Leitfaden",{"path":291,"title":292},"\u002Fde\u002Fphp-ml-in-einer-php-anwendung-ein-abgegrenzter-entscheidungsleitfaden","PHP-ML in einer PHP-Anwendung: Ein abgegrenzter Entscheidungsleitfaden",{"path":294,"title":295},"\u002Fde\u002Fphp-zertifizierungen-2026","PHP-Zertifizierungen 2026: Was offiziell und sinnvoll ist – und was Sie meiden sollten",{"path":278,"title":279},{"path":275,"title":276},{"path":299,"title":300},"\u002Fde\u002Fwas-ist-ecmascript-und-was-nicht","Was ist ECMAScript – und was nicht?",{"path":288,"title":289},[],[304,306,308],{"path":299,"title":300,"date":305},"2022-04-08",{"path":278,"title":279,"date":307},"2022-05-17",{"path":294,"title":295,"date":309},"2023-01-09",1788263961895]