Kontaktujte nás

info@serverion.com

Zavolejte nám

+1 (302) 380 3902

Obnovení rotace tokenů: Nejlepší postupy pro vývojáře

Obnovení rotace tokenů: Nejlepší postupy pro vývojáře

Chcete, aby byla vaše aplikace bezpečnější a zároveň aby byli uživatelé spokojeni? Pomoci může obnovení rotace tokenu. Je to metoda, kdy se obnovovací tokeny vyměňují po každém použití, což zajišťuje, že jsou platné pouze pro jednorázové použití. To zlepšuje zabezpečení, blokuje opakované útoky a zjednodušuje správu relací – to vše bez přerušení uživatelského zážitku.

Proč používat střídání obnovovacích tokenů?

  • Silnější zabezpečení: Omezuje zneužití tokenu a poskytuje jasné protokoly aktivit.
  • Lepší kontrola: Spravujte relace přesně a v případě potřeby okamžitě zrušte přístup.
  • Hladká uživatelská zkušenost: Dlouhé relace bez častého přihlašování.

Jak to funguje:

  1. Když vyprší platnost přístupového tokenu, obnovovací token se použije k vyžádání nového.
  2. Server vydá nové přístupové a obnovovací tokeny a zároveň zruší platnost starého obnovovacího tokenu.
  3. To vytváří bezpečný řetězec tokenů a snižuje rizika, jako je krádež tokenů.

Klíčové kroky k implementaci:

  • Nastavte krátkou životnost přístupového tokenu (15–30 minut).
  • Použijte jednorázové obnovovací tokeny (platné 7–14 dní).
  • Ukládejte tokeny bezpečně (např. soubory cookie pouze HTTP nebo zabezpečené úložiště na straně serveru).
  • Sledujte podezřelou aktivitu, jako je opětovné použití tokenu nebo neobvyklé vzory přihlášení.

Přijetím střídání obnovovacích tokenů posílíte zabezpečení své aplikace a zároveň zachováte bezproblémové ověřování pro uživatele. Jste připraveni dozvědět se více? Pojďme se ponořit!

Detekce únosu relace pomocí rotujících obnovovacích tokenů

Jak fungují obnovovací tokeny

Tato část vysvětluje proces tokenu OAuth 2.0 a jak střídání obnovovacího tokenu zlepšuje zabezpečení.

Token tokenu OAuth 2.0

OAuth 2.0

OAuth 2.0 spravuje obnovovací tokeny prostřednictvím definované sekvence kroků. Když se uživatel přihlásí, autorizační server poskytne dva tokeny: krátkodobý přístupový token (platný 15–60 minut) a obnovovací token s delší životností (trvá 7–14 dní).

Postup funguje takto:

1. Počáteční ověření

Po úspěšném přihlášení systém vypíše:

  • Krátkodobý přístupový token pro volání API.
  • Dlouhodobý obnovovací token pro vyžádání nových přístupových tokenů.

2. Pomocí přístupového tokenu

Klient zahrne přístupový token do hlavičky Authorization pro každý požadavek API, například takto:

Autorizace: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... 

3. Obnovení tokenu

Když vyprší platnost přístupového tokenu, klient použije obnovovací token k vyžádání nového, aniž by se uživatel musel znovu přihlašovat.

Dále se podívejme, jak rotace tokenů tento proces vylepšuje.

Proces rotace tokenu

Rotace tokenů posiluje zabezpečení výměnou tokenů po každém obnovení, což zajišťuje, že obnovovací tokeny jsou platné pouze pro jedno použití. Funguje to takto:

  1. Klient si všimne, že platnost přístupového tokenu vypršela.
  2. Odešle aktuální obnovovací token do koncového bodu tokenu.
  3. Server ověří obnovovací token a vydá nové přístupové a obnovovací tokeny.
  4. Starý obnovovací token je neplatný.
  5. Server odešle nové tokeny zpět klientovi.
  6. Klient aktualizuje své uložené tokeny.

Tento přístup „jednorázového použití“ vytváří bezpečný řetězec tokenů a snižuje riziko zneužití.

Chcete-li vynutit jednorázové obnovovací tokeny, zvažte tyto kontroly:

Kontrola Účel Implementace
Detekce opětovného použití tokenu Zabraňte opakovaným útokům Sledujte použité obnovovací tokeny na černé listině
Období odkladu Zacházet s podmínky závodu Povolit 30sekundové okno pro souběžné požadavky
Ověření rodiny tokenů Udržujte tokenovou linii Zahrnout odkazy na nadřazený token do nových tokenů

Rotace tokenů funguje bez problémů na pozadí, což zvyšuje bezpečnost a zároveň udržuje uživatelský zážitek plynulý. Pomocí této metody zajistíte bezpečné automatické aktualizace pověření bez častého přihlašování uživatelů.

Nastavení rotace tokenů

Základní konfigurační kroky

Chcete-li nastavit střídání tokenů, nakonfigurujte svůj autorizační server pomocí následujících parametrů:

  • Nastavte životnost přístupového tokenu na 15–30 minut.
  • Omezte platnost obnovovacího tokenu na maximálně 7–14 dní.
  • Povolte kontroly ověření tokenu, abyste zajistili bezpečnost.
  • Aplikujte omezení rychlosti na koncové body tokenu, abyste zabránili zneužití.

Váš server by měl udržovat registr tokenů s těmito základními poli:

Pole Účel Příklad hodnoty
ID tokenu Jedinečný identifikátor uuid-v4
Čas vydání Časové razítko vytvoření tokenu 18.03.2025, 14:30 EST
Rodinné ID Tokeny související se skupinami rodina-uuid-v4
Předchozí token Sleduje nadřazený token prev-token-hash
Stav odvolání Označuje stav tokenu aktivní/odvoláno

Po konfiguraci přejděte k implementaci rotace tokenů do kódu.

Příklady programování

Zde je příklad rotace tokenu pomocí Node.js:

const jwt = require('jsonwebtoken'); const crypto = require('crypto'); async function rotateTokens(refreshToken) { const decodedToken = jwt.verify(refreshToken, process.env.SECRET_KEY); // Generování nového páru tokenů const newAccessToken = jwt.sign( { userId: decodedToken.userId }, process.env.SECRET_KEY, { expiresIn: '30m' } ); const newRefreshToken = jwt.sign( { userId: decodedToken.userId, familyId: decodedToken.familyId, previousToken: crypto.createHash('sha256').update(refreshToken).digest('hex') }, process.env.SECRET_KEY, { expiresIn: '7d' } ); // Zneplatnění starého tokenu obnovení await invalidateToken(refreshToken); return { accessToken: newAccessToken, refreshToken: newRefreshToken }; } 

Nejlepší postupy pro ukládání tokenů

Po implementaci rotace tokenů se ujistěte, že jsou tokeny bezpečně uloženy podle následujících postupů:

  • Úložiště na straně serveru
    K ukládání metadat tokenů používejte bezpečnou a rychlou databázi, jako je Redis. Vestavěná podpora vypršení platnosti Redis je obzvláště užitečná:
    čekat redis.setex( `token:${tokenId}`, 604800, // 7 dní v sekundách JSON.stringify(tokenMetadata) ); 
  • Úložiště na straně klienta
    U webových aplikací ukládejte obnovovací tokeny do souborů cookie pouze pro HTTP se správnými bezpečnostními příznaky:
    res.cookie('refreshToken', token, { httpOnly: true, secure: true, sameSite: 'strict', maxAge: 604800000 // 7 dní v milisekundách }); 
  • Mobilní aplikace
    Použijte možnosti zabezpečeného úložiště pro konkrétní platformu:
    • iOS: Keychain Services
    • Android: EncryptedSharedPreferences
    • React Native: Encrypted AsyncStorage

Při ukládání tokenů se vyvarujte těchto chyb:

  • Nikdy neukládejte tokeny localStorage, protože je zranitelný vůči útokům XSS.
  • Vyhněte se vkládání citlivých dat do užitečného zatížení JWT.
  • Ujistěte se, že všechna uložená data jsou šifrována.
  • Udržujte přístupové a obnovovací tokeny v oddělených úložištích, abyste snížili rizika.

Bezpečnostní opatření

Zabránění opětovnému použití tokenu

Chcete-li zastavit útoky opakovaného přehrávání, sledujte využití tokenu pomocí centralizovaného systému, který sleduje změny stavu tokenu:

const tokenRegistry = { async markTokenUsed(tokenId, timestamp) { const token = await db.tokens.findOne({ id: tokenId }); if (token.used || token.revoked) { throw new SecurityError('Detekováno opětovné použití tokenu'); } await db.tokens.update({ id: tokenId, used: true, lastUsedAt: timestamp }); } }; 

Pokud je zjištěno opětovné použití tokenu, proveďte okamžitou akci:

  • Zrušte token aby se zabránilo dalšímu zneužití.
  • Zaznamenejte incident pro účely auditu.
  • Vynutit opětovné ověření pro dotčenou relaci.
  • Informujte administrátory prošetřit porušení.

Tyto kroky doplňují metody odvolání tokenu popsané níže.

Kroky odvolání tokenu

Zrušení tokenu lze použít na různých úrovních v závislosti na situaci:

Typ odvolání Kdy použít Dopad
Jediný token Podezřelá aktivita na jednom zařízení Je ovlivněn pouze konkrétní token
Zrušení rodiny Porušení zahrnující více zařízení Všechny související tokeny jsou neplatné
Globální odvolání Velký bezpečnostní incident Všechny aktivní tokeny jsou odvolány v celém systému

Zde je příklad zrušení rodinného tokenu:

asynchronní funkce revokeTokenFamily(familyId) { await db.tokens.updateMany( { familyId: familyId }, { revoked: true, revokedAt: new Date(), reason: 'security_breach' } ); // Upozornění klientů await notifyClients(familyId); // Zaznamenání bezpečnostní události await logSecurityEvent({ type: 'family_revocation', familyId: familyId, timestamp: new Date() }); } 

Limity použití a sledování

Monitorování požadavků na tokeny je nezbytné pro zjištění neobvyklé aktivity. Použijte limity rychlosti a sledujte vzorce používání k identifikaci potenciálních hrozeb:

const rateLimits = { tokenRequests: { window: '15m', maxAttempts: 100, blockDuration: '1h' }, refreshAttempts: { window: '24h', maxAttempts: 1000, blockDuration: '24h' } }; 

Mezi klíčové metriky ke sledování patří:

  • Frekvence obnovení tokenu na uživatele
  • Neúspěšné pokusy o obnovení tokenu
  • Zeměpisný původ požadavků
  • Trendy využití založené na čase
  • Počet souběžných aktivních relací

Nastavte si upozornění na podezřelé chování, například:

  • Několik pokusů o obnovení z různých IP adres
  • Rychlé rotace žetonů
  • Přístup v neobvyklých hodinách
  • Požadavky z neočekávaných míst

Ukládejte data o využití tokenů v databázi časové řady pro lepší analýzu a detekci hrozeb:

const metrics = { async recordTokenUsage(tokenId, context) { await timeseriesDB.insert({ timestamp: new Date(), tokenId: tokenId, userId: context.userId, ipAddress: context.ip, userAgent: context.userAgent, geoLocation: await geolocate(context.ip) }); } }; 

Když jsou zjištěny nesrovnalosti, zvyšte zabezpečení:

  • Prodlužování intervalů sledování
  • Zkrácení doby expirace tokenu
  • Přidání dalších ověřovacích kroků
  • Zahájení ručních kontrol pro hlubší prozkoumání

Testování a údržba

Testovací postupy

Automatizované testy jsou nezbytné pro zajištění toho, aby proces rotace tokenů fungoval podle plánu. Zde je příklad, jak tuto funkci otestovat:

describe('Testy rotace tokenů', () => { test('mělo by se rotovat a ověřovat tokeny', async () => { // Test základní rotace const initialToken = await generateRefreshToken(); const rotatedToken = await rotateToken(initialToken); expect(rotatedToken).not.toEqual(initialToken); expect(await validateToken(rotatedToken)).toBeTruthy(); // Test celého procesu ověřování const authResponse = await authenticate(credentials); await simulateTokenExpiry(authResponse.accessToken); const newTokens = await performTokenRotation(authResponse.refreshToken); await verifyTokenLineage(authResponse.refreshToken, newTokens.refreshToken); }); }); 

Jakmile se ujistíte, že rotace tokenů funguje podle očekávání, sledujte výkon systému, abyste včas identifikovali a vyřešili problémy.

Sledování systému

Sledujte výkon rotace tokenů pomocí klíčových metrik pro zachování spolehlivosti:

Metrický Popis Práh výstrahy
Latence rotace Čas na dokončení rotace > 500 ms
Míra úspěšnosti Úspěšné střídání < 99,9%
Délka řetězu tokenů Rotace v pořadí > 50 otáček
Chybová frekvence Neúspěšné pokusy za hodinu > 10 chyb

Pro lepší sledovatelnost navíc protokolujte všechny události životního cyklu tokenu:

const rotationLogger = { async logRotationEvent(událost) { await logger.info('token_rotation', { timestamp: new Date().toISOString(), tokenId: event.tokenId, rotationDuration: event.duration, status: event.status, errorCode: event.error || null }); } }; 

Správa chyb

I při důkladném testování a monitorování se mohou stále vyskytovat chyby. K jejich efektivnímu řešení použijte vyhrazené mechanismy obnovy:

const errorHandler = { async handleRotationError(error, context) { // Primární ošetření chyb s integrovaným jističem if (this.failureCount >= 5) { await this.activateFailover(); return; } switch(error.code) { case 'TOKEN_EXPIRED': await forceReauthentication(context.userId); break; case 'DATABASE_ERROR': await this.retryWithBackoff(context); break; default: await this.notifyAdministrator(error); } await metrics.recordError(error); }, async retryWithBackoff(context, attempts = 0) { if (attempts > 3) return; await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempts) * 1000)); return this.handleRotationError(context, attempts + 1); } }; 

Tento přístup zajišťuje efektivní správu chyb a minimalizuje narušení systému.

Závěr

Klíčové věci

Obnovovací rotace tokenu zajišťuje rovnováhu mezi zabezpečení, výkona uživatelskou zkušenost. Zde jsou základní postupy, které je třeba mít na paměti:

  • Optimalizujte výkon systému prostřednictvím nepřetržitého sledování.
  • Implementujte odolné zpracování chyb umožnit hladké zotavení z problémů.
  • Proveďte přísné testování pro ověření a doladění rotačního mechanismu.

Návod k implementaci krok za krokem

Pokud jste připraveni implementovat rotaci tokenů, zde je rozpis procesu:

  1. Počáteční nastavení
    Začněte tím, že vytvoříte bezpečné úložiště tokenů pomocí standardních metod šifrování. Zahrňte omezení rychlosti a zajistěte, aby se váš ověřovací server mohl přizpůsobit poptávce.
  2. Konfigurace zabezpečení
    Definujte kritické parametry, jako je životnost tokenu, okna rotace a limity. Zde je například jednoduchá konfigurace:
    const securityConfig = { tokenLifetime: 3600, // Tokeny platné 1 hodinu rotationWindow: 86400, // Obnovení tokenů platných 24 hodin maxRotations: 30, // Maximální počet rotací tokenu jwtAlgorithm: 'RS256', // Asymetrický šifrovací algoritmus tokenLength: 256 // Velikost tokenu v bitech }; 
  3. Nastavení monitorování
    Stanovte prahové hodnoty pro výkon systému a nastavte upozornění na anomálie. Buďte připraveni škálovat svou infrastrukturu, když metriky ukazují zvýšenou poptávku.
  4. Výrobní nasazení
    Zavádějte systém postupně a sledujte kritické metriky. Udržujte podrobné protokoly událostí rotace pro auditování a odstraňování problémů. Pro škálovatelnou a spolehlivou infrastrukturu zvažte hostingová řešení, jako je např Serverion (https://serverion.com), který podporuje vysoce výkonná prostředí.

Související příspěvky na blogu

cs_CZ