.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í.
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é.
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.
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 emitentoviaud(Publika) – odpovídá identifikátoru vašeho APIexp(Doba platnosti) – token není prošlýsub(Subjekt) – identifikátor uživateleiat(Čas vydání) – token byl vydán v minulostijti(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
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í.
Slabé podpisové klíče: Používejte kryptograficky silná tajemství (alespoň 32 bajtů) vygenerovaná pomocí
openssl rand -base64 32.Vypnutí ověřování tvrzení: Nikdy nenastavujte
ValidateIssuerneboValidateAudiencenafalsev produkčním nasazení.Dlouhá doba životnosti tokenů: Přístupové tokeny by měly vypršet do 15 minut. Delší doba životnosti zvyšuje útočnou plochu.
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
Zatím žádné komentáře.