Zurück zur Startseite

So implementieren Sie die JWT-Authentifizierung: Schritt-für-Schritt-Anleitung

Dieser umfassende Leitfaden erklärt, wie man die JWT-Authentifizierung für moderne Web-APIs implementiert. Er behandelt die Token-Architektur, Schritt-für-Schritt-Implementierung mit .NET- und Node.js-Beispielen, Sicherheits-Best Practices einschließlich Refresh-Token-Rotation und asymmetrischer Signierung sowie häufige Fallstricke, die es zu vermeiden gilt.

JWT-Authentifizierungsimplementierung: Sicherheits-Best Practices
Advertisement 728x90

.NET

JWT-Authentifizierung: Vollständige Implementierungsanleitung

Die Implementierung einer sicheren Authentifizierung ist eine zentrale Herausforderung für moderne Web-APIs und Anwendungen. JSON Web Tokens (JWTs) haben sich als Industriestandard für zustandslose Authentifizierung etabliert und ermöglichen es Servern, die Benutzeridentität zu überprüfen, ohne serverseitige Sitzungsdaten vorhalten zu müssen. Am Ende dieser Anleitung verstehen Sie die vollständige Architektur der JWT-basierten Authentifizierung, können eine sichere Token-Ausstellung und -Validierung in Ihren eigenen Anwendungen implementieren und verfügen über eine produktionsreife Strategie für das Lebenszyklusmanagement von Tokens. Sie erhalten das praktische Wissen, um JWT-Authentifizierung sicher in jedem Tech-Stack zu implementieren.

Was Sie lernen werden

Sie verstehen, wie JWTs architektonisch funktionieren, warum eine korrekte Implementierung für die Sicherheit entscheidend ist, und erlangen praktische Kenntnisse zur Konfiguration von Authentifizierungs-Middleware, zur Ausstellung von Tokens und zum Schutz von API-Endpunkten. Am Ende sind Sie in der Lage, JWT-Authentifizierung in Ihren eigenen Projekten zu implementieren und dabei Vertrauen in Ihre Sicherheitsentscheidungen zu haben.

Google AdInline article slot

Verständnis der JWT-Authentifizierungsarchitektur

Bevor wir in den Code eintauchen, ist es wichtig zu verstehen, wie JWT-Authentifizierung funktioniert. Ein JSON Web Token ist ein kompaktes, URL-sicheres Mittel zur Darstellung von Ansprüchen (Claims) zwischen zwei Parteien. Das Token besteht aus drei Base64URL-codierten Teilen, die durch Punkte getrennt sind: Header, Payload und Signatur (header.payload.signature).

Der JWT-Authentifizierungsablauf folgt einem klaren Muster: Ein Client authentifiziert sich (typischerweise über einen Login-Endpunkt), erhält ein signiertes Token und fügt dieses Token dann in den Authorization-Header nachfolgender Anfragen ein. Der Server validiert die Signatur und die Claims des Tokens bei jeder Anfrage, was das System zustandslos macht – es ist keine serverseitige Sitzungsspeicherung erforderlich.

Schlüsselkomponenten eines JWT

Komponente Zweck Beispiel
Header Gibt Signieralgorithmus und Tokentyp an {"alg":"RS256","typ":"JWT"}
Payload Enthält Claims (Benutzerdaten, Ablauf, Aussteller) {"sub":"user123","exp":1700000000}
Signatur Stellt Integrität und Authentizität des Tokens sicher Kryptografischer Hash von Header+Payload mit Secret

Dieses Design macht JWTs ideal für verteilte Systeme und Microservices, bei denen die gemeinsame Nutzung von Sitzungszuständen unpraktisch wäre.

Google AdInline article slot

So implementieren Sie JWT-Authentifizierung: Schritt-für-Schritt-Anleitung

Die folgenden Schritte beschreiben einen produktionsreifen Ansatz zur Implementierung von JWT-Authentifizierung. Während die Beispiele .NET und Node.js verwenden, gelten die Prinzipien für alle Programmiersprachen.

Schritt 1: Installieren der erforderlichen Authentifizierungspakete

Moderne Frameworks bieten offizielle JWT-Bearer-Authentifizierungshandler. Für .NET installieren Sie das Paket Microsoft.AspNetCore.Authentication.JwtBearer. Für Node.js verwenden Sie jsonwebtoken.

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

# Node.js
npm install jsonwebtoken bcryptjs dotenv

Die Verwendung offizieller, kampferprobter Bibliotheken ist unerlässlich – implementieren Sie niemals Ihre eigene kryptografische Signierlogik.

Google AdInline article slot

Schritt 2: Konfigurieren der Authentifizierungsdienste

Die Authentifizierungskonfiguration definiert, wie Ihre API eingehende Tokens validiert. Kritische Validierungsparameter umfassen:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options => {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,           // Überprüfen, ob Token von bekannter Autorität stammt
            ValidateAudience = true,         // Überprüfen, ob Token für diese API bestimmt ist
            ValidateLifetime = true,         // Abgelaufene Tokens automatisch ablehnen
            ValidateIssuerSigningKey = true, // Kryptografische Signatur überprüfen
            ValidIssuer = "https://your-identity-provider.com",
            ValidAudience = "https://your-api.com",
            IssuerSigningKey = publicKey     // Der Schlüssel zur Signaturüberprüfung
        };
    });

Alle vier Validierungsflags sollten in der Produktion auf true gesetzt sein. Das Deaktivieren eines dieser Flags erzeugt Sicherheitslücken. Der IssuerSigningKey kann aus einer PEM-Datei geladen oder in der Produktion automatisch vom Metadaten-Endpunkt des Identitätsanbieters abgerufen werden.

Schritt 3: Hinzufügen von Authentifizierungs- und Autorisierungs-Middleware

Die Reihenfolge der Middleware-Komponenten ist entscheidend – die Authentifizierung muss vor der Autorisierung ausgeführt werden:

app.UseAuthentication();  // Validiert JWT und befüllt HttpContext.User
app.UseAuthorization();   // Erzwingt [Authorize]-Richtlinien an geschützten Endpunkten

Wenn eine Anfrage UseAuthentication erreicht, untersucht der Handler den Authorization-Header, validiert das JWT und erstellt einen ClaimsPrincipal, der den authentifizierten Benutzer repräsentiert. Dieses Objekt steht dann während der gesamten Anfragepipeline für Autorisierungsentscheidungen zur Verfügung.

Schritt 4: Schützen von Endpunkten mit dem [Authorize]-Attribut

Das Sichern von API-Endpunkten erfordert das [Authorize]-Attribut:

[Authorize]
[ApiController]
[Route("api/[controller]")]
public class SecureController : ControllerBase
{
    [HttpGet]
    public IActionResult GetSecureData()
    {
        var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
        return Ok($"Authentifizierter Benutzer: {userId}");
    }
}

Anfragen ohne gültiges Token erhalten eine 401 Unauthorized-Antwort. Wenn die Authentifizierung erfolgreich ist, aber die erforderlichen Berechtigungen fehlen, gibt die API 403 Forbidden zurück.

Schritt 5: Implementieren der Token-Ausstellung (Nur für Entwicklung)

In der Produktion gehört die Token-Ausstellung zu einem dedizierten Identitätsanbieter (IdP), der OAuth 2.0 oder OpenID Connect implementiert. Die Rolle der API beschränkt sich auf die Validierung.

Für Entwicklung und Tests benötigen Sie jedoch möglicherweise einen lokalen Token-Endpunkt:

// Node.js-Beispiel mit jsonwebtoken
router.post('/login', async (req, res) => {
  const { email, password } = req.body;
  const user = await User.findOne({ email });
  
  if (!user || !(await bcrypt.compare(password, user.password))) {
    return res.status(401).json({ message: 'Ungültige Anmeldedaten' });
  }
  
  const token = jwt.sign(
    { id: user._id, email: user.email },
    process.env.JWT_SECRET,
    { expiresIn: '15m' } // Kurzlebige Zugriffstokens
  );
  
  res.json({ token });
});

Zugriffstokens sollten kurze Lebensdauern haben – typischerweise 15 Minuten – um den Schaden durch Tokendiebstahl zu begrenzen.

Best Practices für Produktionssicherheit

Tokens niemals im LocalStorage speichern

Für Webanwendungen speichern Sie JWTs in HttpOnly, Secure Cookies anstelle von localStorage oder sessionStorage. Dies verhindert, dass Cross-Site-Scripting (XSS)-Angriffe auf Tokens zugreifen. Die Cookie-Konfiguration sollte Folgendes umfassen:

HttpOnly: true       // Verhindert JavaScript-Zugriff
Secure: true         // Nur über HTTPS gesendet
SameSite: Lax oder Strict  // CSRF-Schutz

Refresh-Token-Rotation verwenden

Da Zugriffstokens schnell ablaufen, implementieren Sie einen Refresh-Token-Mechanismus, um Benutzersitzungen aufrechtzuerhalten, ohne eine erneute Authentifizierung zu erfordern:

  • Refresh-Token: Langlebig (z. B. 7 Tage), sicher auf dem Server gespeichert
  • Zugriffstoken: Kurzlebig (z. B. 15 Minuten), mit jeder Anfrage gesendet
  • Rotation: Jede Refresh-Anfrage gibt ein neues Zugriffs- und Refresh-Paar aus und macht das alte Refresh-Token ungültig

Dieser Ansatz mildert die Auswirkungen gestohlener Tokens und ermöglicht eine saubere Abmeldefunktionalität.

Asymmetrische Signatur (RS256/ES256) für die Produktion verwenden

Verwenden Sie in der Produktion asymmetrische Algorithmen (RS256 oder ES256) anstelle von HMAC (HS256):

Algorithmus Schlüsseltyp Anwendungsfall
HS256 Symmetrisch (gemeinsames Geheimnis) Einzeldienstanwendungen
RS256/ES256 Asymmetrisch (öffentlicher/privater Schlüssel) Mehrdienste-Systeme, Microservices

Asymmetrische Signatur ermöglicht es mehreren Diensten, Tokens mit einem öffentlichen Schlüssel zu überprüfen, während nur der Aussteller den privaten Schlüssel besitzt – nach dem Prinzip der geringsten Privilegien.

Alle Standard-Claims validieren

Die folgenden Claims sind für OAuth 2.0-Zugriffstokens erforderlich und müssen validiert werden:

  • iss (Aussteller) – stimmt mit der erwarteten Autorität überein
  • aud (Zielgruppe) – stimmt mit Ihrer API-Kennung überein
  • exp (Ablauf) – Token ist nicht abgelaufen
  • sub (Betreff) – Benutzerkennung
  • iat (Ausstellungszeit) – Token wurde in der Vergangenheit ausgestellt
  • jti (JWT-ID) – eindeutige Kennung für Token-Tracking

Zustandslose Authentifizierung mit Redis

Während JWTs von Natur aus zustandslos sind, erfordert die Implementierung des Token-Widerrufs eine Speicherschicht. Redis bietet eine ideale Lösung:

// Token-Metadaten für Widerruf speichern
func (r *Redis) SetJTI(ctx context.Context, key, userID string, exp time.Time) error {
    return r.Client.Set(ctx, key, userID, time.Until(exp)).Err()
}

// Überprüfen, ob Token widerrufen wurde
func (r *Redis) GetUserByJTI(ctx context.Context, key string) (string, error) {
    return r.Client.Get(ctx, key).Result()
}

Speichern Sie die eindeutige Kennung des Tokens (jti) in Redis mit einer TTL, die der Ablaufzeit des Tokens entspricht. Dies ermöglicht eine sofortige Abmeldung und verhindert die Wiederverwendung kompromittierter Tokens.

Häufige Fehler bei der JWT-Implementierung, die Sie vermeiden sollten

  1. Selbstausstellung von Tokens in der Produktion: APIs sollten Tokens validieren, nicht ausstellen. Verwenden Sie einen dedizierten IdP für die Ausstellung.

  2. Schwache Signierschlüssel: Verwenden Sie kryptografisch starke Geheimnisse (mindestens 32 Bytes), generiert mit openssl rand -base64 32.

  3. Deaktivieren der Claim-Validierung: Setzen Sie ValidateIssuer oder ValidateAudience in der Produktion niemals auf false.

  4. Lange Token-Lebensdauern: Zugriffstokens sollten innerhalb von 15 Minuten ablaufen. Längere Lebensdauern erhöhen die Angriffsfläche.

  5. Kein Widerrufsmechanismus: Implementieren Sie Abmeldung und Token-Widerruf mit Redis oder einem ähnlichen Speicher.

Häufig gestellte Fragen

Was ist der Unterschied zwischen JWT-Authentifizierung und OAuth 2.0? JWT ist ein Token-Format, während OAuth 2.0 ein Autorisierungsframework ist. OAuth 2.0 definiert, wie Tokens (einschließlich JWTs) bezogen werden, während JWT die Struktur des Tokens selbst definiert. Sie ergänzen sich – OAuth 2.0 kann JWTs als Zugriffstokens verwenden, aber Sie können JWTs auch unabhängig für die Authentifizierung in kleineren Systemen einsetzen.

Wie speichere ich JWTs sicher auf der Client-Seite? Speichern Sie JWTs in HttpOnly, Secure Cookies anstelle von localStorage oder sessionStorage. HttpOnly-Cookies verhindern JavaScript-Zugriff und schützen vor XSS-Angriffen. Für mobile Anwendungen verwenden Sie sichere plattformspezifische Speichermechanismen.

Kann ich ein JWT vor seinem Ablauf widerrufen? Ja, durch die Pflege einer Widerrufsliste oder eines Speichers von Token-Kennungen (jti-Claims). Redis ist dafür ideal – speichern Sie die jti mit einer TTL, die der Ablaufzeit des Tokens entspricht. Überprüfen Sie bei jeder Anfrage, ob die jti im Widerrufsspeicher vorhanden ist. Dies ermöglicht eine sofortige Abmeldung und Token-Ungültigmachung.

Sollte ich HS256 oder RS256 zum Signieren von JWTs verwenden? Verwenden Sie RS256 (asymmetrisch) für Produktionsumgebungen mit mehreren Diensten, bei denen Token-Ausstellung und -Validierung auf verschiedenen Systemen erfolgen. Verwenden Sie HS256 nur für Einzeldienstanwendungen, bei denen dasselbe Geheimnis sicher geteilt werden kann. Asymmetrische Signatur ermöglicht es Validierungsdiensten, nur den öffentlichen Schlüssel zu verwenden, nach dem Prinzip der geringsten Privilegien.

Wie implementiere ich Refresh-Tokens sicher? Stellen Sie ein langlebiges Refresh-Token (7 Tage) zusammen mit dem kurzlebigen Zugriffstoken (15 Minuten) aus. Stellen Sie einen /refresh-Endpunkt bereit, der das Refresh-Token akzeptiert, validiert und ein neues Zugriffs- und Refresh-Paar zurückgibt. Rotieren Sie Refresh-Tokens bei jeder Verwendung, um Token-Replay-Angriffe zu verhindern. Speichern Sie Refresh-Tokens sicher (z. B. in Redis) und machen Sie sie bei Abmeldung ungültig.

Quellen

  • Duende Software. "A step by step JWT authentication example." Duende Software. 2025.
  • Microsoft Learn. "Configure JWT bearer authentication in ASP.NET Core." Microsoft. 2025.
  • Duende Software. "Implementing Token Authentication in Controller-Based ASP.NET Core Web APIs." Duende Software. 2026.
  • QuickNode. "How to Implement JSON Web Tokens (JWT) Authorization." QuickNode. 2025.
  • freeCodeCamp. "How to Build a Secure Authentication System with JWT and Refresh Tokens." freeCodeCamp. 2025.
  • Vonage. "JWT Authentication in Go with Gin." Vonage Developer. 2025.

— Editorial Team

Advertisement 728x90

Weiterlesen