Zpět na domů

Jak implementovat JWT autentizaci: podrobný průvodce

Tento komplexní průvodce vysvětluje, jak implementovat JWT autentizaci pro moderní webová API. Pokrývá architekturu tokenů, implementaci krok za krokem s příklady v .NET a Node.js, bezpečnostní osvědčené postupy včetně rotace obnovovacích tokenů a asymetrického podepisování, a běžné nástrahy, kterým se vyhnout.

Implementace JWT autentizace: bezpečnostní osvědčené postupy
Advertisement 728x90

.NET

JWT autentizace: Kompletní průvodce implementací

Implementace bezpečné autentizace je klíčovým úkolem pro moderní webová API a aplikace. JSON Web Tokens (JWT) se staly průmyslovým standardem pro bezstavovou autentizaci, která umožňuje serverům ověřit identitu uživatele bez ukládání stavu relace na straně serveru. Na konci této příručky pochopíte celkovou architekturu JWT autentizace, budete schopni implementovat bezpečné vydávání a ověřování tokenů ve svých aplikacích a získáte strategii pro správu životního cyklu tokenů připravenou pro produkční nasazení. Získáte praktické znalosti pro bezpečnou implementaci JWT autentizace v jakémkoli technologickém stacku.

Co se naučíte

Pochopíte, jak JWT architektonicky fungují, proč je správná implementace důležitá pro bezpečnost, a získáte praktické dovednosti pro konfiguraci middleware autentizace, vydávání tokenů a ochranu koncových bodů API. Nakonec budete připraveni implementovat JWT autentizaci ve svých projektech s důvěrou v přijatá bezpečnostní rozhodnutí.

Google AdInline article slot

Pochopení architektury JWT autentizace

Než přejdeme k kódu, je důležité pochopit, jak JWT autentizace funguje. JSON Web Token je kompaktní, URL-bezpečný způsob reprezentace tvrzení mezi dvěma stranami. Token se skládá ze tří částí zakódovaných v Base64URL a oddělených tečkami: hlavička, užitečné zatížení a podpis (header.payload.signature).

Tok JWT autentizace sleduje jasný vzor: klient se autentizuje (obvykle přes koncový bod přihlášení), obdrží podepsaný token a poté tento token zahrne do hlavičky Authorization následujících požadavků. Server ověřuje podpis a tvrzení tokenu při každém požadavku, což činí systém bezstavovým – není vyžadováno ukládání stavu relace na straně serveru.

Klíčové komponenty JWT

Komponenta Účel Příklad
Hlavička Určuje algoritmus podpisu a typ tokenu {"alg":"RS256","typ":"JWT"}
Užitečné zatížení Obsahuje tvrzení (data uživatele, doba platnosti, emitent) {"sub":"user123","exp":1700000000}
Podpis Zajišťuje integritu a pravost tokenu Kryptografický hash hlavičky a užitečného zatížení s tajemstvím

Tato konstrukce činí JWT ideálními pro distribuované systémy a mikroslužby, kde by udržování sdíleného stavu relace bylo nepraktické.

Google AdInline article slot

Jak implementovat JWT autentizaci: Krok za krokem

Následující kroky popisují přístup k implementaci JWT autentizace připravený pro produkční nasazení. Přestože příklady používají .NET a Node.js, principy jsou použitelné pro všechny programovací jazyky.

Krok 1: Nainstalujte potřebné balíčky pro autentizaci

Moderní frameworky poskytují oficiální obslužné rutiny pro JWT Bearer autentizaci. Pro .NET nainstalujte balíček Microsoft.AspNetCore.Authentication.JwtBearer. Pro Node.js použijte jsonwebtoken.

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

# Node.js
npm install jsonwebtoken bcryptjs dotenv

Používání oficiálních, prověřených knihoven je zásadní – nikdy neimplementujte vlastní kryptografickou logiku podpisu.

Google AdInline article slot

Krok 2: Nakonfigurujte služby autentizace

Konfigurace autentizace určuje, jak vaše API ověřuje příchozí tokeny. Kritické parametry ověřování zahrnují:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options => {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,           // Ověřit, že token je od známého emitenta
            ValidateAudience = true,         // Ověřit, že token je určen pro toto API
            ValidateLifetime = true,         // Automaticky odmítat prošlé tokeny
            ValidateIssuerSigningKey = true, // Ověřit kryptografický podpis
            ValidIssuer = "https://your-identity-provider.com",
            ValidAudience = "https://your-api.com",
            IssuerSigningKey = publicKey     // Klíč pro ověření podpisu
        };
    });

Všechny čtyři příznaky ověřování musí být v produkčním nasazení nastaveny na true. Vypnutí kteréhokoli z nich vytváří bezpečnostní zranitelnosti. IssuerSigningKey může být načten z PEM souboru nebo, v produkčním nasazení, automaticky získán z koncového bodu metadat poskytovatele identity.

Krok 3: Přidejte middleware autentizace a autorizace

Pořadí komponent middleware je kritické – autentizace musí být provedena před autorizací:

app.UseAuthentication();  // Ověřuje JWT a naplňuje HttpContext.User
app.UseAuthorization();   // Aplikuje politiky [Authorize] na chráněných koncových bodech

Když požadavek dosáhne UseAuthentication, obslužná rutina zkontroluje hlavičku Authorization, ověří JWT a vytvoří ClaimsPrincipal reprezentující autentizovaného uživatele. Tento objekt je poté dostupný v celém kanálu požadavku pro rozhodování o autorizaci.

Krok 4: Chraňte koncové body pomocí atributu [Authorize]

Pro ochranu koncových bodů API je vyžadován atribut [Authorize]:

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

Požadavky bez platného tokenu obdrží odpověď 401 Unauthorized. Když je autentizace úspěšná, ale chybí potřebná oprávnění, API vrací 403 Forbidden.

Krok 5: Implementujte vydávání tokenů (pouze pro vývoj)

V produkčním nasazení vydávání tokenů patří vyhrazenému poskytovateli identity (IdP), který implementuje OAuth 2.0 nebo OpenID Connect. Role API je omezena na ověřování.

Pro vývoj a testování však může být potřeba lokální koncový bod pro tokeny:

// Příklad v Node.js s 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: 'Neplatné přihlašovací údaje' });
  }
  
  const token = jwt.sign(
    { id: user._id, email: user.email },
    process.env.JWT_SECRET,
    { expiresIn: '15m' } // Krátce žijící přístupové tokeny
  );
  
  res.json({ token });
});

Přístupové tokeny by měly mít krátkou dobu životnosti – obvykle 15 minut – aby se omezila škoda způsobená krádeží tokenu.

Nejlepší bezpečnostní postupy pro produkční nasazení

Nikdy neukládejte tokeny v LocalStorage

Pro webové aplikace ukládejte JWT do HttpOnly, Secure cookies, nikoli do localStorage nebo sessionStorage. Tím se zabrání přístupu k tokenům prostřednictvím cross-site scripting (XSS). Konfigurace cookies by měla zahrnovat:

HttpOnly: true       // Zabraňuje přístupu z JavaScriptu
Secure: true         // Odesílá se pouze přes HTTPS
SameSite: Lax nebo Strict  // Ochrana proti CSRF

Používejte rotaci refresh tokenů

Vzhledem k tomu, že přístupové tokeny rychle vyprší, implementujte mechanismus refresh tokenů pro udržení uživatelských relací bez opětovné autentizace:

  • Refresh token: Dlouho žijící (např. 7 dní), bezpečně uložený na serveru
  • Přístupový token: Krátce žijící (např. 15 minut), odesílán s každým požadavkem
  • Rotace: Každý požadavek na obnovení vydá nový pár tokenů a zneplatní starý refresh token

Tento přístup zmírňuje následky krádeže tokenů a zajišťuje čistou funkcionalitu odhlášení.

Používejte asymetrický podpis (RS256/ES256) pro produkční nasazení

Používejte asymetrické algoritmy (RS256 nebo ES256) místo HMAC (HS256) v produkčním nasazení:

Algoritmus Typ klíče Scénář použití
HS256 Symetrický (sdílené tajemství) Jednoaplikace
RS256/ES256 Asymetrický (veřejný/soukromý klíč) Více-servisní systémy, mikroslužby

Asymetrický podpis umožňuje více službám ověřovat tokeny pomocí veřejného klíče, zatímco pouze emitent vlastní soukromý klíč – v souladu s principem nejmenších oprávnění.

Ověřujte všechna standardní tvrzení

Následující tvrzení jsou povinná pro přístupové tokeny OAuth 2.0 a musí být ověřována:

  • iss (Emitent) – odpovídá očekávanému emitentovi
  • aud (Publika) – odpovídá identifikátoru vašeho API
  • exp (Doba platnosti) – token není prošlý
  • sub (Subjekt) – identifikátor uživatele
  • iat (Čas vydání) – token byl vydán v minulosti
  • jti (ID JWT) – jedinečný identifikátor pro sledování tokenu

Bezstavová autentizace s Redis

Přestože jsou JWT ze své podstaty bezstavové, implementace odvolání tokenů vyžaduje úroveň úložiště. Redis poskytuje ideální řešení:

// Uložení metadat tokenu pro odvolání
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()
}

// Kontrola, zda byl token odvolán
func (r *Redis) GetUserByJTI(ctx context.Context, key string) (string, error) {
    return r.Client.Get(ctx, key).Result()
}

Ukládejte jedinečný identifikátor tokenu (jti) v Redis s TTL odpovídajícím době platnosti tokenu. To zajišťuje okamžité odhlášení a zabraňuje opětovnému použití kompromitovaných tokenů.

Běžné chyby při implementaci JWT, kterým se vyhnout

  1. Samostatné vydávání tokenů v produkčním nasazení: API by měla tokeny ověřovat, nikoli vydávat. Používejte vyhrazený IdP pro vydávání.

  2. Slabé podpisové klíče: Používejte kryptograficky silná tajemství (alespoň 32 bajtů) vygenerovaná pomocí openssl rand -base64 32.

  3. Vypnutí ověřování tvrzení: Nikdy nenastavujte ValidateIssuer nebo ValidateAudience na false v produkčním nasazení.

  4. Dlouhá doba životnosti tokenů: Přístupové tokeny by měly vypršet do 15 minut. Delší doba životnosti zvyšuje útočnou plochu.

  5. Chybějící mechanismus odvolání: Implementujte odhlášení a odvolání tokenů pomocí Redis nebo podobného úložiště.

Často kladené otázky

Jaký je rozdíl mezi JWT autentizací a OAuth 2.0? JWT je formát tokenu, zatímco OAuth 2.0 je autorizační framework. OAuth 2.0 definuje, jak získávat tokeny (včetně JWT), a JWT definuje strukturu samotného tokenu. Vzájemně se doplňují – OAuth 2.0 může používat JWT jako přístupové tokeny, ale JWT můžete také používat nezávisle pro autentizaci v menších systémech.

Jak bezpečně ukládat JWT na straně klienta? Ukládejte JWT do HttpOnly, Secure cookies, nikoli do localStorage nebo sessionStorage. HttpOnly cookies zabraňují přístupu z JavaScriptu a chrání před XSS útoky. Pro mobilní aplikace používejte bezpečné mechanismy ukládání specifické pro platformu.

Lze JWT odvolat před vypršením platnosti? Ano, vedením seznamu odvolání nebo úložiště identifikátorů tokenů (tvrzení jti). Redis je pro to ideální – ukládejte jti s TTL odpovídajícím době platnosti tokenu. U každého požadavku zkontrolujte, zda jti existuje v úložišti odvolání. To zajišťuje okamžité odhlášení a zneplatnění tokenu.

Mám použít HS256 nebo RS256 pro podpis JWT? Používejte RS256 (asymetrický) pro produkční prostředí s více službami, kde k vydávání a ověřování tokenů dochází v různých systémech. Používejte HS256 pouze pro jednoaplikace, kde lze stejné tajemství bezpečně předat. Asymetrický podpis umožňuje ověřovacím službám používat pouze veřejný klíč, v souladu s principem nejmenších oprávnění.

Jak bezpečně implementovat refresh tokeny? Vydávejte dlouho žijící refresh token (7 dní) spolu s krátce žijícím přístupovým tokenem (15 minut). Poskytněte koncový bod /refresh, který přijímá refresh token, ověřuje jej a vrací nový pár tokenů. Rotujte refresh tokeny při každém použití, abyste zabránili útokům opakovaného přehrání tokenů. Ukládejte refresh tokeny bezpečně (např. v Redis) a zneplatňujte je při odhlášení.

Zdroje

  • 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

Číst dál