infra
Platform

모듈 맵

[Cloud] API 게이트웨이 — 모든 요청이 지나는 관문

0 / 22 완료

펼치기
0 / 22 완료0%

클라우드 엔지니어링 · 19 / 22

[Cloud] API 게이트웨이 — 모든 요청이 지나는 관문

관리형 API 게이트웨이로 인증·요청 제한(throttling)·라우팅·캐싱·웹훅을 중앙에서 처리하는 클라우드 API 관리 패턴과, 동기 API와 비동기 메시징의 경계를 정리합니다

🚨INCIDENT ALERT
HIGH

서비스가 커지면서 인증 코드가 모든 백엔드에 복붙되고, 어떤 서비스는 요청 제한이 없어 한 클라이언트의 폭주에 통째로 다운됐습니다. 결제사 웹훅은 검증 없이 받다가 위조 요청에 당했습니다. 백엔드마다 같은 일(인증·제한·로깅)을 제각각, 어떤 곳은 빠뜨린 채 구현한 탓입니다. 모든 요청이 지나는 관문 하나에서 공통 처리하면 이 중복과 누락이 사라집니다.

이번 챕터에서 배울 것
  • 1API 게이트웨이가 횡단 관심사를 중앙 처리하는 이유를 안다
  • 2요청 제한(throttling)이 과부하·비용·남용을 막는 원리를 안다
  • 3동기 API와 비동기 메시징의 사용 경계를 구분할 수 있다
  • 4웹훅 수신 시 서명 검증과 멱등 처리의 필요성을 안다
  • 5게이트웨이가 인증·캐싱·라우팅을 어떻게 위임받는지 이해한다

모든 요청이 지나는 한 곳

💡개념

API 게이트웨이 — 횡단 관심사를 관문에서

인증, 요청 제한, 라우팅, 캐싱, 로깅/지표는 거의 모든 API가 공통으로 필요로 합니다. 이를 각 백엔드가 따로 구현하면 중복되고, 한 곳이라도 빠뜨리면 사고가 납니다.

API 게이트웨이는 모든 클라이언트 요청이 거치는 단일 관문에서 이 횡단 관심사를 중앙 처리합니다. 백엔드는 비즈니스 로직에만 집중하고, 클라이언트는 단일 진입점을 갖습니다. MSA(모놀리식 vs 마이크로서비스)에서 특히 중요한 패턴입니다.

API 게이트웨이 — 횡단 관심사 중앙 처리확대

토큰 버킷 요청 제한 — 버킷에 일정 속도(rate)로 토큰을 채우고 요청마다 토큰 하나를 소비, 토큰이 없으면 429 Too Many Requests로 거부. 버킷 용량(burst)만큼 순간 폭주를 허용하면서 평균 처리율은 rate로 제한 — 백엔드를 과부하·악용으로부터 보호하는 rate limiting의 표준 알고리즘확대 위 그림처럼 토큰 버킷에 토큰이 있으면 통과(200), 없으면 429로 거절합니다. 버스트는 순간 폭발을 허용하고, 레이트는 지속 처리율을 제한합니다.

💡개념

요청 제한(throttling) — 폭주로부터 백엔드를 지킨다

한 클라이언트의 폭주나 공격이 백엔드를 마비시키지 않도록, 게이트웨이는 단위 시간당 요청 수를 제한합니다. 초과분은 429 Too Many Requests로 거절하고 정상 사용자를 보호합니다.

서버리스(서버리스(Lambda))처럼 호출당 과금되는 백엔드에서는 요청 제한이 비용 방어이기도 합니다 — 무한 호출로 청구서가 폭증하는 것을 막습니다(클라우드 비용 최적화). 정상 트래픽과 남용을 가르는 임계값 설정이 핵심입니다.

동기 API vs 비동기 큐 처리 — 동기는 클라이언트가 응답을 기다려 처리 시간이 길면 타임아웃·자원 점유 위험. 비동기는 게이트웨이가 요청을 큐에 넣고 즉시 202 Accepted를 반환, 워커가 나중에 처리. 무거운 작업(파일 변환·정산)은 비동기로 분리해 응답성을 높이고 트래픽 급증을 큐가 흡수확대 위 그림에서 왼쪽(동기)은 즉시 응답을 돌려주고, 오른쪽(비동기)은 202 Accepted 후 큐에서 후속 처리합니다.

💡개념

동기(게이트웨이) vs 비동기(큐) — 경계를 가른다

  • 동기 — API 게이트웨이: 사용자가 결과를 즉시 기다리는 요청(로그인·조회·결제 승인). 받아서 응답을 돌려줌.
  • 비동기 — 메시지 큐: 결과를 당장 안 기다려도 되는 후속(알림·집계·정산). 큐로 흘려 백엔드가 자기 속도로(메시지 큐와 이벤트).

흔한 패턴: 게이트웨이가 요청을 받아 즉시 응답하고, 무거운 후속 작업은 큐에 넣어 비동기로 처리합니다. "모든 걸 동기로"는 느리고 취약하고, "모든 걸 비동기로"는 즉시성이 필요한 곳에서 어색합니다.

게이트웨이에 위임할 것 / 백엔드에 남길 것
인증 토큰 검증·JWT 파싱게이트웨이(공통)백엔드는 검증된 신원만 신뢰
요청 제한·남용 차단게이트웨이백엔드 도달 전에 거절(429)
경로/버전 라우팅, CORS게이트웨이/v1·/v2, 출처 허용 중앙 관리
비즈니스 권한(이 사용자가 이 주문을 볼 수 있나)백엔드도메인 규칙은 게이트웨이가 모름
💡개념

웹훅 수신 — 검증과 멱등이 필수

웹훅은 외부 시스템(결제사·깃허브 등)이 우리 엔드포인트로 보내는 이벤트 알림입니다. 공개 엔드포인트라 누구나 위조 요청을 보낼 수 있으므로:

  • 서명 검증: 발신자가 준 시크릿(시크릿·키 관리)으로 만든 서명을 확인해 진짜인지 검증
  • 멱등 처리: 외부는 보통 재시도하므로 같은 이벤트가 중복 도착 → 두 번 처리해도 결과가 같게(메시지 큐와 이벤트의 멱등성)

검증 없는 웹훅 수신은 위조·재생 공격에 그대로 노출됩니다.

💡개념

게이트웨이가 요청 하나를 처리하는 법 — 수신부터 응답·캐시까지 6단계

클라이언트가 POST /v1/orders 한 번을 보내면, 게이트웨이 안에서 요청 수신 → 인증 → 레이트리밋 → 요청 검증·변환 → 백엔드 라우팅 → 응답·캐시가 순서대로 일어납니다. 이 순서가 곧 진단 순서입니다 — 클라이언트가 받은 상태코드(401인지 429인지 502인지)가 게이트웨이 어느 단계에서 튕겨 나왔는지를 가리키기 때문입니다. 게이트웨이는 요청을 그냥 백엔드로 흘려보내는 게 아니라 아래 6단계의 관문을 통과시킵니다.

TEXT
[클라이언트]  POST /v1/orders   (Authorization: Bearer …)
   │
   ① 요청 수신 + 경로 매칭          (/v1/orders → 라우트·메서드 결정, CORS 프리플라이트)
   │
   ② 인증(API키·JWT)                (authorizer가 토큰 검증 → 신원 확립)
   │
   ③ 레이트리밋·쿼터                (토큰 버킷 — 초과분은 여기서 429)
   │
   ④ 요청 검증·변환                 (스키마 검증, 헤더·경로·본문 매핑)
   │
   ⑤ 백엔드 라우팅                  (람다·서비스로 전달, 통합 타임아웃 적용)
   │
   ⑥ 응답 반환 + 캐시               (상태코드·본문 반환, 캐시 가능하면 저장)
   ▼
[클라이언트]  200 OK  (다음 동일 GET은 ⑥ 캐시로 즉시 응답 가능)

각 단계에서 무슨 일이 일어나고, 막히면 어떤 상태코드가 나오나:

단계하는 일여기서 막히면 증상
① 수신·매칭경로·메서드로 어느 라우트인지 결정. CORS 프리플라이트(OPTIONS)도 여기서 응답정의 안 된 경로 → 404 / CORS 헤더 누락 → 브라우저가 응답을 차단
② 인증authorizer가 API 키·JWT를 검증해 신원 확립. 라우트마다 붙이는 설정토큰 없음·만료 → 401 / 권한 없음 → 403 / 라우트에 authorizer 누락 → 무인증 노출
③ 레이트리밋토큰 버킷으로 초당·버스트 한도 검사. 백엔드 도달 전에 초과분을 거절한도 초과 → 429 Too Many Requests / 한도 미설정이면 폭주·비용 폭증에 무방비
④ 검증·변환요청 본문 스키마 검증, 헤더·쿼리·경로를 백엔드 형식으로 매핑스키마 불일치 → 400 / 변환 규칙 오류 → 백엔드가 잘못된 입력 수신
⑤ 라우팅대상 백엔드(람다·서비스)로 전달하고 통합 타임아웃(예: 29초) 적용백엔드 오류 → 502 / 타임아웃 초과 → 504 / 백엔드 다운 → 503
⑥ 응답·캐시상태코드·본문을 클라이언트로 반환. 캐시 가능한 GET이면 저장해 다음 요청을 가속캐시 키 설계 오류 → 사용자 A의 응답이 B에게 나가는 캐시 오염

즉 이 순서가 곧 진단의 지도입니다 — 401/403이면 ②인증, 429면 ③레이트리밋, 400이면 ④검증, 502/504면 ⑤백엔드까지 갔다가 실패한 것입니다. 그래서 4XX가 늘면 429(한도)인지 401(인증)인지부터 분해하고, 5XX면 게이트웨이가 아니라 뒷단을 봐야 합니다. 인증이 ②에서 라우트 단위로 붙는다는 사실은, 라우트 하나만 authorizer를 빠뜨려도 그 경로가 통째로 무인증으로 열린다는 뜻이기도 합니다 — 중앙 처리 구조의 강점이자 한 구멍의 대가입니다.

1게이트웨이 요청 제한·스로틀 설정 확인

스테이지의 throttling 설정(초당 한도·버스트)을 확인합니다. 없으면 폭주에 무방비입니다.

로컬 터미널
aws apigateway get-stage --rest-api-id "$API_ID" --stage-name prod \
  --query "{RateLimit:methodSettings.*.throttlingRateLimit,Burst:methodSettings.*.throttlingBurstLimit}"
OUTPUT
{ "RateLimit": [1000.0], "Burst": [2000] }
aws apigateway get-stage
24xx/5xx·지연·throttle 지표 확인

게이트웨이의 4XX(클라이언트 오류)·5XX(백엔드 오류)·지연을 봅니다. 429가 잦으면 한도나 클라이언트 폭주를 점검합니다.

로컬 터미널
aws cloudwatch get-metric-statistics --namespace AWS/ApiGateway \
  --metric-name 4XXError --dimensions Name=ApiName,Value=my-api \
  --start-time 2026-06-16T00:00:00Z --end-time 2026-06-16T01:00:00Z \
  --period 3600 --statistics Sum --query "Datapoints[0].Sum"
OUTPUT
142.0   # 1시간 4XX 142건 — 429(throttle)인지 인증실패(401/403)인지 분해 필요
aws cloudwatch get-metric-statistics
🔍실행 후 확인할 것
  • 스테이지에 throttling 설정이 없거나 과도하게 높음 — 폭주·비용 폭증에 무방비. 정상 트래픽 기준으로 한도·버스트 설정
  • 4XX 중 429 비중 — 높으면 한도가 빡빡하거나 특정 클라이언트 폭주. 401/403이면 인증·권한 문제(용어사전)
  • 5XX 발생 — 게이트웨이가 아니라 뒷단 백엔드 오류·타임아웃. 502/504 구분해 백엔드 상태 점검
  • 웹훅 엔드포인트에 서명 검증·멱등 처리가 있는지 — 없으면 위조·중복 처리 위험. 코드·게이트웨이 권한정책 점검

상황: 게이트웨이는 받는데 뒷단(서버리스/백엔드)이 한계에 부딪힘.

원인: ① 게이트웨이 요청 제한은 없는데 뒷단 동시성 한도에 먼저 도달, ② 서버리스 동시성 폭증으로 DB 커넥션 고갈(서버리스(Lambda)의 커넥션 폭주), ③ 무거운 동기 처리를 게이트웨이 뒤에서 다 하려다 지연 누적.

진단: 게이트웨이 429 vs 백엔드 throttle/에러 분리 → 뒷단 동시성·DB 커넥션 지표 확인 → 동기로 처리 중인 무거운 작업이 있는지 점검.

해결: 게이트웨이에 요청 제한을 둬 뒷단 도달 전에 완충, 뒷단 동시성·커넥션 풀(RDS Proxy 등) 조정, 즉시 응답이 불필요한 무거운 작업은 큐로 비동기화(메시지 큐와 이벤트). "게이트웨이로 받아 즉시 응답 + 후속은 큐"가 스파이크를 견디는 표준 구조입니다.

심화 — 관문 뒤의 시간 설계, 관문의 구멍

💡개념

심화: 타임아웃과 재시도는 층층이 쌓인다 — 겹치면 폭풍이 된다

게이트웨이를 지나는 요청에는 타임아웃이 여러 층 걸려 있습니다. 클라이언트 → 게이트웨이(관리형은 통합 타임아웃 상한이 고정된 경우가 많습니다 — 예: 29초) → 백엔드/함수 → DB 순입니다. 이 층들의 관계를 설계하지 않으면 두 가지 사고가 납니다.

  • 바깥이 먼저 끊기는 문제: 백엔드 타임아웃이 게이트웨이보다 길면, 클라이언트는 504를 받았는데 백엔드 작업은 계속 돌아갑니다. 사용자는 실패로 알고 재시도 → 같은 작업이 중복 실행됩니다. 규칙은 '안쪽으로 갈수록 짧게'(백엔드 < 게이트웨이 < 클라이언트), 그리고 게이트웨이 상한을 넘길 수 있는 작업은 애초에 동기로 받지 않는 것입니다(202 + 큐 — 본문의 비동기 분리가 필요한 진짜 이유가 여기에 있습니다).
  • 재시도 폭풍(retry storm): 장애가 나면 클라이언트 재시도 × 백엔드 SDK 재시도 × 큐 재전달이 곱해져 원래 트래픽의 수 배가 몰리고, 회복하려는 시스템을 다시 눕힙니다(메시지 큐와 이벤트). 재시도는 한 층에서만, 지수 백오프 + 횟수 상한으로 겁니다. 그리고 쓰기 API에는 Idempotency-Key를 받아 같은 키의 중복 요청을 한 번만 처리합니다 — 웹훅에서 배운 멱등을 이번엔 우리 API가 제공하는 쪽이 되는 것입니다.

상황: 다른 경로는 전부 인증이 걸려 있어 아무도 의심하지 않았는데, 두 달 전 급히 추가한 신규 라우트 하나만 인증 없이 열려 있었습니다. 에러율·지연 지표는 내내 정상이라 모니터링에도 잡히지 않았습니다.

원인: 게이트웨이 인증은 라우트(메서드) 단위로 붙이는 설정이고, 많은 도구에서 기본값이 '인증 없음'입니다. 콘솔에서 수동으로 라우트를 추가하며 authorizer 연결을 빠뜨렸고, 백엔드는 'JWT 검증은 게이트웨이가 한다'고 신뢰해 자체 확인이 없었습니다 — 중앙 처리 구조는 한 라우트만 빠져도 그 구멍이 그대로 외부에 노출됩니다.

진단: 라우트별 인증 설정을 일괄 덤프해 authorizationType이 NONE인 메서드를 나열하고(aws apigateway get-resources + get-method), 액세스 로그에서 인증 헤더 없이 2xx가 나간 요청을 검색해 유출 기간·범위를 산정합니다.

해결: 해당 라우트에 즉시 authorizer 연결·재배포하고 유출 범위를 로그 기반으로 보고합니다. 재발 방지는 세 겹 — ① 라우트 정의를 코드로 옮기고 'NONE 라우트'를 리뷰·정책 검사에서 차단(IaC와 Terraform), ② 백엔드도 게이트웨이가 넘긴 신원 클레임을 재확인하는 심층 방어, ③ authorizationType이 NONE인 라우트 목록을 주기적으로 자동 감사해 의도된 공개 경로 화이트리스트와 대조합니다.

💼
실무 맥락
현업 패턴

API 게이트웨이는 클라우드 API 운영의 표준 구성요소입니다. "외부에 API를 어떻게 안전하게 공개하나요?"에 "게이트웨이에서 인증·요청 제한·CORS를 중앙 처리하고, 웹훅은 서명 검증·멱등, 무거운 후속은 큐로 비동기"라 답하면 탄탄합니다.

PM 관점에서도 연동 요구사항을 게이트웨이 기준으로 적으면 사고를 줄입니다 — "초당 N건 제한", "허용 출처(CORS)", "웹훅 서명 검증", "Idempotency-Key"를 인수 기준에 넣습니다(용어사전). 이 모듈은 동기 API(모놀리식 vs 마이크로서비스의 API 계약)와 비동기 메시징(메시지 큐와 이벤트)을 잇는 경계에 서 있어, 둘을 함께 이해할 때 시스템 전체 그림이 완성됩니다.

다음으로는 이 게이트웨이·서버리스·큐가 코드로 선언되고(IaC와 Terraform) 관측·통제되는(관측과 거버넌스) 큰 그림을 Well-Architected 6대 기둥으로 점검해 보세요.

지식 확인

퀴즈 — 8문제

Q1

API 게이트웨이를 두는 핵심 이유로 가장 정확한 것은?

Q2

API 게이트웨이의 '요청 제한(throttling/rate limiting)'이 보호하는 것은?

Q3

동기 API 게이트웨이와 비동기 메시지 큐의 적절한 사용 구분은?

Q4

외부 시스템이 우리에게 이벤트를 알려주는 '웹훅(webhook)'을 받을 때 게이트웨이/엔드포인트에서 꼭 해야 하는 것은?

Q5

API 게이트웨이를 두면 인증·요청제한·로깅 같은 일을 각 서비스가 따로 구현하지 않아도 되는 이유는?

Q6

API를 고쳐야 하는데 기존 클라이언트를 깨지 않으려면 게이트웨이에서 흔히 쓰는 방법은?

Q7

[심화] 게이트웨이를 지나는 요청에 클라이언트-게이트웨이-백엔드-DB로 타임아웃이 층층이 걸려 있다. 클라이언트가 504를 받았는데도 백엔드 작업이 중복 실행되는 사고를 막는 설계 원칙은?

Q8

[심화] 다른 경로는 모두 인증이 걸려 정상인데, 급히 추가한 라우트 하나만 인증 없이 외부 IP에서 매일 수천 건씩 데이터를 내려받고 있었다. 에러율·지연 지표는 내내 정상이었다. 원인 확정을 위해 가장 먼저 확인할 것은?

0 / 8 답변

🧪 실습으로 확인하기

GCP Compute Engine 인스턴스 생성 및 SSH 접속

초급

Google Cloud Console과 gcloud CLI로 VM 인스턴스를 생성하고, SSH 접속·파일 전송·방화벽 규칙 설정까지 GCP 기본 흐름을 익힌다.

45📋 5단계💻 직접 환경
실습 시작하기 →

이것도 배워보세요