Praktický návod
Jak zabezpečit API pomocí tokenů
Token nejdřív spolehlivě ověř, potom samostatně rozhodni, co jeho držitel smí udělat.
Nejdřív stručně
Token není celé zabezpečení
Autentizace ověřuje, kdo požadavek posílá. Autorizace až potom rozhoduje, zda tento uživatel nebo systém smí zavolat konkrétní endpoint a pracovat s daným objektem.
JWT je jeden formát tokenu, ne automatická záruka bezpečnosti. API musí ověřit jeho podpis, vydavatele, příjemce i časovou platnost a celý přenos chránit pomocí HTTPS/TLS.
Připrav si
Co budeš potřebovat
Nejdřív si ujasni důvěryhodného vydavatele tokenů, jejich příjemce a požadovanou dobu platnosti.
- Seznam klientů API, chráněných operací a rizik při odcizení tokenu.
- Důvěryhodného poskytovatele identity nebo zavedenou knihovnu pro vydávání a ověřování tokenů. Nevytvářej vlastní kryptografii.
- HTTPS ve všech prostředích, kde se přenášejí skutečné přihlašovací údaje nebo tokeny.
- Místo pro bezpečné uložení klíčů a tajemství a plán rotace, revokace a řešení incidentu.
Kroky 1 až 3
Postav ochranu ve třech vrstvách
Formát tokenu, ověření identity a kontrola oprávnění jsou tři různá rozhodnutí.
1. Zvol formát a životní cyklus tokenu
- Pro interní API může být vhodný náhodný neprůhledný token uložený na serveru. JWT použij, když potřebuješ lokální ověření podepsaných claims bez dotazu na vydavatele.
- Access tokenům nastav krátkou expiraci, typicky v minutách. Dlouhá relace patří do samostatného, přísněji chráněného obnovovacího mechanismu.
- Do JWT dej jen nezbytné identifikátory a oprávnění, nikdy hesla ani tajemství. Definuj alespoň vydavatele, příjemce, subjekt, expiraci a jednoznačný identifikátor tokenu.
- Použij prověřenou knihovnu nebo poskytovatele identity. U asymetrických klíčů zveřejňuj jen veřejné klíče, používej identifikátor klíče a naplánuj jejich překryvnou rotaci.
composer require symfony/security-bundle Oficiální Symfony dokumentace k access tokenům 2. Ověř token před spuštěním aplikační logiky
- Přijímej access token ve standardní hlavičce Authorization: Bearer. Nedávej ho do URL, kde může skončit v historii, analytice nebo logu.
- U JWT povol jen očekávané algoritmy a ověř podpis, issuer, audience, exp a případně nbf. Neber algoritmus ani adresu klíče nekontrolovaně z tokenu.
- Po úspěšném ověření převeď stabilní subject na interní identitu. Neexistující, zablokovaný nebo smazaný účet nesmí získat přístup jen díky dosud platnému tokenu.
- Neplatný nebo chybějící token vrať jako 401. Do logu ulož důvod a korelační ID, ale nikdy celý token ani citlivé claims.
3. Autorizuj každou chráněnou operaci
- Po autentizaci rozhodni podle oprávnění, role a konkrétního objektu. V Symfony dej jednoduchá pravidla do access_control a doménová rozhodnutí do voterů.
- Výchozí stav má být zákaz. Nový endpoint se nesmí stát veřejným jen proto, že k němu zatím nikdo nepřidal pravidlo.
- Ověřuj i vlastnictví a tenant. Role EDITOR sama o sobě nesmí umožnit upravit cizí objednávku nebo data jiné organizace.
- Platnou identitu bez potřebného oprávnění odmítni stavem 403. Klient tak rozliší neplatnou identitu od nedostatečných práv.
php bin/console debug:firewall Oficiální Symfony dokumentace k voterům Krok 4
Otestuj hranice přístupu
Úspěšný požadavek nestačí. Každé pravidlo musí mít i negativní test.
-
Zavolej endpoint bez tokenu
Chráněný endpoint má vrátit 401 a nesmí spustit aplikační operaci.
curl -i https://api.example.test/api/orders/42 -
Pošli poškozený nebo expirovaný token
API jej musí odmítnout bez ohledu na role uvedené uvnitř neověřeného tokenu.
curl -i https://api.example.test/api/orders/42 -H 'Authorization: Bearer invalid-token' -
Ověř nedostatečné oprávnění
Platný token uživatele bez práva k objektu má dostat 403. Stejný test proveď pro jiného tenanta.
curl -i -X DELETE https://api.example.test/api/orders/42 -H 'Authorization: Bearer ACCESS_TOKEN'
Když to zlobí
Nejčastější chyby
Platný token vrací 401
Zkontroluj issuer, audience, použitý klíč a čas serveru. Malou toleranci odchylky nastav explicitně, ale neprodlužuj jí zbytečně platnost tokenu.
date -u Uživatel je přihlášený, ale operace vrací 403
Autentizace proběhla správně. Hledej chybějící oprávnění, pravidlo access_control, voter nebo kontrolu vlastnictví objektu.
php bin/console debug:firewall Odhlášený uživatel může JWT ještě použít
Podepsané JWT je bez dalšího stavu platné až do expirace. Použij krátkou životnost a při nutnosti okamžitého odvolání kontroluj revokační seznam podle jti nebo stav účtu.
Token se objevil v logu nebo úložišti klienta
Token okamžitě revokuj, otoč dotčená tajemství a odstraň logování hlavičky Authorization. V prohlížeči zvaž HttpOnly, Secure a SameSite cookie s odpovídající CSRF ochranou; na serveru použij správce tajemství a v mobilu systémové bezpečné úložiště.
Hotovo
API rozlišuje identitu i oprávnění.
Autorizace teď navazuje na ověřenou identitu a chrání každou operaci samostatně. Pravidelně testuj expiraci, rotaci klíčů, revokaci i přístup k cizím objektům.