Ağ Geçidi API'sindeki eklentiler ve ara katman yazılımı
1) Neden eklentilere ve ara katman yazılımlarına ihtiyacınız var?
API ağ geçidi - kurumsal politikaların uygulanması noktası. Doğru şekilde monte edilmiş eklenti zinciri:- Güvenliği standartlaştırır (authN/authZ, WAF, CORS),
- kararlılığı korur (oran limiti, devre kesici, yeniden deneme politikaları),
- Sözleşmeyi yönetir (planların doğrulanması, dönüşümler),
- Gözlemlenebilirlik sağlar (metrikler, günlükler, izleme),
- Maliyeti azaltır (önbelleğe alma, veri tekilleştirme, kanarya kuralları)
Anahtar: minimum gecikme ve net uygulama tutarlılığı.
2) Eklenti sınıfları ve yaptıkları
1. Tanımlama/Kimlik Doğrulama
JWT/JWKS sağlayıcıları, OAuth2/OIDC, API anahtarları, mTLS (istemci sertifikası).
HMAC imzaları (webhooks/ortaklar), kenardaki DPoP/PoP.
2. Yetkilendirme
Yerel çözüm önbelleği ile RBAC/ABAC/OPA/Cedar (PDP).
BOLA-guard: 'kiracı'/' sahibi' başlıklarını/bağlamında kontrol etme.
3. Ağ ve protokol koruması
WAF (OWASP CRS), anti-botlar (oran/davranışsal), Geo/IP/ASN filtreleri, TLS profilleri.
CORS, CSP başlıkları, Fetch-Metadata filtreleri, CORP/COOP/COEP.
4. Stabilite
Hız sınırlaması (token bucket/GCRA), kotalar ve rekabet gücü.
Devre kesici, zaman aşımları, uyarlanabilir eşzamanlılık, yük düşürme.
Deneme başına zaman aşımı ve titreme ile yeniden deneme ilkesi.
5. Dönüşümler ve doğrulama
Path/Header Census, body-rewrite, JSON/XML ↔, gRPC ↔ HTTP.
Şema doğrulama (OpenAPI/JSON Schema/Protobuf), kimlik normalleştirme.
6. Önbelleğe alma ve performans
Yanıt/parça önbelleği, ETag/If-None-Match, sıkıştırma, brotli.
Aynı tuşlar için daraltma (birleştirme) isteğinde bulunun.
7. Gözlemlenebilirlik ve denetim
RED/USE metrikleri, karar kaydı (429/403/5xx), izleme (W3C Trace-Context/OpenTelemetry), örnekleme (tail/adaptive).
Denetim güvenliği başlıkları ve ilke sürümleri.
8. Yaşam döngüsü ve operasyon
Kanarya/mavi-yeşil, özellik bayrakları, gölge çözümleri (log, uygulanmaz), sürüm geçişleri.
3) Uygulama prosedürü (önerilen zincir)
[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
İlke: Daha önce - daha ucuz/daha ölümcül (inkar, auth, limitler), daha sonra - "kozmetik" (dönüşüm, önbellek).
4) Performans ve kardinalite
Sıcak yolda harici istek olmadan O (1) adımlarına sadık kalın.
Tüm eklenti "harici aramalar" (PDP/JWKS) kısa TTL ve asenkron yenileme ile yapılır.
Metrikler için etiketler/etiketler - sınırlı kardinalite ('kiracı', 'plan', 'rota', ancak 'user _ id'değil).
"Ağır" eklentiler (WAF, body-transform) - seçici olarak rota başına etkinleştirin.
5) Yapılandırma örnekleri
5. 1 Temsilci: JWT + RateLimit + OPA + Yeniden Çalışır (sözde)
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 (sözde)
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: rota boyunca eklentiler
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-Ayna (gölge)
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: Middleware zinciri
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) Çok kiracılık ve politika versiyonları
Yönlendirme anahtarı: '{kiracı, plan, bölge, rota, sürüm}'.
Eklentiler, mTLS SAN/JWT damgasından/başlığından 'kiracı'yı okur; kiracıya sınırlar/kotalar/kurallar uygular.
Sürüm ilkeleri ('policy _ version'), changelog ve canary rollout girin.
7) Test ve sunum
Serbest bırakılmadan önce
Sözleşme zinciri testleri (if-then table): auth - deny, auth - allow, rate - 429, schema - 422.
Yükleme: patlamalar × 10, uzun platolar, "kirli" desenler (yavaş POST).
Chaos: PDP/JWKS/Redis degradation - minimum güvenliğe kadar fail-closed/degradation olmalıdır.
Serbest bırakma
'Sadece Rapor'/gölge modu (uygulama olmadan günlük çözümleri).
Kanarya %1-5 trafik + metrik karşılaştırma (p95/p99, 4xx/5xx/429).
SLO/uyarılar üzerinde otomatik geri alma.
8) Gözlemlenebilirlik ve metrikler
Metrikler:- 'http _ requests _ total {route, kiracı, plan, durum}'
- 'request _ duration _ seconds _ bucket {route}' (p95/p99)
- 'rate _ limited _ total {policy}', 'retry _ total {reason}', 'circuit _ state'
- 'authn _ fail _ total {reason}', 'authz _ denied _ total {action}'
- 'schema _ validation _ fail _ total {route}'
- İzler: filtre başına yayılma, 'policy _ version', 'tenant', 'limit _ key' nitelikleri.
- Günlükler (örneklenmiş): Nedenleri ve 'trace _ id'ile/429/5xx çözümlerini reddedin.
- Panolar: Exec-özet, rota başına, kiracı başına, "sıcak" politikacılar.
9) Güvenlik ve çalışma
Tüm sırlar (HMAC, JWKS özel, API anahtarları) - KMS/Vault'ta, yapılandırma dosyalarında değil.
Hassas yollar için varsayılan olarak reddetme politikası.
Kısa TTL JWKS/PDP önbellek, eşzamansız güncelleme ve geri alma.
Dönüşüm şemalarının göçü - sürümlü; "kırma" - çift yazma yoluyla.
Vücut boyutunu (DoS) ve JSON derinliğini sınırlayın.
10) Antipatterns
Her rotada evrensel her şey dahil eklenti kümesi - ekstra milisaniyeler ve faturalar.
Önbellek/zaman aşımı olmayan eklentilerin dış bağımlılıkları - basamaklı zaman aşımları.
Filtre sırası eksikliği: önce dönüşüm/mantık, sonra sınırlar - yanlış.
Metrik etiketlerin yüksek kardinalitesi (ham 'user _ id'/' ip').
AuthN/authZ'nin dönüşüm modellerinde karıştırılması (Lua/Jinja'da örtük çözümler).
Günlük sırları/belirteçleri.
Tüm limitler için bir global Redis/cluster, shardiness/reserve olmadan.
11) iGaming/Finansın Özellikleri
Kiracı başına/yetki alanı kuralları: KYC/AML, yaptırımlar, sorumlu ödemelerin sınırları.
Ödeme yolları için zor politikalar: kısa zaman aşımları, bir tekrar, idempotency ('Idempotency-Key').
PSP/KYC SDK için bölünmüş çevreler (ayrı etki alanları/eklenti zincirleri).
Değiştirilemez karar günlüklerinin denetimi (sonuçlar, engelleme, yaptırım reddi).
12) Prod Hazırlık Kontrol Listesi
- Filtre sırası authN, authZ, limit, devre, zaman aşımı, şema, transform, önbellek.
- Per-route eklenti kümesi; ağır - sadece gerektiğinde.
- Kısa TTL ve önbellek ile JWKS/PDP; Zaman aşımları ve geri dönüş stratejileri.
- Oran/Kota/Eşzamanlılık - anahtarlar tasarlanmıştır, depolama sharding.
- KIRMIZI/KULLANIM metrik seti, OTel izleme, kuyruk/uyarlamalı örnekleme.
- Kanarya + gölge modu, SLO tarafından otomatik geri alma.
- KMS/Vault Sırları; Yapılandırmalar - sürümler, geçişlerle.
- Gövde/başlık sınırları; Büyük boy/yavaş POST koruması.
- Müşteri belgeleri: kodlar 401/403/409/422/429/5xx, 'Retry-After', örnek başlıklar.
13) TL; DR
Bir "erken başarısızlık", kimlik doğrulama/yetkilendirme, sınırlar, süreklilik, dönüşüm doğrulama, önbellek, telemetri zinciri oluşturun. Yalnızca rota başına gerekli eklentileri etkinleştirin, harici çözümleri önbelleğe alın (JWKS/PDP), zaman aşımları ayarlayın ve politikaları yeniden deneyin, metriklerin kardinalitesini kontrol edin. Gölge/kanarya ile serbest bırakın, KMS/Vault'ta sırları saklayın ve her eklentinin p95/p99 üzerindeki etkisini ölçün.