GH GambleHub

게이트웨이 API의 플러그인 및 미들웨어

1) 플러그인과 미들웨어가 필요한 이유

게이트웨이 API-기업 정책의 시행 지점. 정확하게 조립 된 플러그인 체인:
  • 안전을 표준화합니다 (WAF, CORS),
  • 안정성 보호 (속도 제한, 회로 차단기, 재 시도 정책)
  • 계약을 관리합니다 (체계 검증, 변환)
  • 관찰 가능성 (메트릭, 로그, 추적),
  • 비용 절감 (캐싱, 중복 제거, 카나리아 규칙)

키: 최소 대기 시간과 명확한 적용 일관성.

2) 플러그인 클래스 및 수행

1. 식별/인증

JWT/JWKS 제공 업체, OAuth2/OIDC, API 키, mSL (클라이언트 인증).
HMAC 서명 (웹 후크/파트너), 가장자리의 DPoP/PoP.

2. @ info: whatsthis

로컬 솔루션 캐시가있는 RBAC/ABAC/OPA/Cedar (PDP).
BOLA 가드: 헤더/컨텍스트에서 '테넌트 '/' 소유자' 확인.

3. 네트워크 및 프로토콜 보

WAF (OWASP CRS), 안티 봇 (속도/행동), Geo/IP/ASN 필터, SL 프로파일.
CORS, CSP 헤더, Fetch-Metadata 필터, CORP/COOP/COEP.

4. 안정성

요율 제한 (토큰 버킷/GCRA), 할당량 및 경쟁력.
회로 차단기, 타임 아웃, 적응 형 동시성, 로드 흘림.
시도 당 시간 초과 및 지터가있는 재시도 정책.

5. 변형 및 검증

경로/헤더 인구 조사, 차체 다시 작성, JSON/XML 왔습니다.
스키마 검증 (OpenAPI/JSON 스키마/프로토 타입), ID 정규화.

6. 캐싱 및 성능

응답/조각 캐시, ETag/If-None-Match, 압축, brotli.
동일한 키에 대한 붕괴 요청 (통합).

7. 관찰 및 감사

RED/USE 메트릭, 의사 결정 로깅 (429/403/5xx), 추적 (W3C 추적 컨텍스트/OpenTelemetry), 샘플링 (꼬리/적응).
감사 보안 헤더 및 정책 버전.

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) 성능과 카디널리티

뜨거운 도로에서 외부 요청없이 O (1) 단계를 고수하십시오.
모든 플러그인 "외부 호출" (PDP/JWKS) 은 짧은 TTL 및 비동기식 새로 고침을 통해 이루어집니다.
메트릭을위한 레이블/레이블 - 제한된 카디널리티 ('테넌트', '플랜', '경로' 이지만 'user _ id' 는 아님).
"무거운" 플러그인 (WAF, 차체 변환) -경로당 선택적으로 활성화됩니다.

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 콩: 경로를 따라 플러그인

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 + 한계 + 프록시 미러 (그림자)

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) 다중 임대 및 정책 버전

라우팅 키: '{테넌트, 계획, 지역, 경로, 버전}'.
플러그인은 mSL SAN/JWT 스탬프/헤더에서 '테넌트' 를 읽습니다. → 세입자에게 제한/할당량/규칙을 적용합니다.
버전 정책 ('policy _ version'), 변경 로그 및 카나리아 롤아웃을 입력하십시오.

7) 테스트 및 롤아웃

출시 전

계약 체인 테스트 (if-the table):
  • 로딩: 버스트 × 10, 긴 고원, "더러운" 패턴 (slow-POST).
  • 혼돈: PDP/JWKS/Redis 분해-최소 안전을 위해 분해/분해되어야합니다.

출시

'Report-Only '/shadow-mode (응용 프로그램이없는 로그 솔루션).
카나리아 1-5% 트래픽 + 메트릭 비교 (p95/p99, 4xx/5xx/429).
SLO/경고에 대한 자동 롤백.

8) 관찰 가능성 및 지표

메트릭:
  • 'http _ quirs _ total {route, 세입자, 계획, 상태}'
  • (PHP 3 = 3.0.6, PHP 4)
  • 'rate _ limited _ total {policy}', 'recide _ total {reason}', 'circuit _ state'
  • (PHP 3 = 3.0.6, PHP 4)
  • 'schima _ validation _ fail _ total {route}'
  • 추적: 필터 당, 속성 'policy _ version', 'tennity', 'limite _ key'.
  • 로그 (샘플링): 원인 및 'trace _ id' 가있는/429/5xx 솔루션 거부.
  • 대시 보드: Exec 요약, 경로 당, 임차인 당 "핫" 정치인.

9) 안전과 운영

설정 파일이 아닌 KMS/Vault의 모든 비밀 (HMAC, JWKS 개인, API 키).
민감한 경로에 대한 기본 정책을 거부합니다.
짧은 TTL JWKS/PDP 캐시, 백오프가있는 비동기 업데이트.
변환 체계의 마이그레이션 - 버전; "파괴" -이중 쓰기를 통해.
신체 크기 (DoS) 및 JSON 깊이를 제한합니다.

10) 안티 패턴

각 경로의 범용 포괄적 인 플러그인 세트 → 추가 밀리 초 및 청구서.
캐시/타임 아웃이없는 플러그인의 외부 종속성 → 계단식 타임 아웃.
필터 순서 부족: 첫 번째 변환/논리, 제한-잘못되었습니다.
메트릭 라벨의 높은 카디널리티 (원시 'user _ id '/' ip').
변환 패턴 (Lua/Jinja의 암시 적 솔루션) 에서 저자/저작자 혼합.
로깅 비밀/토큰.
예리함/예약없이 모든 한계에 대한 하나의 글로벌 Redis/클러스터.

11) iGaming/Finance의 세부 사항

세입자/관할권 별 규칙: KYC/AML, 제재, 책임있는 지불 한도.
결제 경로에 대한 하드 정책: 짧은 타임 아웃, 하나의 반복, demempotency ('Idempotency-Key').
PSP/KYC SDK (별도의 도메인/플러그인 체인) 용 분할 경계계.
변경 불가능한 결정 기록 감사 (결론, 차단, 제재 거부).

12) Prod 준비 점검표

  • 필터 순서는 차수이고 → 회로/타임 아웃 → 스키마 → 변환 → 캐시입니다.
  • 경로 별 플러그인 세트; 필요한 경우에만 무겁습니다.
  • 짧은 TTL 및 캐시를 갖는 JWKS/PDP; 타임 아웃 및 대체 전략.
  • 요율/쿼터/동시성-키는 스토리지 샤딩으로 설계되었습니다.
  • RED/USE 메트릭 세트, OTel 트레이싱, 테일/어댑티브 샘플링.
  • 카나리아 + 섀도우 모드, SLO에 의한 자동 롤백.
  • KMS/Vault의 비밀; 구성 요소-버전이 있고 마이그레이션이 있습니다.
  • 바디/헤더 제한; 대형/저속 POST 보호.
  • 고객 문서: 코드 401/403/409/422/429/5xx, 'Redure-After', 예제 헤더.

13) TL; DR

"조기 실패 → 인증/인증 → 제한/지속성 → → 변환 검증/캐시 → 원격 측정" 체인을 작성하십시오. 필요한 경로당 플러그인, 캐시 외부 솔루션 (JWKS/PDP) 만 사용하고 타임 아웃 및 재 시도 정책을 설정하고 메트릭의 카디널리티를 제어합니다. 섀도우/카나리아를 통해 릴리스하고 KMS/Vault에 비밀을 유지하고 각 플러그인이 p95/p99에 미치는 영향을 측정하십시오.

Contact

문의하기

질문이나 지원이 필요하시면 언제든지 연락하십시오.우리는 항상 도울 준비가 되어 있습니다!

통합 시작

Email — 필수. Telegram 또는 WhatsApp — 선택 사항.

이름 선택 사항
Email 선택 사항
제목 선택 사항
메시지 선택 사항
Telegram 선택 사항
@
Telegram을 입력하시면 Email과 함께 Telegram에서도 답변드립니다.
WhatsApp 선택 사항
형식: +국가 코드 + 번호 (예: +82XXXXXXXXX).

버튼을 클릭하면 데이터 처리에 동의하는 것으로 간주됩니다.