GH GambleHub

Gateway APIのプラグインとミドルウェア

1)なぜプラグインとミドルウェアが必要なのか

APIゲートウェイ-企業ポリシーの執行のポイント。正しく組み立てられたプラグインチェーン:
  • 安全性(authN/authZ、 WAF、 CORS)を標準化),
  • 安定性(率の限界、遮断器、再試行ポリシー)を保護します、
  • 契約を管理します(スキームの検証、変換)、
  • 観測可能性(メトリック、ログ、トレース)を提供します),
  • コスト削減(キャッシュ、重複排除、カナリアルール)

キー:最小限のレイテンシと明確なアプリケーションの一貫性。

2)プラグインクラスと彼らが何をするか

1.ID/認証

JWT/JWKSプロバイダ、OAuth2/OIDC、 APIキー、 mTLS (client cert)。
HMAC署名(webhooks/partners)、エッジ上のDPoP/PoP。

2.承認(Authorization)

ローカルソリューションキャッシュを使用したRBAC/ABAC/OPA/Cedar (PDP)。
BOLA-guard:ヘッダー/コンテキストで'tenant'/'owner'をチェックします。

3.ネットワークとプロトコルの保護

WAF (OWASP CRS)、アンチボット(レート/行動)、ジオIP/ASNフィルタ、TLSプロファイル。
CORS、 CSPヘッダ、Fetch-Metadataフィルタ、CORP/COOP/COEP。

4.安定性について

レート制限(トークンバケット/GCRA)、クォータと競争力。
サーキットブレーカ、タイムアウト、アダプティブコンカレンシー、ロードシェッド。
試行ごとのタイムアウトとジッタを使用した再試行ポリシー。

5.変革と検証

Path/Header Census、 body-rewrite、 JSON/XML ↔、 gRPC ↔ HTTP。
スキーマ検証(OpenAPI/JSON Schema/Protobuf)、 ID正規化。

6.キャッシュとパフォーマンス

レスポンス/フラグメントキャッシュ、ETag/If-None-Match、圧縮、brotli。
同じキーの折りたたみ(結合)を要求します。

7.オブザビリティと監査

RED/USEメトリック、意思決定ログ(429/403/5xx)、トレース(W3C Trace-Context/OpenTelemetry)、サンプリング(tail/adaptive)。
セキュリティヘッダーとポリシーのバージョンを監査します。

8.ライフサイクルと運用

カナリア/ブルーグリーン、フィーチャーフラグ、シャドウソリューション(ログ、適用されません)、バージョンの移行。

3)適用のプロシージャ(推薦された鎖)


[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

原理:以前-安価/より致命的(拒否、認証、制限)、後-「化粧品」(変換、キャッシュ)。

4)性能およびcardinality

熱い道路で外部からの要求なしにO (1)ステップに固執します。
すべてのプラグイン「外部コール」(PDP/JWKS)は、短いTTLと非同期リフレッシュを介しています。
メトリックのラベル/ラベル-カーディナリティが制限されています('tenant'、 'plan'、 'route'、 'user_id'ではありません)。
「重い」プラグイン(WAF、 body-transform)-ルートごとに選択的に有効にします。

5)構成例

5.1特使:JWT+RateLimit+OPA+Retries(擬似)

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(擬似)

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:ルートに沿ったプラグイン

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-Mirror (shadow)

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:ミドルウェアチェーン

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)マルチテナンシーとポリシーのバージョン

ルーティングキー:'{tenant、 plan、 region、 route、 version}'。
プラグインは、mTLS SAN/JWT stamp/header→limits/quotas/rulesからテナントを読み取ります。
バージョンポリシー('policy_version')、 changelogとcanary rolloutを入力します。

7)テストおよびロールアウト

リリース前に

契約チェーンテスト(if-thenテーブル):auth→deny、 auth→allow、 rate→429、 schema→422。
読み込み:バースト× 10、長い台地、「汚れた」パターン(遅いPOST)。
カオス:PDP/JWKS/Redisの劣化-最小安全にフェイルクローズ/劣化する必要があります。

リリース

'Report-Only '/shadow-mode(アプリケーションなしのログソリューション)。
カナリア1-5%トラフィック+メトリック比較(p95/p99、 4xx/5xx/429)。
SLO/アラートの自動ロールバック。

8)観測可能性と指標

メトリクス:
  • 'http_requests_total {route、 tenant、 plan、 status}'
  • '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}'
  • トレース:フィルターごとのスパン、属性'policy_version'、 'tenant'、 'limit_key'。
  • ログ(サンプリング):原因と'trace_id'を持つ/429/5xxソリューションを拒否します。
  • ダッシュボード:Exec-summary、 per-route、 per-tenant、 「hot」政治家。

9)安全および操作

すべての秘密(HMAC、 JWKSプライベート、APIキー)-KMS/Vaultでは、設定ファイルではありません。
機密ルートのデフォルトでの拒否ポリシー。
短いTTL JWKS/PDPキャッシュ、バックオフ付きの非同期アップデート。
変換スキームの移行-バージョン管理;「breaking」-デュアルライトを介して。
ボディサイズ(DoS)とJSONの深さを制限します。

10) Antipatterns

各ルートのユニバーサルなオールインクルーシブなプラグインのセット→余分なミリ秒と請求書。
キャッシュ/タイムアウトのないプラグインの外部依存性→タイムアウトのカスケード化。
フィルタ順序の欠如:最初の変換/ロジック、次に制限-間違っています。
メトリックラベルの高いカーディナリティ(raw 'user_id'/'ip')。
変換パターンにauthN/authZを混在させる(Lua/Jinjaの暗黙の解)。
シークレット/トークンのロギング。
shardiness/reserveなしのすべての制限のための1つのグローバルRedis/クラスタ。

11) iGaming/Financeの詳細

テナントごと/管轄規則:KYC/AML、制裁、責任ある支払いの制限。
支払ルートのハードポリシー:短いタイムアウト、1つの繰り返し、idempotency ('Idempotency-Key')。
PSP/KYC SDK(別々のドメイン/プラグインチェーン)の分割境界。
変更できない意思決定ログの監査(結論、ブロック、制裁拒否)。

12) Prod Readinessチェックリスト

  • フィルター順序はauthN→authZ→limits→circuit/timeout→schema→transform→cacheです。
  • プラグインのルートセットごと;重い-必要な場合にのみ。
  • 短いTTLとキャッシュを持つJWKS/PDP;タイムアウトとフォールバック戦略。
  • Rate/Quota/Concurrency-キーは、ストレージシャーディング設計されています。
  • RED/USEメトリックセット、OTelトレース、テール/アダプティブサンプリング。
  • Canary+shadowモード、SLOによる自動ロールバック。
  • KMS/Vaultの秘密;configs-バージョン管理、マイグレーション。
  • Body/headers limits;oversize/slow-POST保護。
  • Customer documentation: codes 401/403/409/422/429/5xx、 'Retry-After'、 example headers。

13) TL;DR(ドクター)

「早期失敗→認証/承認→limits/persistence→→transformation validation/cache→telemetry」チェーンを構築します。ルートごとに必要なプラグインのみを有効にし、外部ソリューション(JWKS/PDP)をキャッシュし、タイムアウトと再試行ポリシーを設定し、メトリクスのカーディナリティを制御します。shadow/canary経由でリリースし、KMS/Vaultに秘密を保持し、p95/p99の各プラグインの影響を測定します。

Contact

お問い合わせ

ご質問やサポートが必要な場合はお気軽にご連絡ください。いつでもお手伝いします!

統合を開始

Email は 必須。Telegram または WhatsApp は 任意

お名前 任意
Email 任意
件名 任意
メッセージ 任意
Telegram 任意
@
Telegram を入力いただいた場合、Email に加えてそちらにもご連絡します。
WhatsApp 任意
形式:+国番号と電話番号(例:+81XXXXXXXXX)。

ボタンを押すことで、データ処理に同意したものとみなされます。