Sie können die Sicherheit im Authentifizierungsprozess erhöhen, indem Sie JWT (JSON Web Tokens) und SSL/HTTPS verwenden.
Die Basic Auth / Session-ID kann gestohlen werden durch:
- MITM-Angriff (Man-In-The-Middle) - ohne SSL/HTTPS
- Ein Eindringling gewinnt Zugriff auf den Computer eines Benutzers
- XSS
Durch die Verwendung von JWT werden die Authentifizierungsdetails des Benutzers verschlüsselt und im Client gespeichert, und bei jeder Anfrage an die API gesendet, wo der Server/API das Token validiert. Es kann nicht entschlüsselt/lesen werden ohne den privaten Schlüssel (den der Server/API geheim hält) Lesen Sie das Update.
Der neue (sicherere) Ablauf wäre:
Einloggen
- Benutzer meldet sich an und sendet Anmeldeinformationen an die API (über SSL/HTTPS)
- Die API empfängt die Anmeldeinformationen
- Wenn gültig:
- Neue Sitzung in der Datenbank registrieren Lesen Sie das Update
- Benutzer-ID, Sitzungs-ID, IP-Adresse, Zeitstempel usw. mit einem privaten Schlüssel in einem JWT verschlüsseln
- API sendet das JWT-Token zurück an den Client (über SSL/HTTPS)
- Der Client empfängt das JWT-Token und speichert es in localStorage/Cookie
Jede Anfrage an die API
- Benutzer sendet eine HTTP-Anfrage an die API (über SSL/HTTPS) mit dem gespeicherten JWT-Token im HTTP-Header
- Die API liest den HTTP-Header und entschlüsselt das JWT-Token mit seinem privaten Schlüssel
- Die API validiert das JWT-Token, gleicht die IP-Adresse der HTTP-Anfrage mit der im JWT-Token ab und überprüft, ob die Sitzung abgelaufen ist
- Wenn gültig:
- Antwort mit angefordertem Inhalt zurückgeben
- Wenn ungültig:
- Ausnahme werfen (403 / 401)
- Einbruch im System kennzeichnen
- Eine Warn-E-Mail an den Benutzer senden.
Aktualisiert am 30.07.15:
JWT-Payload/Claims können tatsächlich ohne den privaten Schlüssel (Geheimnis) gelesen werden und es ist nicht sicher, es in localStorage zu speichern. Es tut mir leid über diese falschen Aussagen. Sie scheinen jedoch an einem JWE-Standard (JSON Web Encryption) zu arbeiten.
Ich habe dies umgesetzt, indem ich Ansprüche (Benutzer-ID, exp) in einem JWT gespeichert habe, es mit einem privaten Schlüssel (Geheimnis) signiert habe, den nur die API/backend kennt, und es als sicheres HttpOnly-Cookie auf dem Client gespeichert habe. Auf diese Weise kann es nicht über XSS gelesen werden und kann nicht manipuliert werden, da das JWT die Signaturprüfung fehlschlägt. Auch durch Verwendung eines sicheren HttpOnly-Cookies stellen Sie sicher, dass das Cookie nur über HTTP-Anfragen gesendet wird (nicht zugänglich für Skript) und nur über eine sichere Verbindung gesendet wird (HTTPS).
Aktualisiert am 17.07.16:
JWTs sind von Natur aus zustandslos. Das bedeutet, sie invalidieren/verfallen von selbst. Indem Sie die Session-ID in den Ansprüchen des Tokens hinzufügen, machen Sie es zustandsbehaftet, weil dessen Gültigkeit nicht mehr nur von der Signaturprüfung und dem Ablaufdatum abhängt, sondern auch vom Sitzungszustand auf dem Server. Der Vorteil ist jedoch, dass Sie Tokens/Sitzungen leicht ungültig machen können, was mit zustandslosen JWTs bisher nicht möglich war.