Authentifizierung
Wer bist du, und wie beweist du es? Wie Passwörter richtig gespeichert werden, was OAuth 2 und OpenID Connect eigentlich tun, was in einem JWT steht – und warum Passkeys das Phishing beenden könnten.
Authentifizierung klärt, wer jemand ist. Autorisierung klärt, was er darf. Nachweisen kann man sich durch etwas, das man weiß (Passwort), hat (Handy, Sicherheitsschlüssel) oder ist (Fingerabdruck). Zwei davon zusammen ergeben Mehr-Faktor-Authentifizierung.
Für Entwickler zählen vier Dinge: Passwörter nur mit einer absichtlich langsamen Hashfunktion speichern. Nach dem Login Sitzung oder Token sicher handhaben. Für „Anmelden mit …“ und API-Zugriffe OAuth 2 und OpenID Connect verstehen. Und Passkeys kennen – sie ersetzen Passwörter durch Schlüsselpaare und sind immun gegen Phishing.
Wer bist du?
Wissen
Passwort, PIN. Kann erraten, ausgespäht, weitergegeben oder auf einer gefälschten Seite eingegeben werden.
Besitz
Handy mit Authenticator-App, Hardware-Schlüssel, Chipkarte. Ein Angreifer muss es physisch oder technisch in die Hand bekommen.
Sein
Fingerabdruck, Gesicht. Meist entsperrt es nur lokal ein Gerät, auf dem der eigentliche Schlüssel liegt.
Nicht jede Zwei-Faktor-Lösung ist gleich gut. SMS-Codes lassen sich durch das Umleiten der Telefonnummer abfangen (SIM-Swapping). Einmalcodes aus einer App (TOTP: aus einem gemeinsamen Geheimnis und der Uhrzeit berechnet, alle 30 Sekunden neu) sind besser – aber ein Nutzer kann sie auf einer Phishing-Seite eintippen. Wirklich phishing-resistent sind nur Hardware-Schlüssel und Passkeys.
Passwörter speichern
Die Grundregel: Ein Server speichert nie das Passwort selbst, sondern einen Hash. Beim Login wird die Eingabe gehasht und verglichen. Aber welcher Hash? Was passiert, wenn die Datenbank gestohlen wird – und das passiert ständig – zeigt das Experiment:
Drei Lehren daraus:
- Salt: Ein zufälliger Wert pro Nutzer, der mitgehasht und neben dem Hash gespeichert wird. Gleiche Passwörter ergeben dann verschiedene Hashes, und vorberechnete Tabellen werden nutzlos. Der Angreifer muss jedes Konto einzeln angreifen.
- Langsam ist gut: SHA-256 ist für Geschwindigkeit gebaut – genau das Falsche für Passwörter. bcrypt, scrypt, PBKDF2 und Argon2id sind absichtlich teuer, mit einstellbarem Aufwand. Argon2id braucht zusätzlich viel Speicher pro Versuch, was Grafikkarten ausbremst. Für einen Nutzer ist ein Login von 100 Millisekunden unmerklich – für einen Angreifer ist es das Ende.
- Länge schlägt Komplexität: Die aktuelle NIST-Empfehlung verlangt lange Passwörter statt Sonderzeichen-Regeln, verzichtet auf erzwungene regelmäßige Wechsel und prüft neue Passwörter gegen Listen bereits geleakter Passwörter.
Nach dem Login: Sitzung oder Token
HTTP ist zustandslos – der Server muss den Nutzer bei jeder Anfrage wiedererkennen. Zwei Wege:
| Sitzung (Session) | Token (z. B. JWT) | |
|---|---|---|
| Was der Client hat | eine zufällige Sitzungs-ID im Cookie | ein signiertes Dokument mit Nutzer, Rechten und Ablaufzeit |
| Was der Server prüft | schlägt die ID im Sitzungsspeicher nach | prüft nur die Signatur – keine Datenbank nötig |
| Abmelden, sperren | sofort: Eintrag löschen | schwierig: Das Token bleibt bis zum Ablauf gültig |
| Gut für | klassische Web-Anwendungen | APIs, Microservices, mobile Apps |
Weil Tokens nicht zurückgerufen werden können, gibt man ihnen eine kurze Laufzeit – Minuten – und dazu ein langlebiges Refresh-Token, mit dem der Client sich neue holt. Das Refresh-Token kann der Server sperren.
Was in einem JWT steht
Ein JSON Web Token besteht aus drei Base64-kodierten Teilen, getrennt durch Punkte: Kopf, Inhalt, Signatur. Der Inhalt ist nicht verschlüsselt – jeder kann ihn lesen. Geschützt ist er nur gegen Veränderung:
OAuth 2 und OpenID Connect
„Anmelden mit Google“, „Diese App möchte auf deinen Kalender zugreifen“ – dahinter steckt OAuth 2. Sein Zweck ist delegierter Zugriff: Eine Anwendung bekommt eingeschränkte Rechte, ohne je das Passwort zu sehen. Früher gab man Drittanbietern sein Passwort – und damit alles. OpenID Connect (OIDC) setzt darauf auf und liefert zusätzlich ein ID-Token, das sagt, wer sich angemeldet hat. Erst damit wird OAuth zum Login.
Wichtige Begriffe auf einen Blick: Der Scope legt fest, was die App darf – etwa nur Kalender lesen. Das Access-Token öffnet die API, das ID-Token sagt der App, wer der Nutzer ist, das Refresh-Token holt neue Access-Tokens. Bekannte Autorisierungsserver sind Keycloak, Microsoft Entra ID, Okta, Auth0 sowie Google und Apple für Endkunden.
Passkeys: Anmelden ohne Passwort
Passkeys (technisch: WebAuthn und FIDO2) ersetzen das Passwort durch ein Schlüsselpaar, wie in der Kryptografie beschrieben. Bei der Registrierung erzeugt das Gerät für genau diese Website ein Paar; der Server bekommt nur den öffentlichen Schlüssel. Beim Login schickt der Server eine Zufallszahl, das Gerät signiert sie mit dem privaten Schlüssel – freigegeben per Fingerabdruck, Gesicht oder PIN.
Phishing-sicher
Der Schlüssel ist an die Domain gebunden. Auf bank-login.example funktioniert der Passkey von bank.example schlicht nicht – kein Nutzer kann sich vertun.
Nichts zu stehlen
Der Server speichert nur öffentliche Schlüssel. Ein Datenbank-Leck verrät nichts, womit man sich anmelden könnte.
Synchronisiert
Passkeys werden über den Passwortmanager von Apple, Google, Microsoft oder anderen auf die eigenen Geräte verteilt – ein verlorenes Handy heißt nicht mehr: Konto weg.
Für Entwickler übersetzt
// Passwörter: Spring Security
PasswordEncoder enc = PasswordEncoderFactories.createDelegatingPasswordEncoder();
String gespeichert = enc.encode("sommer2026"); // "{bcrypt}$2a$10$Xk9…" – Verfahren, Kosten, Salt, Hash
boolean ok = enc.matches(eingabe, gespeichert);
// API als OAuth-Resource-Server: Tokens prüft Spring anhand des Ausstellers
// application.yml:
// spring.security.oauth2.resourceserver.jwt.issuer-uri: https://login.example.com/realms/shop
@GetMapping("/api/bestellungen")
@PreAuthorize("hasAuthority('SCOPE_bestellungen.lesen')")
List<Bestellung> meine(@AuthenticationPrincipal Jwt jwt) {
return service.fuerKunde(jwt.getSubject());
}| Regel | Warum |
|---|---|
| Nicht selbst bauen | Login, Passwort-Reset, Token-Prüfung sind voller Fallstricke. Spring Security und ein fertiger Autorisierungsserver wie Keycloak nehmen das ab. |
| Präfix im Hash | Der {bcrypt}-Präfix des DelegatingPasswordEncoder erlaubt, später auf ein stärkeres Verfahren umzusteigen: Alte Hashes funktionieren weiter und werden beim nächsten Login erneuert. |
| Token immer vollständig prüfen | Signatur, Aussteller, Zielgruppe (aud), Ablaufzeit. Und nur die erwarteten Algorithmen akzeptieren – nie "alg": "none". |
| Tokens im Browser | Nicht in localStorage – dort kann jedes eingeschleuste Skript sie lesen. Besser ein HttpOnly-Cookie oder ein Backend, das die Tokens für den Browser verwahrt. |
| Gleiche Fehlermeldung | „Benutzer oder Passwort falsch“ – nie verraten, welches von beiden. Sonst lässt sich testen, welche Konten existieren. |