← Atpakaļ uz Izglītošanos
EDUCATION · API · STANDARTI

🔌 API ceļvedis - projektēšana, drošība un infrastruktūra

Sešas sadaļas par lietojumprogrammu saskarnēm (API) atbilstoši starptautiskajai praksei: REST principi (Roy Fielding, 2000), HTTP metodes un statusa kodi (RFC 9110), drošība (OWASP API Top 10, OAuth 2.0, JWT), API vārtejas, reverse proxy un slodzes balansētāja atšķirības, dizaina prakses (RFC 9457, OpenAPI 3.1) un standartu atsauces. Piemēri ir ilustratīvi un paredzēti mācību nolūkiem.

Kas ir API

REST arhitektūras stils - Roy Fielding (2000)

API (Application Programming Interface) ir formāli definēts saskarnes līgums starp divām programmatūras komponentēm, kas nosaka, kā tās apmainās ar datiem. Tīmekļa API parasti balstās uz HTTP protokolu un REST arhitektūras stilu: resursus adresē ar URL, darbības izsaka ar HTTP metodēm, bet dati visbiežāk tiek pārraidīti JSON formātā.

HTTP pieprasījuma un atbildes cikls Klients nosūta HTTP pieprasījumu ar metodi, ceļu un galvenēm; API serveris atbild ar statusa kodu un JSON saturu. HTTP pieprasījuma un atbildes cikls KLIENTS pārlūks · lietotne cits serviss API SERVERIS resursi pa URL JSON atbilde → GET /v1/lietotaji/42 Accept: application/json · Authorization: Bearer <token> ← 200 OK · Content-Type: application/json { "id": 42, "vards": "Anna", "loma": "klients" } Bezstāvokļa (stateless): katrs pieprasījums satur visu nepieciešamo - serveris neglabā sesijas kontekstu starp izsaukumiem
1
Klients–serveris

Saskarne nodala klientu (saskarsmes slānis) no servera (datu glabāšana un loģika), ļaujot tos izstrādāt un mērogot neatkarīgi.

2
Bezstāvokļa

Katrs pieprasījums satur visu izpildei nepieciešamo kontekstu. Serveris neuztur klienta sesijas stāvokli, kas vienkāršo horizontālo mērogošanu.

3
Kešojamība

Atbildes nepārprotami marķē kā kešojamas vai nekešojamas (Cache-Control, ETag), samazinot servera slodzi un atbildes aizkavi.

4
Vienota saskarne

Vienoti mijiedarbības principi: resursu identifikācija, to attēlojumi (piem., JSON), pašaprakstoši ziņojumi un hipersaites (HATEOAS).

5
Slāņota sistēma

Starp klientu un serveri var atrasties starpniekslāņi (reverse proxy, gateway, kešs), klientam par tiem nezinot.

6
Kods pēc pieprasījuma

Neobligāts princips: serveris var nosūtīt izpildāmu kodu (piem., JavaScript), īslaicīgi paplašinot klienta funkcionalitāti.

REST

Resursorientēts arhitektūras stils virs HTTP. Vienkāršs un kešojams; dominē publiskajos tīmekļa API.

GraphQL

Viens endpoint; klients pieprasa tieši nepieciešamos laukus. Mazina pārmērīgu un nepietiekamu datu ielādi.

gRPC

Binārs, augstas veiktspējas RPC ietvars (Protocol Buffers, HTTP/2). Piemērots iekšējai mikroservisu saziņai.

WebSocket / SOAP

WebSocket - pastāvīgs divvirzienu reāllaika kanāls; SOAP - vecāks XML protokols ar stingri definētu līgumu (WSDL).

RFC 9110 - HTTP Semantics

Metodes (droša / idempotent) un statusa kodi

Metode Droša Idempotent Kešojama Tipiskais pielietojums
GETNolasa resursu bez blakusefektiem
HEADAtgriež tikai galvenes, bez ķermeņa
POSTretiIzveido resursu vai palaiž darbību
PUTPilnībā aizvieto resursu
PATCHDaļēji atjaunina resursu
DELETEDzēš resursu
OPTIONSAtbalstītās metodes; CORS priekšpārbaude
HTTP statusa kodu saimes Piecas statusa kodu saimes: 1xx informatīvs, 2xx veiksme, 3xx pāradresācija, 4xx klienta kļūda, 5xx servera kļūda. HTTP statusa kodu saimes (RFC 9110) 1xx · Informatīvs 100 Continue 101 Switching 2xx · Veiksme 200 OK 201 Created 202 Accepted 204 No Content 3xx · Pāradresācija 301 Moved Perm. 302 Found 304 Not Modified 307 Temp. Redirect 4xx · Klienta kļūda 400 Bad Request 401 Unauthorized 403 Forbidden 404 Not Found 409 Conflict 422 Unprocessable 429 Too Many Req. 5xx · Servera kļūda 500 Internal 502 Bad Gateway 503 Unavailable 504 Gateway Timeout Pamatprincips: 4xx norāda uz kļūdu klienta pieprasījumā (laba prakse - atgriezt strukturētus kļūdas datus); 5xx - uz kļūdu servera pusē

Droša (safe)

Nemaina servera stāvokli; tikai nolasa datus. GET, HEAD, OPTIONS.

Idempotent

Viena un tā paša pieprasījuma atkārtošana rada tieši to pašu galarezultātu kā viens izsaukums. Būtiski drošai atkārtošanai pēc tīkla kļūmes.

POST nav idempotent

Atkārtots POST var radīt dublikātus. Risinājums - Idempotency-Key galvene (skat. sadaļu Dizaina prakses).

OWASP API Security Top 10:2023 · OAuth 2.0 · JWT

Autentifikācija, autorizācija un izplatītākie API riski

API drošības pamatā ir skaidra autentifikācijas (identitātes apliecināšana) un autorizācijas (piekļuves tiesību noteikšana) nošķiršana. Tīmeklī standarta risinājums ir OAuth 2.0 ar piekļuves tokeniem (parasti JWT), kurus pārbauda katrā pieprasījumā.

OAuth 2.0 autorizācijas koda plūsma ar PKCE Sešu soļu plūsma starp lietotāju, klienta lietotni, autorizācijas serveri un API resursu serveri. OAuth 2.0 - autorizācijas koda plūsma ar PKCE Lietotājs (RO) Klients (lietotne) Autorizācijas serv. API (resursi) 1 · sākt pieteikšanos 2 · authorization request + PKCE code_challenge 3 · autentifikācija + piekrišana 4 · authorization code 5 · code + code_verifier → access token (JWT) + refresh 6 · GET /resurss + Bearer token → 200 + dati PKCE (RFC 7636) sasaista koda apmaiņu ar sākotnējo pieprasītāju - aizsargā publiskus klientus pret koda pārtveršanu

API atslēgas

Vienkārša servisa identifikācija. Nedrīkst nonākt klienta pusē vai koda repozitorijā; regulāri jāmaina (rotācija).

OAuth 2.0 / OIDC

Deleģēta autorizācija ar tokeniem; OIDC papildina to ar identitātes slāni (lietotāja autentifikācija).

JWT

Kriptogrāfiski parakstīts token trīs daļās: header.payload.signature. Vienmēr jāpārbauda paraksts, izdevējs (iss) un derīguma termiņš (exp).

mTLS

Abpusēja TLS - gan klients, gan serveris uzrāda sertifikātus. Spēcīga savstarpējā autentifikācija starp servisiem.

API1
BOLA

Objektu līmeņa autorizācijas trūkums - lietotājs piekļūst cita subjekta objektam, manipulējot ar identifikatoru (piem., /rekini/123). Visbiežākais API risks.

API2
Nepilnīga autentifikācija

Vāji vai nepareizi validēti token, nepārbaudīts paraksts, neierobežots pieteikšanās mēģinājumu skaits.

API3
BOPLA

Objektu īpašību līmeņa autorizācijas trūkums - pārmērīga datu atklāšana atbildē vai neatļauta masveida piešķiršana (mass assignment).

API4
Neierobežots resursu patēriņš

Trūkst apjoma un ātruma limitu - tas pieļauj pakalpojuma atteices (DoS) un infrastruktūras izmaksu pieaugumu.

API5
BFLA

Funkciju līmeņa autorizācijas trūkums - parasts lietotājs piekļūst administratīvām funkcijām.

API6
Jutīgas biznesa plūsmas

Neierobežota piekļuve jutīgām biznesa plūsmām - automatizēta ļaunprātīga izmantošana (piem., masveida biļešu uzpirkšana).

API7
SSRF

Servera puses pieprasījumu viltošana - serveris izpilda pieprasījumu uz uzbrucēja kontrolētu URL, sasniedzot iekšējos resursus.

API8
Drošības konfigurācijas trūkumi

Iztrūkstošas drošības galvenes, pārlieku atvērts CORS, detalizēti kļūdu paziņojumi.

API9
Nepietiekama inventāra pārvaldība

Aizmirstas vai novecojušas versijas un testa vides paliek publiski pieejamas un nedrošas.

API10
Nedroša patērēšana

Nekritiska uzticēšanās trešo pušu API datiem bez validācijas un ierobežojumiem.

Infrastruktūra priekšā API

API vārteja vs reverse proxy vs slodzes balansētājs

Visi trīs atrodas starp klientu un backend, tāpēc tos mēdz sajaukt. Patiesībā tie ir viena pamatkoncepta - reverse proxy - paveidi, kas specializējas atšķirīgās funkcijās. Praksē to robežas pārklājas, un bieži tie darbojas vienlaikus.

Tipiska produkcijas plūsma: klienti, slodzes balansētājs, API vārteja, mikroservisi Klienti vēršas pie slodzes balansētāja, tas nodod API vārtejai, kas autentificē un maršrutē uz mikroservisiem. Slodzes balansētājs un vārteja ir reverse proxy slānis. Kur katrs atrodas - tipiska produkcijas plūsma reverse proxy slānis KLIENTI Mobilā lietotne Tīmekļa SPA Partnera serviss Slodzes balansētājs L4 / L7 trafika sadale health checks API vārteja L7 · vienots ieejas punkts auth · rate-limit transformācija agregācija · maršrutēšana MIKROSERVISI Autentifikācija Lietotāji Pasūtījumi Maksājumi Slodzes balansētājs un API vārteja abi ir specializēti reverse proxy. Praksē viens rīks (piem., Nginx vai Envoy) var pildīt vairākas no šīm lomām vienlaikus.
Aspekts Reverse proxy Slodzes balansētājs API vārteja
Galvenais mērķis Pārsūta pieprasījumus uz backend, slēpj tā topoloģiju Sadala trafiku pa vairākām servera instancēm Pārvalda API - vienots ieejas punkts mikroservisiem
OSI slānis L7 (var arī L4) L4 (transports) vai L7 L7 (lietojums)
Maršrutē pēc Host / ceļa IP / ports (L4) vai saturs (L7) API ceļa, versijas, patērētāja
TLS terminācija Jā (L7)
Autentifikācija / autorizācija Pamata (iespējams WAF) Jā - OAuth / JWT / API atslēgas (galvenā loma)
Rate-limit / kvotas Ierobežoti Jā (galvenā loma)
Health checks Reti Jā (galvenā loma) Bieži (caur balansētāju)
Transformācija / agregācija Jā - REST↔gRPC, vairāku servisu apvienošana
Tipiski rīki Nginx, Apache, HAProxy, Envoy HAProxy, Nginx, AWS NLB/ALB, F5 Kong, Apigee, AWS API Gateway, Azure APIM, Tyk

Reverse proxy

Pamatkoncepts - serveris klienta priekšā, kas pārsūta pieprasījumus uz backend. Nodrošina TLS termināciju, kešošanu, kompresiju un topoloģijas slēpšanu. Pārējie divi ir tā specializācijas.

Slodzes balansētājs

Reverse proxy, kas specializējas trafika sadalē (round-robin, least-connections) un pieejamībā - ar health checks un sticky sesijām.

API vārteja

Reverse proxy, kas specializējas API pārvaldībā: autentifikācija, rate-limit, versionēšana, transformācija, agregācija un novērojamība. Parasti tā ietver arī slodzes balansēšanu.

Praksē

Tipiska secība: klients → DNS/CDN → slodzes balansētājs → API vārteja → mikroservisi. Robežas pārklājas, un viens rīks bieži pilda vairākas lomas.

Labās prakses · RFC 9457 · OpenAPI 3.1

Versionēšana, limiti, kļūdas un līguma apraksts

Pieprasījuma apstrādes konveijers caur API vārteju Klienta pieprasījums iziet TLS, autentifikāciju, apjoma limitu, validāciju, maršrutēšanu un transformāciju, pirms sasniedz mikroservisu. Pieprasījuma konveijers caur vārteju Klients pieprasījums API vārteja TLSterminācija AuthN/ZJWT pārbaude Rate-limit429 + Retry-After Validēshēmu Maršrutēpēc ceļa Transformē+ novēro Mikroserviss biznesa loģika
/v1/
Versionēšana

Pa URL (/v1/...), galveni vai mediju tipu. Esošo versiju saderību nedrīkst lauzt - jāpievieno jauna versija.

page
Pagination

Lielus sarakstus dala lapās ar offset/limit vai kursora metodi. Vienmēr jāierobežo maksimālais lapas apjoms.

429
Rate limiting

Pieprasījumu ātruma ierobežošana ar atbildi 429 Too Many Requests un Retry-After galveni. Aizsargā pret pārslodzi un ļaunprātīgu izmantošanu.

key
Idempotency-Key

Idempotency-Key galvene POST izsaukumos novērš dublikātus, ja pieprasījumu atkārto pēc tīkla kļūmes.

9457
Vienots kļūdu formāts

RFC 9457 Problem Details - mašīnlasāma JSON kļūdas struktūra (type, title, status, detail).

OAS
OpenAPI 3.1

Mašīnlasāms API līgums - ģenerē dokumentāciju, klientu kodu un validāciju. Vienots patiesības avots saskarnei.

Kļūdas atbilde - RFC 9457 Problem Details

HTTP/1.1 429 Too Many Requests
Content-Type: application/problem+json
Retry-After: 30

{
  "type":   "https://api.piemers.lv/kludas/rate-limit",
  "title":  "Pārāk daudz pieprasījumu",
  "status": 429,
  "detail": "Limits 100 pieprasījumi minūtē ir pārsniegts.",
  "instance": "/v1/lietotaji"
}

Atsauces

Starptautiskie standarti un specifikācijas

Saistība ar NIS2

Droša API izstrāde un testēšana atbilst NIS2 (ES 2022/2555) 21. panta 2. punkta e) apakšpunkta prasībām par drošību iegādē, izstrādē un uzturēšanā.

GDPR

Atbildē jāatklāj tikai nepieciešamais (datu minimizācija) - pārmērīga datu atklāšana (OWASP API3) ir arī personas datu aizsardzības pārkāpums.

Atruna

Materiāls ir izglītojošs pārskats, nevis standartu pilnais teksts. Konkrētai ieviešanai vienmēr jāskata oficiālais avots.