Tyk

Tyk는 강력한 오픈 소스 API 관리 플랫폼으로, 2014년 Martin Buhr에 의해 설립된 Tyk Technologies에서 개발했다. Go 언어로 작성되었으며, API 게이트웨이, 개발자 포털, API 분석 대시보드를 포함한 완전한 API 관리 솔루션을 제공한다.

Tyk의 핵심 가치는 다음과 같다:

Tyk는 크게 세 가지 버전으로 제공된다:

Tyk의 핵심 아키텍처

Tyk는 모듈식 아키텍처를 채택하고 있으며, 다음과 같은 주요 구성 요소로 이루어져 있다:

주요 구성 요소

데이터 스토리지 옵션

Tyk는 다양한 데이터 저장소를 지원한다:

트래픽 흐름

Tyk 게이트웨이를 통과하는 API 요청의 일반적인 처리 흐름은 다음과 같다:

  1. 요청 수신: 클라이언트가 Tyk 게이트웨이에 API 요청을 보낸다.
  2. URL 재작성 및 가상 엔드포인트 처리: 필요에 따라 URL을 변환한다.
  3. 인증 검사: API 키, JWT, OAuth 등 인증 메커니즘을 확인한다.
  4. 속도 제한 적용: 정책 기반 요청 제한을 적용한다.
  5. 요청 변환: 필요시 요청 헤더, 본문 등을 변환한다.
  6. 업스트림 서비스 라우팅: 요청을 적절한 백엔드 서비스로 전달합니다.
  7. 응답 처리: 백엔드 응답을 수신하고 필요시 변환합니다.
  8. 분석 데이터 수집: 요청/응답 메트릭을 수집합니다.
  9. 응답 반환: 최종 응답을 클라이언트에 반환합니다.
1
2
3
Client → [Tyk Gateway] → Backend API
         ↓         ↑
[Redis, MongoDB, Analytics]

Tyk의 핵심 기능

API 보안 기능

트래픽 관리 및 속도 제한

변환 및 미들웨어

모니터링 및 분석

개발자 포털 및 문서화

Tyk 설치 및 배포 옵션

설치 방법

Tyk는 다양한 설치 방법을 제공한다:

Docker를 이용한 설치:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Tyk Gateway 실행
docker run -d --name tyk_gateway \
  -p 8080:8080 \
  -v $(pwd)/tyk.conf:/opt/tyk-gateway/tyk.conf \
  -v $(pwd)/apps:/opt/tyk-gateway/apps \
  tykio/tyk-gateway:latest

# Tyk Dashboard 실행 (상용 버전)
docker run -d --name tyk_dashboard \
  -p 3000:3000 \
  -v $(pwd)/tyk_analytics.conf:/opt/tyk-dashboard/tyk_analytics.conf \
  tykio/tyk-dashboard:latest

Kubernetes 배포: Tyk는 Helm 차트를 제공하여 Kubernetes 환경에 쉽게 배포할 수 있다.

1
2
3
4
5
helm repo add tyk-helm https://helm.tyk.io/public/helm/charts
helm repo update
helm install tyk-pro tyk-helm/tyk-pro -n tyk \
  --set global.redis.addrs=redis:6379 \
  --set global.mongo.url=mongodb://mongodb:27017/tyk

클라우드 배포: 주요 클라우드 제공업체(AWS, Azure, GCP)에 대한 마켓플레이스 이미지와 배포 가이드를 제공한다.

구성 옵션

Tyk의 구성은 JSON 파일을 통해 이루어진다.

주요 구성 파일은 다음과 같다:

게이트웨이 구성 (tyk.conf):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
{
  "listen_port": 8080,
  "secret": "352d20ee67be67f6340b4c0605b044b7",
  "template_path": "./templates",
  "tyk_js_path": "./js/tyk.js",
  "middleware_path": "./middleware",
  "use_db_app_configs": true,
  "db_app_conf_options": {
    "connection_string": "http://dashboard:3000",
    "node_is_segmented": false,
    "tags": ["gateway"]
  },
  "app_path": "./apps/",
  "storage": {
    "type": "redis",
    "host": "redis",
    "port": 6379,
    "username": "",
    "password": "",
    "database": 0,
    "optimisation_max_idle": 2000,
    "optimisation_max_active": 4000
  },
  "enable_analytics": true,
  "analytics_config": {
    "type": "mongo",
    "csv_dir": "/tmp",
    "mongo_url": "mongodb://mongodb:27017/tyk_analytics",
    "mongo_db_name": "tyk_analytics",
    "mongo_collection": "tyk_analytics",
    "purge_delay": 100,
    "ignored_ips": []
  },
  "health_check": {
    "enable_health_checks": true,
    "health_check_value_timeouts": 60
  },
  "optimisations_use_async_session_write": true,
  "allow_master_keys": false,
  "policies": {
    "policy_source": "service",
    "policy_connection_string": "http://dashboard:3000"
  },
  "hash_keys": true,
  "suppress_redis_signal_reload": false,
  "close_connections": true,
  "enable_non_transactional_rate_limiter": true,
  "enable_sentinel_rate_limiter": false,
  "local_session_cache": {
    "disable_cached_session_state": false,
    "cached_session_timeout": 60,
    "cached_session_eviction": 10000
  }
}

대시보드 구성 (tyk_analytics.conf):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
{
  "listen_port": 3000,
  "tyk_api_config": {
    "Host": "http://gateway",
    "Port": "8080",
    "Secret": "352d20ee67be67f6340b4c0605b044b7"
  },
  "mongo_url": "mongodb://mongodb:27017/tyk_analytics",
  "page_size": 10,
  "admin_secret": "12345",
  "shared_node_secret": "352d20ee67be67f6340b4c0605b044b7",
  "redis_port": 6379,
  "redis_host": "redis",
  "redis_password": "",
  "redis_database": 0,
  "enable_cluster": false,
  "force_api_defaults": false,
  "notify_on_change": true,
  "license_key": "",
  "redis_hosts": null,
  "hash_keys": true,
  "email_backend": {
    "enable_email_notifications": false,
    "code": "sendgrid",
    "settings": {
      "ClientKey": ""
    },
    "default_from_email": "you@somewhere.com",
    "default_from_name": "Some Person"
  },
  "hide_listen_path": false,
  "sentry_code": "",
  "sentry_js_code": "",
  "use_sentry": false,
  "enable_master_keys": false,
  "enable_duplicate_slugs": false,
  "show_org_id": true,
  "host_config": {
    "enable_host_names": true,
    "generate_secure_paths": true,
    "hostname": "dashboard",
    "portal_domains": {},
    "portal_root_path": "/portal",
    "dashboard_domain": "",
    "use_strict_hostmatch": false
  },
  "http_server_options": {
    "use_ssl": false,
    "certificates": [],
    "min_version": 0
  },
  "ui": {
    "languages": {
      "Chinese": "cn",
      "English": "en",
      "Korean": "ko"
    },
    "hide_help": false,
    "default_lang": "en",
    "login_page": {},
    "nav": {},
    "uptime": {},
    "portal_section": null,
    "designer": {},
    "dont_show_admin_sockets": false,
    "dont_allow_license_management": false,
    "dont_allow_license_management_view": false
  }
}

API 정의 구성

Tyk에서 API를 정의하는 방법은 다음과 같다:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
  "name": "Sample API",
  "slug": "sample-api",
  "api_id": "123456",
  "org_id": "1",
  "use_keyless": false,
  "auth": {
    "auth_header_name": "Authorization"
  },
  "definition": {
    "location": "header",
    "key": "x-api-version"
  },
  "version_data": {
    "not_versioned": true,
    "versions": {
      "Default": {
        "name": "Default",
        "use_extended_paths": true,
        "extended_paths": {
          "ignored": [],
          "white_list": [],
          "black_list": []
        }
      }
    }
  },
  "proxy": {
    "listen_path": "/sample-api/",
    "target_url": "http://backend-service:8080/",
    "strip_listen_path": true
  },
  "active": true
}

Tyk의 고급 기능

플러그인 시스템

Tyk는 다양한 언어와 방식으로 기능을 확장할 수 있는 플러그인 시스템을 지원한다:

JavaScript 가상 미들웨어:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// sample-middleware.js
function myMiddleware(request, session, config) {
    // 요청 헤더 추가
    request.SetHeaders["X-Custom-Header"] = "Value";
    
    // 요청 본문 수정 (JSON인 경우)
    var body = JSON.parse(request.Body);
    body.additionalField = "additional value";
    request.Body = JSON.stringify(body);
    
    return request;
}

Go 네이티브 플러그인:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import (
    "net/http"
    "github.com/TykTechnologies/tyk/ctx"
    "github.com/TykTechnologies/tyk/headers"
    "github.com/TykTechnologies/tyk/user"
)

// AddFooBarHeader는 요청에 사용자 정의 헤더를 추가합니다
func AddFooBarHeader(rw http.ResponseWriter, r *http.Request) {
    // 세션 객체 가져오기
    session := ctx.GetSession(r)
    
    // 세션이 있는 경우 사용자 정의 헤더 추가
    if session != nil {
        rw.Header().Add("Foo-Bar", "Value")
    }
}

func main() {}

gRPC 플러그인: Tyk는 gRPC를 통한 외부 플러그인 통합을 지원하여 모든 언어로 작성된 플러그인을 사용할 수 있다.

API 버전 관리

Tyk는 다양한 API 버전 관리 전략을 지원한다:

URL 기반 버전 관리:

1
2
https://api.example.com/v1/resource
https://api.example.com/v2/resource

헤더 기반 버전 관리:

1
X-API-Version: 1.0

파라미터 기반 버전 관리:

1
https://api.example.com/resource?version=1.0

버전 구성 예제:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
{
  "name": "Versioned API",
  "api_id": "versioned-api",
  "definition": {
    "location": "header",
    "key": "X-API-Version"
  },
  "version_data": {
    "not_versioned": false,
    "versions": {
      "v1": {
        "name": "v1",
        "expires": "",
        "paths": {
          "ignored": [],
          "white_list": [],
          "black_list": []
        },
        "use_extended_paths": true,
        "extended_paths": {
          "ignored": [],
          "white_list": [],
          "black_list": []
        }
      },
      "v2": {
        "name": "v2",
        "expires": "",
        "override_target": "http://new-backend:8080/",
        "paths": {
          "ignored": [],
          "white_list": [],
          "black_list": []
        },
        "use_extended_paths": true,
        "extended_paths": {
          "ignored": [],
          "white_list": [],
          "black_list": []
        }
      }
    }
  }
}

동적 업스트림 방식

Tyk는 동적 업스트림 설정을 지원하여 요청 기반으로 대상 서비스를 유연하게 변경할 수 있다:

멀티 테넌시 및 조직 관리

Tyk는 다수의 테넌트와 조직을 지원하는 멀티 테넌시 기능을 제공한다:

Tyk 실제 사용 사례

엔터프라이즈 통합 사례

금융 서비스 회사:

의료 정보 교환:

마이크로서비스 아키텍처 사례

전자 상거래 플랫폼:

SaaS 제공업체:

개발자 생태계 구축 사례

통신 회사:

정부 기관:

Tyk 모범 사례 및 최적화

최적화

  1. 캐싱 전략:

    • 응답 캐싱으로 백엔드 부하 감소
    • 키 세션 캐싱으로 인증 성능 향상
    • Redis 클러스터링으로 캐시 확장
  2. 메모리 관리:

    • 적절한 Redis 구성으로 메모리 사용 최적화
    • 분석 데이터 정리 주기 조정
    • Go 가비지 컬렉션 조정
  3. 요청 처리 최적화:

    • 불필요한 미들웨어 비활성화
    • 효율적인 라우팅 규칙 설계
    • 응답 변환 최소화

8.2 고가용성 설정

  1. 다중 게이트웨이 배포:

    • 여러 지역에 게이트웨이 배포
    • 로드 밸런서를 통한 트래픽 분산
    • 자동 스케일링 그룹 구성
  2. Redis 클러스터링:

    • Redis Sentinel 또는 Redis Cluster 사용
    • 데이터 지속성 및 장애 조치 구성
    • 적절한 백업 전략 구현
  3. 데이터베이스 복제:

    • MongoDB 복제 세트 또는 PostgreSQL 스트리밍 복제 구성
    • 정기적인 백업 및 복구 테스트
    • 지연 시간을 고려한 지역 분산
  4. 재해 복구 계획:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    +----------------+      +------------------+
    | 주 데이터 센터  | <--> | 보조 데이터 센터  |
    +----------------+      +------------------+
           ^                        ^
           |                        |
    +----------------+      +------------------+
    | 로드 밸런서     | <--> | 장애 조치 시스템  |
    +----------------+      +------------------+
           ^
           |
    +----------------+
    | 클라이언트     |
    +----------------+
    

보안 강화

  1. API 키 관리:

    • 정기적인 키 순환 정책 구현
    • API 키 해싱 활성화
    • 세분화된 범위 및 권한 설정
  2. TLS 구성 최적화:

    • 최신 TLS 버전 사용 (TLS 1.3 권장)
    • 강력한 암호화 알고리즘 선택
    • 인증서 자동 갱신 구성
  3. 침입 감지 및 방지:

    • 비정상적인 트래픽 패턴 모니터링
    • 자동화된 IP 차단 규칙 구현
    • 정기적인 보안 감사 및 침투 테스트
  4. 데이터 보호:

    • 민감한 데이터 마스킹 및 필터링
    • 최소 권한 원칙 적용
    • 개인 식별 정보(PII) 처리를 위한 규정 준수 체크

모니터링 및 로깅

  1. 포괄적인 모니터링 전략:

    • 시스템 지표: CPU, 메모리, 디스크 I/O
    • 애플리케이션 지표: 요청율, 오류율, 지연 시간
    • 비즈니스 지표: API 채택률, 개발자 활동
  2. 효과적인 로깅 구성:

    • 구조화된 로그 형식(JSON) 사용
    • 중앙 집중식 로그 저장소 구현
    • 로그 보존 및 순환 정책 설정
  3. 알림 설정:

    • 다단계 알림 임계값 구성
    • 적절한 에스컬레이션 경로 설정
    • 오탐 방지를 위한 경보 튜닝
  4. 대시보드 및 시각화:

    • Grafana와 같은 도구를 사용한 맞춤형 대시보드
    • 핵심 성능 지표(KPI) 표시
    • 실시간 및 과거 데이터 분석

용어 정리

용어설명

참고 및 출처