Im Zusammenhang mit JWTs hat Stormpath einen ziemlich hilfreichen Artikel verfasst, in dem mögliche Speichermöglichkeiten und die (Nachteile) der einzelnen Methoden beschrieben werden.
Es gibt auch einen kurzen Überblick über XSS- und CSRF-Angriffe und wie Sie sie bekämpfen können.
Ich habe einige kurze Ausschnitte des folgenden Artikels angehängt, falls der Artikel offline geschaltet wird oder die Website ausfällt.
Lokaler Speicher
Probleme:
Auf den Webspeicher (localStorage / sessionStorage) kann über JavaScript in derselben Domäne zugegriffen werden. Dies bedeutet, dass jedes auf Ihrer Site ausgeführte JavaScript Zugriff auf den Webspeicher hat und daher anfällig für Cross-Site-Scripting-Angriffe (XSS) sein kann. Kurz gesagt, XSS ist eine Art von Sicherheitsanfälligkeit, bei der ein Angreifer JavaScript einfügen kann, das auf Ihrer Seite ausgeführt wird. Grundlegende XSS-Angriffe versuchen, JavaScript über Formulareingaben einzufügen, wobei der Angreifer eine Warnung ausgibt ("Sie werden gehackt"). in ein Formular, um zu sehen, ob es vom Browser ausgeführt wird und von anderen Benutzern angezeigt werden kann.
Verhütung:
Um XSS zu verhindern, besteht die allgemeine Antwort darin, alle nicht vertrauenswürdigen Daten zu maskieren und zu codieren. Dies ist jedoch weit von der ganzen Geschichte entfernt. Im Jahr 2015 verwenden moderne Web-Apps JavaScript, das auf CDNs oder außerhalb der Infrastruktur gehostet wird. Moderne Web-Apps enthalten JavaScript-Bibliotheken von Drittanbietern für A / B-Tests, Trichter- / Marktanalysen und Anzeigen. Wir verwenden Paketmanager wie Bower, um den Code anderer Leute in unsere Apps zu importieren.
Was ist, wenn nur eines der von Ihnen verwendeten Skripte kompromittiert wird? Schädliches JavaScript kann in die Seite eingebettet werden, und der Webspeicher ist gefährdet. Durch diese Art von XSS-Angriffen kann der Webspeicher aller Benutzer, die Ihre Website besuchen, ohne deren Wissen abgerufen werden. Dies ist wahrscheinlich der Grund, warum eine Reihe von Organisationen raten, nichts Wertvolles zu speichern oder Informationen im Webspeicher zu vertrauen. Dies umfasst Sitzungskennungen und Token.
Als Speichermechanismus erzwingt Web Storage während der Übertragung keine sicheren Standards. Wer Web Storage liest und verwendet, muss seine Sorgfalt walten lassen, um sicherzustellen, dass die JWT immer über HTTPS und niemals über HTTP gesendet wird.
Kekse
Probleme:
Cookies sind bei Verwendung mit dem HttpOnly-Cookie-Flag nicht über JavaScript zugänglich und gegen XSS immun. Sie können auch das Secure Cookie-Flag setzen, um sicherzustellen, dass das Cookie nur über HTTPS gesendet wird. Dies ist einer der Hauptgründe dafür, dass Cookies in der Vergangenheit zum Speichern von Token oder Sitzungsdaten verwendet wurden. Moderne Entwickler zögern, Cookies zu verwenden, da sie traditionell verlangen, dass der Status auf dem Server gespeichert wird, wodurch RESTful Best Practices verletzt werden. Cookies als Speichermechanismus erfordern nicht, dass der Status auf dem Server gespeichert wird, wenn Sie eine JWT im Cookie speichern. Dies liegt daran, dass der JWT alles kapselt, was der Server benötigt, um die Anforderung zu bedienen.
Cookies sind jedoch anfällig für eine andere Art von Angriff: Cross-Site Request Forgery (CSRF). Ein CSRF-Angriff ist eine Art von Angriff, der auftritt, wenn eine böswillige Website, E-Mail oder ein Blog dazu führt, dass der Webbrowser eines Benutzers eine unerwünschte Aktion auf einer vertrauenswürdigen Website ausführt, auf der der Benutzer derzeit authentifiziert ist. Dies ist ein Exploit, wie der Browser mit Cookies umgeht. Ein Cookie kann nur an die Domänen gesendet werden, in denen es zulässig ist. Standardmäßig ist dies die Domäne, die das Cookie ursprünglich gesetzt hat. Der Cookie wird für eine Anfrage gesendet, unabhängig davon, ob Sie sich auf galaxies.com oder hahagonnahackyou.com befinden.
Verhütung:
Moderne Browser unterstützen die SameSite
Flagge zusätzlich zu HttpOnly
und Secure
. Der Zweck dieses Flags besteht darin, zu verhindern, dass das Cookie in standortübergreifenden Anforderungen übertragen wird, und so viele Arten von CSRF-Angriffen zu verhindern.
Für Browser, die dies nicht unterstützen SameSite
, kann CSRF durch Verwendung synchronisierter Token-Muster verhindert werden. Das klingt kompliziert, aber alle modernen Web-Frameworks unterstützen dies.
AngularJS bietet beispielsweise eine Lösung, mit der überprüft werden kann, ob nur Ihre Domain auf das Cookie zugreifen kann. Direkt aus AngularJS-Dokumenten:
Bei der Ausführung von XHR-Anforderungen liest der $ http-Dienst ein Token aus einem Cookie (standardmäßig XSRF-TOKEN) und legt es als HTTP-Header (X-XSRF-TOKEN) fest. Da nur JavaScript, das auf Ihrer Domain ausgeführt wird, das Cookie lesen kann, kann Ihr Server sicher sein, dass das XHR von JavaScript stammt, das auf Ihrer Domain ausgeführt wird. Sie können diesen CSRF-Schutz zustandslos machen, indem Sie einen xsrfToken
JWT-Anspruch hinzufügen:
{
"iss": "http://galaxies.com",
"exp": 1300819380,
"scopes": ["explorer", "solar-harvester", "seller"],
"sub": "tom@andromeda.com",
"xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e"
}
Durch die Nutzung des CSRF-Schutzes Ihres Web-App-Frameworks sind Cookies für die Speicherung eines JWT absolut stabil. CSRF kann auch teilweise verhindert werden, indem Sie den HTTP-Referer und den Origin-Header in Ihrer API überprüfen. CSRF-Angriffe enthalten Referer- und Origin-Header, die nicht mit Ihrer Anwendung zusammenhängen.
Den vollständigen Artikel finden Sie hier:
https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/
Sie haben auch einen hilfreichen Artikel darüber, wie JWTs im Hinblick auf die Struktur des Tokens selbst am besten entworfen und implementiert werden können:
https://stormpath.com/blog/jwt-the-right-way/