API Gateway 완벽 가이드: 개념부터 실전 구축까지

dongdorrong·2025년 6월 28일
0

DevOps

목록 보기
7/7

1. API Gateway란 무엇인가?

1.1 API Gateway의 정의

API Gateway는 클라이언트와 백엔드 서비스 사이에 위치하는 중간 계층으로, 모든 API 요청의 진입점 역할을 합니다. 마이크로서비스 아키텍처에서 특히 중요한 역할을 하며, 여러 개의 독립적인 서비스들을 하나의 통합된 API로 제공하는 관문 역할을 합니다.

1.2 API Gateway의 핵심 기능

  • 라우팅: 클라이언트 요청을 적절한 백엔드 서비스로 전달
  • 인증 및 권한 부여: 보안 정책 적용 및 사용자 검증
  • 요청/응답 변환: 프로토콜 변환 및 데이터 포맷 조정
  • 로드 밸런싱: 트래픽을 여러 서비스 인스턴스에 분산
  • API 버전 관리: 다양한 API 버전 지원
  • 모니터링 및 로깅: API 사용량 추적 및 성능 모니터링
  • 캐싱: 응답 데이터 캐싱으로 성능 향상

1.3 API Gateway의 필요성

마이크로서비스 아키텍처의 복잡성 해결

  • 여러 서비스의 엔드포인트를 하나로 통합
  • 서비스 간 통신의 복잡성 감소
  • 횡단 관심사(Cross-cutting concerns) 중앙화

보안 강화

  • 중앙집중식 보안 정책 적용
  • 백엔드 서비스 노출 최소화
  • SSL/TLS 터미네이션

2. 주요 API Gateway 솔루션 비교

2.1 AWS API Gateway

특징

  • 완전 관리형 서비스: 서버 관리 불필요
  • 서버리스 통합: Lambda 함수와 완벽 연동
  • 자동 스케일링: 트래픽에 따른 자동 확장/축소

인프라 구성 방법

# serverless.yml 예시 (Serverless Framework 사용)
service: my-api-gateway

provider:
  name: aws
  runtime: nodejs18.x
  region: ap-northeast-2

functions:
  getUsers:
    handler: handlers/users.get
    events:
      - http:
          path: users
          method: get
          cors: true
          authorizer:
            name: authenticate
            resultTtlInSeconds: 300

  createUser:
    handler: handlers/users.create
    events:
      - http:
          path: users
          method: post
          cors: true

resources:
  Resources:
    GatewayResponseDefault4XX:
      Type: 'AWS::ApiGateway::GatewayResponse'
      Properties:
        ResponseParameters:
          gatewayresponse.header.Access-Control-Allow-Origin: "'*'"
        ResponseType: DEFAULT_4XX
        RestApiId: !Ref RestApi

Terraform을 이용한 구성

resource "aws_api_gateway_rest_api" "example" {
  name        = "example-api"
  description = "Example API Gateway"
}

resource "aws_api_gateway_resource" "users" {
  rest_api_id = aws_api_gateway_rest_api.example.id
  parent_id   = aws_api_gateway_rest_api.example.root_resource_id
  path_part   = "users"
}

resource "aws_api_gateway_method" "users_get" {
  rest_api_id   = aws_api_gateway_rest_api.example.id
  resource_id   = aws_api_gateway_resource.users.id
  http_method   = "GET"
  authorization = "AWS_IAM"
}

resource "aws_api_gateway_integration" "users_lambda" {
  rest_api_id = aws_api_gateway_rest_api.example.id
  resource_id = aws_api_gateway_resource.users.id
  http_method = aws_api_gateway_method.users_get.http_method

  integration_http_method = "POST"
  type                   = "AWS_PROXY"
  uri                    = aws_lambda_function.users.invoke_arn
}

장점

  • AWS 생태계와의 완벽한 통합
  • 관리 오버헤드 최소화
  • 높은 가용성과 보안
  • 다양한 인증 방식 지원

단점

  • AWS 종속성
  • 복잡한 요금 구조
  • 커스터마이징 제한

2.2 Kong Gateway

특징

  • 오픈소스 기반: 유연한 커스터마이징 가능
  • 플러그인 아키텍처: 풍부한 플러그인 생태계
  • 다중 환경 지원: 온프레미스, 클라우드, 하이브리드

Docker Compose를 이용한 구성

version: '3.8'

services:
  kong-database:
    image: postgres:13
    environment:
      POSTGRES_USER: kong
      POSTGRES_PASSWORD: kongpass
      POSTGRES_DB: kong
    volumes:
      - kong_data:/var/lib/postgresql/data
    networks:
      - kong-net

  kong-migrations:
    image: kong:3.4
    command: kong migrations bootstrap
    depends_on:
      - kong-database
    environment:
      KONG_DATABASE: postgres
      KONG_PG_HOST: kong-database
      KONG_PG_USER: kong
      KONG_PG_PASSWORD: kongpass
    networks:
      - kong-net

  kong:
    image: kong:3.4
    depends_on:
      - kong-migrations
    environment:
      KONG_DATABASE: postgres
      KONG_PG_HOST: kong-database
      KONG_PG_USER: kong
      KONG_PG_PASSWORD: kongpass
      KONG_PROXY_ACCESS_LOG: /dev/stdout
      KONG_ADMIN_ACCESS_LOG: /dev/stdout
      KONG_PROXY_ERROR_LOG: /dev/stderr
      KONG_ADMIN_ERROR_LOG: /dev/stderr
      KONG_ADMIN_LISTEN: 0.0.0.0:8001
    ports:
      - "8000:8000"  # Proxy port
      - "8443:8443"  # Proxy SSL port
      - "8001:8001"  # Admin API port
    networks:
      - kong-net

  konga:
    image: pantsel/konga:latest
    depends_on:
      - kong
    environment:
      NODE_ENV: production
    ports:
      - "1337:1337"
    networks:
      - kong-net

volumes:
  kong_data:

networks:
  kong-net:

Kubernetes를 이용한 구성

apiVersion: v1
kind: Namespace
metadata:
  name: kong
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kong
  namespace: kong
spec:
  replicas: 2
  selector:
    matchLabels:
      app: kong
  template:
    metadata:
      labels:
        app: kong
    spec:
      containers:
      - name: kong
        image: kong:3.4
        env:
        - name: KONG_DATABASE
          value: "off"
        - name: KONG_DECLARATIVE_CONFIG
          value: "/kong/declarative/kong.yml"
        - name: KONG_PROXY_ACCESS_LOG
          value: "/dev/stdout"
        - name: KONG_ADMIN_ACCESS_LOG
          value: "/dev/stdout"
        - name: KONG_PROXY_ERROR_LOG
          value: "/dev/stderr"
        - name: KONG_ADMIN_ERROR_LOG
          value: "/dev/stderr"
        - name: KONG_ADMIN_LISTEN
          value: "0.0.0.0:8001"
        ports:
        - containerPort: 8000
        - containerPort: 8443
        - containerPort: 8001
        volumeMounts:
        - name: kong-config
          mountPath: /kong/declarative/
      volumes:
      - name: kong-config
        configMap:
          name: kong-declarative-config
---
apiVersion: v1
kind: Service
metadata:
  name: kong-proxy
  namespace: kong
spec:
  type: LoadBalancer
  ports:
  - name: proxy
    port: 80
    targetPort: 8000
  - name: proxy-ssl
    port: 443
    targetPort: 8443
  selector:
    app: kong

장점

  • 높은 성능과 확장성
  • 풍부한 플러그인 생태계
  • 멀티 클라우드 지원
  • 강력한 개발자 포털

단점

  • 관리 복잡성
  • 학습 곡선
  • 엔터프라이즈 기능은 유료

2.3 Istio

특징

  • 서비스 메시: 서비스 간 통신 제어
  • 사이드카 패턴: Envoy 프록시 기반
  • 관찰 가능성: 메트릭, 로깅, 분산 추적

Kubernetes 환경에서의 구성

# istio-gateway.yaml
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: api-gateway
  namespace: default
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - api.example.com
  - port:
      number: 443
      name: https
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: api-tls-secret
    hosts:
    - api.example.com
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: api-routes
  namespace: default
spec:
  hosts:
  - api.example.com
  gateways:
  - api-gateway
  http:
  - match:
    - uri:
        prefix: /users
    route:
    - destination:
        host: user-service
        port:
          number: 8080
    fault:
      delay:
        percentage:
          value: 0.1
        fixedDelay: 5s
  - match:
    - uri:
        prefix: /orders
    route:
    - destination:
        host: order-service
        port:
          number: 8080
      weight: 90
    - destination:
        host: order-service-v2
        port:
          number: 8080
      weight: 10

보안 정책 설정

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: api-authz
  namespace: default
spec:
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/default/sa/api-client"]
    to:
    - operation:
        methods: ["GET", "POST"]
    when:
    - key: request.headers[version]
      values: ["v1", "v2"]

장점

  • 서비스 메시 통합
  • 강력한 트래픽 관리
  • 높은 보안성
  • 관찰 가능성 내장

단점

  • 높은 복잡성
  • 리소스 오버헤드
  • 학습 곡선이 가파름

3. 솔루션별 상세 비교

3.1 성능 비교

항목AWS API GatewayKong GatewayIstio
지연시간낮음-중간매우 낮음낮음
처리량높음매우 높음높음
메모리 사용량N/A (관리형)중간높음
CPU 사용량N/A (관리형)낮음중간

3.2 기능 비교

기능AWS API GatewayKong GatewayIstio
인증/권한부여✅ 완전 지원✅ 완전 지원✅ 완전 지원
로드 밸런싱✅ 지원✅ 완전 지원✅ 고급 지원
API 버전 관리✅ 지원✅ 지원✅ 지원
모니터링✅ CloudWatch✅ 다양한 옵션✅ Prometheus
캐싱✅ 지원✅ 플러그인✅ 지원
요청 변환✅ 지원✅ 완전 지원✅ 지원
서비스 디스커버리✅ AWS 통합✅ 다양한 백엔드✅ Kubernetes 통합

3.3 비용 비교

AWS API Gateway

  • 요청당 과금 ($3.50/백만 요청)
  • 데이터 전송 비용
  • 캐싱 사용 시 추가 비용

Kong Gateway

  • 오픈소스: 무료 (운영 비용만)
  • Enterprise: 라이선스 비용 + 운영 비용
  • 인프라 비용 (서버, 로드밸런서 등)

Istio

  • 오픈소스: 무료
  • 높은 리소스 사용량으로 인한 인프라 비용 증가
  • 전문 인력 필요로 인한 인건비

3.4 커뮤니티 크기 및 생태계

AWS API Gateway

  • GitHub Stars: N/A (프로프라이어터리)
  • 커뮤니티: 대규모 AWS 커뮤니티
  • 문서: 매우 충실
  • 서드파티 도구: 풍부한 AWS 생태계

Kong Gateway

  • GitHub Stars: 35,000+ (Kong/kong)
  • 커뮤니티: 활발한 오픈소스 커뮤니티
  • 플러그인: 200+ 공식/커뮤니티 플러그인
  • 기업 채택: Netflix, Expedia, NASA 등

Istio

  • GitHub Stars: 34,000+ (istio/istio)
  • 커뮤니티: CNCF 프로젝트로 대규모 커뮤니티
  • 기업 지원: Google, IBM, Lyft 등
  • 생태계: Kubernetes 네이티브 도구들과 완벽 통합

4. 선택 기준 및 권장사항

4.1 AWS API Gateway를 선택해야 하는 경우

  • AWS 클라우드 네이티브 애플리케이션
  • 서버리스 아키텍처 (Lambda 중심)
  • 관리 오버헤드 최소화가 중요한 경우
  • 빠른 프로토타이핑이 필요한 경우

4.2 Kong Gateway를 선택해야 하는 경우

  • 높은 성능이 요구되는 환경
  • 멀티 클라우드 또는 하이브리드 환경
  • 커스터마이징이 중요한 경우
  • 기존 인프라와의 통합이 필요한 경우

4.3 Istio를 선택해야 하는 경우

  • Kubernetes 네이티브 환경
  • 서비스 메시가 필요한 복잡한 마이크로서비스
  • 강력한 보안 요구사항
  • 상세한 관찰 가능성이 필요한 경우

5. 모범 사례 및 주의사항

5.1 공통 모범 사례

보안

# 보안 헤더 설정 예시
response:
  headers:
    - name: "X-Content-Type-Options"
      value: "nosniff"
    - name: "X-Frame-Options"
      value: "DENY"
    - name: "X-XSS-Protection"
      value: "1; mode=block"

모니터링

  • 응답 시간, 에러율, 처리량 모니터링
  • 알림 설정으로 신속한 문제 대응
  • 로그 집계 및 분석 시스템 구축

API 설계

  • RESTful 원칙 준수
  • 적절한 HTTP 상태 코드 사용
  • API 버전 관리 전략 수립
  • 응답 포맷 표준화

5.2 주의사항

단일 장애점 방지

  • API Gateway 고가용성 구성
  • 다중 리전 배포 고려
  • 장애 복구 계획 수립

성능 최적화

  • 적절한 캐싱 전략 수립
  • 불필요한 미들웨어 제거
  • 백엔드 서비스 최적화

보안 강화

  • 정기적인 보안 감사
  • 최소 권한 원칙 적용
  • 비밀 정보 안전한 관리

6. 실습 예제: 간단한 API Gateway 구축

6.1 Kong Gateway 실습

1단계: Docker로 Kong 실행

# 네트워크 생성
docker network create kong-net

# PostgreSQL 데이터베이스 실행
docker run -d --name kong-database \
  --network=kong-net \
  -p 5432:5432 \
  -e "POSTGRES_USER=kong" \
  -e "POSTGRES_DB=kong" \
  -e "POSTGRES_PASSWORD=kongpass" \
  postgres:13

# Kong 마이그레이션 실행
docker run --rm --network=kong-net \
  -e "KONG_DATABASE=postgres" \
  -e "KONG_PG_HOST=kong-database" \
  -e "KONG_PG_USER=kong" \
  -e "KONG_PG_PASSWORD=kongpass" \
  kong:3.4 kong migrations bootstrap

# Kong 실행
docker run -d --name kong \
  --network=kong-net \
  -e "KONG_DATABASE=postgres" \
  -e "KONG_PG_HOST=kong-database" \
  -e "KONG_PG_USER=kong" \
  -e "KONG_PG_PASSWORD=kongpass" \
  -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
  -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
  -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
  -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
  -e "KONG_ADMIN_LISTEN=0.0.0.0:8001" \
  -p 8000:8000 \
  -p 8443:8443 \
  -p 8001:8001 \
  kong:3.4

2단계: 서비스 및 라우트 등록

# 백엔드 서비스 등록
curl -i -X POST http://localhost:8001/services/ \
  --data "name=example-service" \
  --data "url=http://httpbin.org"

# 라우트 등록
curl -i -X POST http://localhost:8001/services/example-service/routes \
  --data "hosts[]=example.com"

# 테스트
curl -i -X GET http://localhost:8000/get \
  --header "Host: example.com"

6.2 AWS API Gateway 실습 (AWS CLI 사용)

# API 생성
aws apigateway create-rest-api \
  --name "example-api" \
  --description "Example API Gateway"

# 리소스 생성
aws apigateway create-resource \
  --rest-api-id {api-id} \
  --parent-id {root-resource-id} \
  --path-part "users"

# 메서드 생성
aws apigateway put-method \
  --rest-api-id {api-id} \
  --resource-id {resource-id} \
  --http-method GET \
  --authorization-type NONE

# 통합 설정
aws apigateway put-integration \
  --rest-api-id {api-id} \
  --resource-id {resource-id} \
  --http-method GET \
  --type HTTP \
  --integration-http-method GET \
  --uri "http://httpbin.org/get"

# 배포
aws apigateway create-deployment \
  --rest-api-id {api-id} \
  --stage-name prod

7. 성능 최적화 및 모니터링

7.1 성능 최적화 전략

캐싱 전략

  • 정적 응답 캐싱
  • 동적 응답의 부분 캐싱
  • 캐시 무효화 정책

연결 풀링

# Kong 연결 풀 설정 예시
upstream:
  healthchecks:
    active:
      http_path: "/health"
      healthy:
        interval: 10
        successes: 3
      unhealthy:
        interval: 10
        http_failures: 3

요청 제한

# Rate Limiting 플러그인 설정
plugins:
- name: rate-limiting
  config:
    minute: 100
    hour: 1000
    policy: local

7.2 모니터링 및 알림

주요 메트릭

  • 응답 시간 (평균, P95, P99)
  • 처리량 (RPS)
  • 에러율 (4xx, 5xx)
  • 업스트림 서비스 상태

Grafana 대시보드 예시

{
  "dashboard": {
    "title": "API Gateway Metrics",
    "panels": [
      {
        "title": "Request Rate",
        "type": "graph",
        "targets": [
          {
            "expr": "sum(rate(kong_http_requests_total[5m]))",
            "legendFormat": "Total Requests/sec"
          }
        ]
      },
      {
        "title": "Response Time",
        "type": "graph",
        "targets": [
          {
            "expr": "histogram_quantile(0.95, sum(rate(kong_request_duration_ms_bucket[5m])) by (le))",
            "legendFormat": "95th percentile"
          }
        ]
      }
    ]
  }
}

8. 보안 강화 방안

8.1 인증 및 권한 부여

JWT 인증 예시 (Kong)

# JWT 플러그인 활성화
curl -X POST http://localhost:8001/services/example-service/plugins \
  --data "name=jwt"

# Consumer 생성
curl -X POST http://localhost:8001/consumers \
  --data "username=testuser"

# JWT 자격 증명 생성
curl -X POST http://localhost:8001/consumers/testuser/jwt \
  --data "key=a36c3049b36249a3c9f8891cb127243c" \
  --data "secret=e71829c351aa4242c2719cbfbe671c09"

OAuth 2.0 설정 (AWS API Gateway)

{
  "authorizerUri": "arn:aws:apigateway:region:lambda:path/2015-03-31/functions/function-arn/invocations",
  "authorizerCredentials": "arn:aws:iam::account-id:role/role-name",
  "authorizerResultTtlInSeconds": 300,
  "identitySource": "method.request.header.Authorization",
  "type": "TOKEN"
}

8.2 API 보안 모범 사례

입력 검증

# Kong Request Validation 플러그인
plugins:
- name: request-validator
  config:
    version: draft4
    body_schema: |
      {
        "type": "object",
        "properties": {
          "name": {"type": "string"},
          "email": {"type": "string", "format": "email"}
        },
        "required": ["name", "email"]
      }

CORS 설정

# CORS 플러그인 설정
plugins:
- name: cors
  config:
    origins:
    - "https://myapp.com"
    methods:
    - GET
    - POST
    headers:
    - Accept
    - Content-Type
    - Authorization
    exposed_headers:
    - X-Auth-Token
    max_age: 3600
    credentials: true

9. 트러블슈팅 가이드

9.1 일반적인 문제들

높은 지연시간 문제

  • 업스트림 서비스 응답 시간 확인
  • 네트워크 연결 상태 점검
  • 캐싱 설정 검토
  • 로드 밸런싱 알고리즘 최적화

인증 실패 문제

  • 토큰 만료 시간 확인
  • 인증 서버 상태 점검
  • CORS 설정 검토
  • 로그 분석을 통한 오류 원인 파악

성능 저하 문제

# Kong 성능 모니터링
curl -s http://localhost:8001/status | jq

# 연결 상태 확인
curl -s http://localhost:8001/services/example-service/health

# 업스트림 타겟 확인
curl -s http://localhost:8001/upstreams/example-upstream/targets

9.2 로그 분석

구조화된 로깅

{
  "timestamp": "2024-01-15T10:30:00Z",
  "level": "INFO",
  "service": "api-gateway",
  "method": "GET",
  "path": "/api/users",
  "status": 200,
  "duration": 150,
  "user_id": "user123",
  "correlation_id": "req-abc123"
}

로그 집계 및 분석

# Fluentd 설정 예시
<source>
  @type tail
  tag kong.access
  path /var/log/kong/access.log
  pos_file /var/log/fluentd/kong-access.log.pos
  format json
</source>

<match kong.access>
  @type elasticsearch
  host elasticsearch.example.com
  port 9200
  index_name kong-logs
</match>

10. 미래 전망 및 발전 방향

10.1 기술 트렌드

서버리스 통합

  • Function-as-a-Service (FaaS) 완전 통합
  • 이벤트 기반 아키텍처 지원
  • 자동 스케일링 및 최적화

AI/ML 통합

  • 지능형 라우팅
  • 예측적 스케일링
  • 자동 이상 탐지

GraphQL 지원

  • GraphQL 쿼리 최적화
  • 스키마 스티칭
  • 실시간 구독 지원

10.2 업계 동향

클라우드 네이티브

  • Kubernetes 네이티브 솔루션 증가
  • 서비스 메시와의 통합 강화
  • 멀티 클라우드 전략 지원

보안 강화

  • Zero Trust 아키텍처 적용
  • 런타임 보안 통합
  • 자동화된 보안 정책 관리

결론

API Gateway는 현대적인 애플리케이션 아키텍처에서 필수적인 구성 요소입니다. 각 솔루션은 고유한 장단점을 가지고 있으며, 선택은 다음과 같은 요소들을 고려해야 합니다:

  • 프로젝트 규모와 복잡성
  • 팀의 기술적 역량
  • 예산과 리소스
  • 기존 인프라와의 호환성
  • 장기적인 확장 계획

초기 프로젝트나 빠른 개발이 필요한 경우 AWS API Gateway를, 높은 성능과 유연성이 필요한 경우 Kong Gateway를, 복잡한 마이크로서비스 환경에서는 Istio를 고려해볼 수 있습니다.

무엇보다 중요한 것은 현재 요구사항을 정확히 파악하고, 미래의 확장 가능성을 고려하여 적절한 솔루션을 선택하는 것입니다. 각 도구의 공식 문서와 커뮤니티를 적극 활용하여 최적의 구현을 달성하시기 바랍니다.


이 가이드는 2024년 기준으로 작성되었으며, 각 솔루션의 최신 버전과 기능을 반영하고 있습니다. 실제 구현 시에는 최신 문서를 참조하시기 바랍니다.

profile
DevOps 엔지니어 / 열심히 해서 잘하자

0개의 댓글