Zum Sichern der REST-API mithilfe von JWT kann das JWT gemäß einigen Materialien (wie diesem Handbuch und dieser Frage ) entweder in localStorage oder in Cookies gespeichert werden . Nach meinem Verständnis:
- localStorage unterliegt XSS und es wird im Allgemeinen nicht empfohlen, vertrauliche Informationen darin zu speichern.
- Mit Cookies können wir das Flag "httpOnly" anwenden, um das Risiko von XSS zu verringern. Wenn wir jedoch die JWT von Cookies im Backend lesen wollen, sind wir CSRF unterworfen.
Basierend auf der obigen Prämisse ist es am besten, wenn wir JWT in Cookies speichern. Bei jeder Anforderung an den Server wird das JWT aus Cookies gelesen und mithilfe des Bearer-Schemas im Authorization-Header hinzugefügt. Der Server kann dann die JWT im Anforderungsheader überprüfen (anstatt sie aus den Cookies zu lesen).
Ist mein Verständnis richtig? Wenn ja, hat der oben genannte Ansatz Sicherheitsbedenken? Oder können wir überhaupt erst mit localStorage davonkommen?
Antworten:
Ich mag die XSRF Double Submit Cookies-Methode, die in dem Artikel erwähnt wurde, den @ pkid169 sagte, aber eines sagt Ihnen dieser Artikel nicht. Sie sind immer noch nicht gegen XSS geschützt, da der Angreifer ein Skript einfügen kann, das Ihr CSRF-Cookie liest (das nicht HttpOnly ist), und dann mithilfe dieses CSRF-Tokens eine Anforderung an einen Ihrer API-Endpunkte sendet, wobei das JWT-Cookie automatisch gesendet wird.
In Wirklichkeit sind Sie immer noch anfällig für XSS. Der Angreifer kann Ihnen das JWT-Token nicht für die spätere Verwendung stehlen, aber er kann mithilfe von XSS weiterhin Anforderungen im Namen Ihrer Benutzer stellen.
Unabhängig davon, ob Sie Ihr JWT in einem localStorage oder Ihr XSRF-Token in einem nicht nur auf http basierenden Cookie speichern, kann XSS beide problemlos abrufen. Sogar Ihr JWT in HttpOnly-Cookie kann von einem fortgeschrittenen XSS-Angriff erfasst werden.
Zusätzlich zur Double Submit Cookies-Methode müssen Sie daher immer die Best Practices für XSS befolgen, einschließlich des Escape-Inhalts. Dies bedeutet, dass ausführbarer Code entfernt wird, der den Browser dazu veranlasst, etwas zu tun, das Sie nicht möchten. In der Regel bedeutet dies, dass // <! [CDATA [-Tags und HTML-Attribute entfernt werden, die die Auswertung von JavaScript bewirken.
quelle
Html.AntiForgeryToken()
in ASP.NET MVC verwendet ein HttpOnly-Cookie für das CSRF-Token. Ich denke, Sie sind immer noch anfällig für bestimmte XSS, aber ich dachte, das wäre erwähnenswert.Ein rechtzeitiger Beitrag von Stormpath hat meine Punkte ziemlich genau ausgearbeitet und meine Frage beantwortet.
TL; DR
Speichern Sie die JWT in Cookies und übergeben Sie die JWT entweder bei jeder von mir erwähnten Anfrage im Authorization-Header, oder verlassen Sie sich, wie im Artikel vorgeschlagen, auf das Backend, um CSRF zu verhindern (z. B.
xsrfToken
bei Angular).quelle
Stattdessen können Sie beim Anmelden zwei Token bereitstellen: Zugriffstoken und Aktualisierungstoken. Das Zugriffstoken sollte im Javascript-Speicher und das Aktualisierungstoken im HttpOnly-Cookie gespeichert werden. Das Aktualisierungstoken wird nur und nur zum Erstellen neuer Zugriffstoken verwendet - mehr nicht.
Wenn der Benutzer eine neue Registerkarte öffnet oder vor Ort aktualisiert wird, müssen Sie eine Anforderung ausführen, um ein neues Zugriffstoken zu erstellen, das auf dem in Cookie gespeicherten Aktualisierungstoken basiert.
Ich empfehle außerdem dringend, diesen Artikel zu lesen: https://hasura.io/blog/best-practices-of-using-jwt-with-graphql/
quelle
secure
,samesite: strict
,http-only
?Um CSRF-Angriffe zu verhindern, die vorhandene Cookies nutzen, können Sie Ihr Cookie mit der
SameSite
Direktive setzen. Stellen Sie es auflax
oder einstrict
.Dies ist noch ein Entwurf und wird ab 2019 nicht von allen aktuellen Browsern vollständig unterstützt. Abhängig von der Vertraulichkeit Ihrer Daten und / oder Ihrer Kontrolle über die von Ihren Benutzern verwendeten Browser ist dies möglicherweise eine praktikable Option. Wenn Sie die Direktive mit
SameSite=lax
festlegen, werden "Navigationen auf oberster Ebene verwendet, die eine 'sichere' ... HTTP-Methode verwenden".quelle