Jak navrhnout efektivní a bezpečné REST API

Efektivní a bezpečné REST API

REST API je rozhraní pro výměnu dat a řízení procesů založené na principech práce se zdroji, nad nimiž se provádějí standardní operace. Cílem dobře navrženého API je být predikovatelné, konzistentní, výkonné a především bezpečné. Tento článek pokrývá návrhové vzory, bezpečnostní postupy, standardy a provozní aspekty, které vedou k efektivním a odolným REST službám.

Doménový model a identifikace zdrojů

  • Zdroj vs. reprezentace: zdroj představuje doménový objekt; reprezentace je jeho serializace (např. JSON). Stabilní URI by měly jednoznačně identifikovat zdroje, nikoliv akce.
  • Granularita: navrhujte zdroje tak, aby odpovídaly přirozeným entitám a vztahům (např. /uzivatele, /objednavky, /uzivatele/{id}/objednavky).
  • Názvosloví v množném čísle: zvyšuje konzistenci a čitelnost (např. /produkty místo /produkt).
  • Adresovatelné podzdroje: používejte hierarchii pro vztahy 1:N a N:M; pro volné asociace upřednostněte dotazy a filtry.

URI konvence, metody a sémantika

  • HTTP metody: GET (čtení), POST (vytváření, ne-idempotentní), PUT (náhrada, idempotentní), PATCH (částečná aktualizace), DELETE (odstranění), HEAD (metadata), OPTIONS (možnosti).
  • Bez sloves v cestě: preferujte POST /objednavky před /vytvorObjednavku; akce modelujte jako zdroje nebo kontrolované operace (např. /platby/{id}/refundace).
  • Bezpečnost a idempotence: používejte metody v souladu s jejich sémantikou; PUT a DELETE by měly být idempotentní, GET nesmí mít vedlejší efekty.

Verzování a kompatibilita

  • Stabilita API jako závazek: minimalizujte breaking změny; preferujte přidávání nových polí před přejmenováváním či změnami významu.
  • Strategie verzování: použijte URI v1/v2 nebo mediální typy v hlavičkách (Accept: application/vnd.example.v2+json). Vyberte jednu strategii a pečlivě ji dokumentujte.
  • Deprekační cyklus: oznamte datum ukončení podpory, poskytujte varovné hlavičky (Deprecation, Sunset) a migrační průvodce.

Filtrace, stránkování a řazení

  • Predikovatelné parametry: ?page, ?limit, ?sort=field,-field2, ?filter[field]=value.
  • Cursor-based stránkování: škálovatelnější než offsetové; vracejte next/prev kurzory v links.
  • Projekce a rozšíření: ?fields=a,b,c pro výběr polí, ?include=relace pro načtení souvisejících zdrojů.

Formát odpovědí a kontrakt

  • Konzistentní obálka: sjednoťte strukturu odpovědí (data, metadata, informace o stránkování, odkazy). Vracejte správný Content-Type a případně ETag.
  • Standardizované chyby: používejte pole status, code, message, fields/details a korelační traceId. Vhodná je implementace dle RFC 7807 (application/problem+json).
  • Mezinárodní prostředí: zvažte lokalizovatelné chybové zprávy a stabilní programátorské kódy chyb.

HTTP kódy a hlavičky

  • 2xx: 200 OK, 201 Created s Location, 204 No Content po DELETE či PUT bez těla odpovědi.
  • 3xx: 304 Not Modified při validaci cache, 303 See Other po akci vedoucí k asynchronnímu zdroji.
  • 4xx: 400 chyby validace, 401 neautorizovaný přístup, 403 zakázaný přístup, 404 nenalezený zdroj, 409 konflikty, 422 nevalidní data, 429 překročení limitu požadavků.
  • 5xx: serverové chyby; u asynchronních operací preferujte 202 Accepted a stavové zdroje.
  • Cache hlavičky: ETag, Last-Modified, Cache-Control, Vary; pro bezpečnost rovněž Strict-Transport-Security, X-Content-Type-Options, Content-Security-Policy pro webové klienty.

Bezpečnostní základy: autentizace a autorizace

  • TLS všude: vynucení HTTPS, ochrana proti downgrade útokům a správná konfigurace šifrovacích algoritmů.
  • OAuth 2.1 a OIDC: pro delegovanou autentizaci; preferujte Authorization Code s PKCE. Pro server-to-server komunikaci využijte client credentials.
  • Tokeny: krátká životnost, rotace refresh tokenů, správné nastavení audience a scope. Zvažte formát JWT s digitálním podepsáním a možností revokace přes introspekci.
  • Autorizace: RBAC/ABAC, jemnozrnná práva na úrovni zdrojů; přenášejte minimálně nutné scope.

Ochrana proti běžným útokům

  • Rate limiting a throttling: ochrana před DoS útoky a zneužitím; limity komunikujte pomocí hlaviček X-RateLimit-* a vracejte 429.
  • Validace vstupů a normalizace: ověřujte délky, typy a formáty; odmítejte neznámá pole; používejte přístup na základě whitelistu.
  • Kódování výstupu: zabráněte injekcím na straně klienta; správně nastavujte typ obsahu a kódování.
  • Idempotence a ochrana proti opětovnému přehrání: použití idempotency klíčů pro platby a objednávky (Idempotency-Key), nonce a časové razítka.
  • Bezpečné logování: logujte pouze minimálně nutná data, maskujte osobní identifikovatelné informace a citlivá data, nikdy neukládejte celé tokeny.

Integrita dat a souběh

  • Optimistická konkurence: použití ETag s hlavičkami If-Match/If-None-Match pro bezpečné aktualizace a prevenci ztráty dat.
  • Transakční hranice: zajištění konzistentního chování při částečných selháních; u vícekrokových operací navrhněte kompenzační logiku (pattern saga).
  • Idempotentní návrh: opakované požadavky nesmí způsobit duplicitní efekty.

Výkon a škálování

  • HTTP cache: využijte cachovatelné GET s ETag; respektujte Cache-Control a Vary.
  • Agregace a selektivní načítání: projekce polí, zahrnutí vztahů, ale s opatrností před nadměrným načítáním („overfetching“).
  • Komprese a velikost payloadu: povolte gzip a br, omezte maximální velikost požadavků a odpovědí.
  • Asynchronní zpracování: u operací s dlouhou dobou běhu použijte 202 Accepted a stavové zdroje nebo webhooky.
  • Horizontální škálování: bezstavové servery, load balancing bez sticky session, sdílení stavu přes úložiště nebo fronty zpráv.

Observabilita, měření a spolehlivost

  • Strukturované logování: korelační traceId/spanId, standardizované klíče, JSON formát logů.
  • Tracing a metriky: APM, distribuované trasování, metriky latence, chybovosti a saturace; využití metodik RED a USE.
  • SLA/SLO: definujte cílové hodnoty latence a dostupnosti; měřte chybovost na konkrétních endpointy a tenanty.
  • Circuit breaker a retry: exponenciální zpomalování (backoff), jitter, limity počtu pokusů; zajištění idempotence požadavků.

Dokumentace a kontrakty

  • OpenAPI specifikace: jediný zdroj pravdy pro schémata, validaci, generování klientů a testů.
  • Konzistentní příklady: uvádějte vzory požadavků a odpovědí, chybových stavů i hraničních případů.
  • Changelog: udržujte historii změn, poznámky o deprekacích a migrační instrukce.

Testování a kvalita

  • Validace schémat: kontraktové testy vůči OpenAPI, statická i runtime validace payloadu.
  • Jednotkové a integrační testy: pokrývají logiku, autorizaci, chybové scénáře, limity a výkon.
  • Bezpečnostní testy: testování negativních scénářů, fuzzing, skenování dle OWASP API Top 10, kontrola konfigurace CORS a bezpečnostních hlaviček.
  • Správa testovacích dat: deterministická data, anonymizace PII a izolace multi-tenant prostředí.

Správa verzí klientů a SDK

  • Generované SDK: udržujte balíčky pro hlavní programovací jazyky; verze SDK slaďte s verzemi API, dodávejte migrační příručky.
  • Kompatibilita klientů: tolerujte nová, neznámá pole; nevyvozujte závěry o úplnosti dat.

Řízení chyb a odolnost vůči selháním

  • Predikovatelné chybové formáty: klienti musí být schopni automaticky reagovat; vracejte stabilní chybové kódy a detailní errors[].field.
  • Omezení informací: u 4xx a 5xx nesdělujte interní implementační detaily; ty logujte pouze na serveru.
  • Graceful degradation: funkční přepínače (feature flags), fallbacky a read-only režimy při částečných výpadcích.

Správa dat, ochrana soukromí a compliance

  • PII a citlivá data: minimalizujte sběr, šifrujte data při přenosu i v klidu, řiďte přístup a auditujte použití.
  • Doba uchovávání a práva subjektů: endpointy a procesy pro mazání či anonymizaci dat dle legislativních požadavků (např. „právo být zapomenut“).
  • Multitenancy: striktní oddělení dat tenantů na úrovni autorizace i dotazů; testujte scénáře „tenant escape“.

CORS a bezpečná integrace s webovými klienty

  • Princip minimální nutnosti: povolujte pouze nezbytné originy, metody a hlavičky; nikdy nepovolujte wildcard * pro Authorization.
  • Credentials: používejte pouze pokud je to nezbytné; zvažte preferenci tokenů v Authorization před cookies.

Provozní model a CI/CD

  • Automatizované nasazení: validace schémat, bezpečnostní skeny a smoke testy v deploy pipeline.
  • Konfigurovatelnost: konfigurujte přes proměnné prostředí a spravujte tajemství v bezpečném úložišti; nikdy neukládejte citlivá data v repozitáři.
  • Canary release a postupný rollout: omezte dopad regresí, sbírejte telemetrii před plným nasazením.

Metodické vzory a anti-patterny

  • Doporučené vzory: HATEOAS pro navigaci, resource expansion s limity, idempotency klíče, explicitní stavové stroje pro dlouhotrvající procesy.
  • Anti-patterny: přetížené POST endpointy pro libovolné akce, nekonzistentní názvosloví, skryté breaking změny, přenos nadbytečných dat, únik interních stack trace errorů.

Ukazatele úspěchu (KPI) pro REST API

Oblast Metoda Význam Cílový trend
Výkon P95/P99 latence, průchodnost (throughput) Uživatelská zkušenost,