Plugin-uri și middleware în API-ul Gateway
1) De ce aveți nevoie de plugin-uri și middleware
API gateway - un punct de aplicare a politicilor corporative. Corect asamblate plugin lanţ:- standardizează siguranța (authN/authZ, WAF, CORS),
- protejează stabilitatea (limita ratei, întrerupătorul de circuit, politicile de reincercare)
- gestionează contractul (validarea sistemelor, transformări)
- dă observabilitate (valori, busteni, urmărire),
- Reduce costurile (caching, eliminarea duplicatelor, reguli canare)
Cheie: latență minimă și coerență clară a aplicației.
2) clase de plugin și ceea ce fac
1. Identificare/Autentificare
Furnizori JWT/JWKS, OAuth2/OIDC, chei API, mTLS (client cert).
Semnături HMAC (webhooks/partners), DPoP/PoP pe margine.
2. Autorizare
RBAC/ABAC/OPA/Cedar (PDP) cu memorie cache locală de soluție.
BOLA-guard: verificarea „chiriașului ”/„ proprietarului” în anteturi/context.
3. Protecția rețelei și a protocolului
WAF (CRS OWASP), anti-boți (rată/comportament), filtre Geo/IP/ASN, profile TLS.
CORS, anteturi CSP, filtre Fetch-Metadate, CORP/COOP/COEP.
4. Stabilitate
Limitarea ratei (token bucket/GCRA), cote și competitivitate.
Întrerupător de circuit, timeout, concurență adaptivă, vărsare de sarcină.
Încercați din nou politica cu timeout și jitter.
5. Transformări și validări
Census Path/Header, body-rewrite, JSON/XML ↔, gRPC ↔ HTTP.
Schema de validare (OpenAPI/JSON Schema/Protobuf), normalizare ID.
6. Caching și performanță
Răspuns/cache fragment, ETag/If-None-Match, compresie, brotli.
Cerere colaps (coalescing) pentru aceleași chei.
7. Observabilitate și audit
Măsurători RED/USE, logare decizională (429/403/5xx), urmărire (W3C Trace-Context/OpenTelemetry), prelevare de probe (coadă/adaptiv).
Anteturi de securitate audit și versiuni de politică.
8. Ciclul de viață și funcționarea
Canare/albastru-verde, feature-flags, shadow solutions (jurnal, nu se aplică), version migrations.
3) Procedura de aplicare (lanț recomandat)
[Ingress TLS]
→ Early-Deny (ASN/Geo, IP allow/deny)
→ mTLS / Client Cert Auth
→ JWT/OAuth2 AuthN (JWKS cache)
→ OPA/ABAC AuthZ (solution cache)
→ Rate Limit / Concurrency
→ Circuit / Timeout / Retries (пер-try)
→ Schema Validation (request)
→ Transform (headers/path/body) / CORS
→ Caching (lookup)
→ Upstream Proxy (app)
← Caching (store) / Compression
← Response Transform / Schema Validation (response)
← Logging / Tracing / Metrics / Security Headers
Principiu: mai devreme - mai ieftin/mai fatal (negare, auth, limite), mai târziu - „cosmetice” (transformare, cache).
4) Performanță și cardinalitate
Stick la O (1) pași fără cereri externe pe drumul fierbinte.
Toate plugin-ul „apeluri externe” (PDP/JWKS) sunt prin TTL scurt și reîmprospătare asincron.
Etichete/etichete pentru valori - cardinalitate limitată ("chiriaș", "plan", "traseu", dar nu "user _ id').
Plugin-uri „grele” (WAF, body-transforme) - activați selectiv pe traseu.
5) Exemple de configurare
5. 1 Trimis: JWT + RateLimit + OPA + Retries (pseudo)
yaml static_resources:
listeners:
- name: public_listener filter_chains:
- filters:
- name: envoy. filters. network. http_connection_manager typed_config:
route_config:
name: main virtual_hosts:
- name: api domains: ["api. example. com"]
routes:
- match: { prefix: "/v1/payments" }
route:
cluster: payments timeout: 350ms retry_policy:
retry_on: connect-failure,reset,5xx,gateways num_retries: 1 per_try_timeout: 200ms http_filters:
- name: envoy. filters. http. jwt_authn typed_config:
providers:
oidc:
issuer: https://auth. example. com/
remote_jwks:
http_uri: { uri: https://auth. example. com/.well-known/jwks. json, cluster: jwks, timeout: 2s }
cache_duration: 300s forward: true
- name: envoy. filters. http. ext_authz # OPA/Cedar PDP typed_config:
http_service:
server_uri: { uri: http://opa:8181, cluster: opa, timeout: 50ms }
authorization_request: { allowed_headers: { patterns: [{ exact: "authorization" }, { exact: "x-tenant" }] } }
- name: envoy. filters. http. ratelimit typed_config:
domain: public-api rate_limit_service:
grpc_service: { envoy_grpc: { cluster_name: rl } }
- name: envoy. filters. http. router
5. 2 NGINX/OpenResty: HMAC + Lua + Redis (pseudo)
nginx lua_shared_dict jwks 10m;
lua_shared_dict limits 10m;
server {
listen 443 ssl http2;
Early deny by ASN/Geo if ($bad_asn) { return 403; }
HMAC signature check (webhooks/partners)
set_by_lua_block $sig_ok {
return verify_hmac_signature(ngx. var. http_x_signature, ngx. var. request_time, ngx. var. request_body)
}
if ($sig_ok = 0) { return 401; }
Token bucket in Redis access_by_lua_block {
local key = ngx. var. binary_remote_addr.. ":".. ngx. var. request_uri local allowed, retry_after = ratelimit_allow(key, 50, 100)
if not allowed then ngx. header["Retry-After"] = retry_after return ngx. exit(429)
end
}
proxy_read_timeout 300ms;
proxy_connect_timeout 100ms;
proxy_pass http://app_backend;
}
5. 3 Kong: plugin-uri de-a lungul traseului
yaml services:
- name: payments url: http://payments:8080 routes:
- service: payments paths: ["/v1/payments"]
plugins:
- name: jwt config: { key_claim_name: kid, secret_is_base64: false, run_on_preflight: false }
- name: opa config: { server_url: "http://opa:8181/v1/data/authz/allow", timeout: 50 }
- name: rate-limiting config: { second: 50, policy: redis, redis_host: redis, fault_tolerant: true }
- name: correlation-id config: { header_name: "traceparent" }
- name: response-transformer config: { add: { headers: ["Strict-Transport-Security:max-age=31536000"] } }
5. 4 Apache APISIX: JWT + Limit + Proxy-oglindă (umbră)
yaml routes:
- uri: /v1/wallets/
plugins:
openid-connect:
client_id: wallet discovery: "https://auth. example. com/.well-known/openid-configuration"
scope: "openid"
limit-count:
count: 100 time_window: 60 key_type: "var"
key: "remote_addr"
proxy-mirror: # shadow traffic host: "http://shadow-backend:8080"
upstream_id: 1
5. 5 Traefik: Lanțul Middleware
yaml http:
middlewares:
hsts-headers:
headers:
stsSeconds: 31536000 stsIncludeSubdomains: true ratelimit:
rateLimit:
average: 50 burst: 100 routers:
api:
rule: "Host(`api. example. com`) && PathPrefix(`/v1`)"
service: app middlewares:
- hsts-headers
- ratelimit
6) Multi-chirie și versiuni de politică
Cheie de rutare: '{chiriaș, plan, regiune, rută, versiune}'.
Plugin-urile citesc 'tenant' din mTLS SAN/JWT ștampilă/antet → aplică limite/cote/reguli chiriașului.
Version policies ('policy _ version'), introduceți changelog și canar rollout.
7) Testarea și extinderea
Înainte de eliberare
Teste în lanț (dacă-apoi tabel): , , ,.
Încărcare: explozii × 10, platouri lungi, modele „murdare” (lent-POST).
Haos: PDP/JWKS/Redis degradare - trebuie să fie nu-închise/degradare la minim în condiții de siguranță.
Eliberare
„Raport-Numai ”/shadow-mode (log solutions without application).
Canare 1-5% trafic + comparație metrică (p95/p99, 4xx/5xx/429).
Rollback automat pe SLO/alerte.
8) Observabilitate și valori
Măsurători:- 'http _ requests _ total {route, chiriaș, plan, status}'
- 'request _ duration _ seconds _ bucket {route}' (p95/p99)
- 'rate _ limited _ total {policy}', 'retry _ total {reason}', 'circuit _ state'
- 'authn _ fail _ total {reason}', 'authz _ neged _ total {action}'
- 'schema _ validare _ fail _ total {route}'
- Urme: se întinde pe filtru, atribute 'policy _ version', 'chiriaș', 'limit _ key'.
- Jurnale (eșantionate): nega/429/5xx soluții cu cauze și 'trace _ id'.
- Tablouri de bord: Rezumat, pe traseu, per chiriaș, politicieni „fierbinți”.
9) Siguranță și funcționare
Toate secretele (HMAC, JWKS chei private, API) - în KMS/Vault, nu în fișiere de configurare.
Refuzați politica implicită pentru rutele sensibile.
Scurt TTL JWKS/PDP cache, actualizări asincrone cu backoff.
Migrarea sistemelor de transformare - versionat; „breaking” - prin dual-write.
Limita dimensiunea corpului (DoS) și adâncimea JSON.
10) Antipattern
Un set universal all-inclusive de plugin-uri pe fiecare rută → milisecunde suplimentare și facturi.
Dependențele externe ale plugin-urilor fără cache/timeout-uri → temporizări în cascadă.
Lipsa ordinii filtrului: prima transformare/logică, apoi limite - incorecte.
Cardinalitatea ridicată a etichetelor metrice (raw 'user _ id'/' ip').
Amestecarea authN/authZ în modele de transformare (soluții implicite în Lua/Jinja).
Logare secrete/jetoane.
Un Redis/cluster global pentru toate limitele fără timiditate/rezervă.
11) Specificul iGaming/Finanțe
Per chiriaș/pe reguli de jurisdicție: KYC/AML, sancțiuni, limitele plăților responsabile.
Politici dure pentru rute de plată: termene scurte, o repetare, idempotență („Idempotency-Key”).
Split perimetre pentru PSP/KYC SDK (domenii separate/lanțuri de plugin-uri).
Auditul jurnalelor decizionale neschimbabile (concluzii, blocare, refuz de sancțiune).
12) Lista de verificare Prod Readiness
- Ordinea filtrului este authN authZ limitează circuitul/timeout schema transformă memoria cache.
- Pe traseu set de plugin-uri; grele - numai acolo unde este necesar.
- JWKS/PDP cu TTL scurt și cache; timeout și strategii de rezervă.
- Rata/Cota/Concurenta - cheile sunt proiectate, sharding de stocare.
- RED/UTILIZARE set metric, OTel de urmărire, coadă/eșantionare adaptivă.
- Canare + modul umbră, auto-rollback de SLO.
- Secretele în KMS/Vault; configurații - versionat, cu migrații.
- Limite corp/antet; protecție supradimensionată/lentă POST.
- Documentația clientului: codurile 401/403/409/422/429/5xx, „Retry-After”, anteturile exemplului.
13) TL; DR
Construiți un lanț „eșec precoce autentificare/autorizare limite/persistență validare transformare/cache telemetrie”. Activați numai pluginurile necesare pe traseu, soluțiile externe cache (JWKS/PDP), setați termenele și încercați din nou politicile, controlați cardinalitatea metricii. Eliberați prin umbră/canar, păstrați secrete în KMS/Vault și măsurați impactul fiecărui plugin pe p95/p99.