목차
API Gateway 란?
최근 서비스는 마이크로서비스 아키텍처 형태로 독립적인 기능을 수행하는 작은 단위의 서비스로 나누어 개발하고 있습니다.
작은 단위의 서비스로 분리함에 따라 서비스의 복잡도를 줄일 수 있으며, 변경에 따른 영향도를 최소화하면서 개발과 배포를 할 수 있다는 장점이 있습니다.
하지만, 여러 서비스의 엔드포인트를 관리해야 하는 어려움이 있으며 각 서비스의 API에서 공통적으로 필요한 기능을 중복으로 개발해야 하는 문제가 있습니다.
API Gateway를 이용하면 통합적으로 엔드포인트와 REST API를 관리 할 수 있습니다.
모든 클라이언트는 각 서비스의 엔드포인트 대신 API Gateway로 요청을 전달합니다.
API Gateway는 사용자가 설정한 라우팅 설정에 따라 각 엔드포인트로 클라이언트를 대리하여 요청하고 응답을 받으면 다시 클라이언트에게 전달하는 프록시 역할을 합니다.
그뿐만 아니라 API Gateway는 엔드포인트 서버에서 공통으로 필요한 인증/인가, 사용량 제어, 요청/응답 변조등의 기능을 플러그인 형태로 제공하고 있습니다.
플러그인을 사용하면 각 엔드포인트 API 서버가 구현하지 않아도 되기 때문에 개발자 입장에서는 개발 비용을 줄일 수 있습니다.
TOAST API Gateway 살펴보기
TOAST API Gateway는 크게 2가지 개념으로 엔드포인트를 관리하고 있습니다.
- 도메인(Domain): 도메인은 하나의 엔드포인트 서비스를 관리하기 위한 개념입니다. 도메인은 도메인 키와 엔드포인트 정보를 설정할 수 있습니다. 도메인 키는 각 엔드포인트를 구분하여 라우팅하기 위한 키 값으로 이용됩니다.
- 엔드포인트(Endpoint): 엔드포인트에서 제공하는 REST API를 관리하는 역할을 합니다.
API Gateway 생성하기
예시: 블로그 서비스
다음과 같이 블로그 서비스는 3개의 엔드포인트로 서비스 구성되고 있다고 가정합니다.
- account : 블로그 사용자들의 계정 정보를 관리하는 서비스
- post : 블로그 글을 관리하는 서비스
- storage: 포스트의 첨부파일(이미지, 도큐먼트 파일 등)을 관리하는 서비스
blog-account 도메인 생성
API Gateway를 생성하기 위해서는 가장 먼저 도메인을 생성해야 합니다. 3개의 서비스 중 account 서비스의 도메인 생성 예제입니다.
- 도메인 키는 blog-account 로 설정합니다.
- 엔드포인트 서버 URL은 사용자의 REST API 서버의 주소 http://account.toast-blog.com로 설정합니다.
API Gateway에서 제공되는 도메인 주소인 https://api-gw.cloud.toast.com/blog-account 로 통해 요청하면 엔드포인트 http://account.toast-blog.com 으로 요청이 포워딩 됩니다. - 엔드포인트(http://account.toast-blog.com )는 http 프로토콜로 서비스가 되지만, API Gateway의 스킴 설정을 통해 https 프로토콜을 통해 클라이언트의 요청을 전달받을 수 있습니다.
blog-account 엔드포인트 생성
엔드포인트를 생성하여 API Gateway를 통해 제공할 REST API를 설정합니다.
- 다음과 같이 경로는 Ant Pattern 형식으로도 입력이 가능합니다.
- /accounts/{account-id}
- /accounts/*
- /accounts/**
- {account-id}의 사용자 정보를 조회하는 API는 다음과 같이 호출할 수 있습니다.
blog-account 배포
- 도메인과 엔드포인트 설정을 완료하면, 배포를 하여 서비스에 적용할 수 있습니다.
플러그인
API Gateway가 클라이언트로 부터 요청을 전달받으면 설정된 플러그인의 속성 그룹 순서대로 플러그인이 동작합니다.
- Access Control 에서 제한된 사용자의 요청, 사용 제한 초과 시 요청을 거부합니다.
- Authentification 에서 인증되지 않은 요청, 변조된 요청에 대해 요청을 거부합니다.
- Custom 에서 요청/응답에 대한 메시지 변조를 하거나 사용자 정의 응답을 정의할 수 있습니다.
- Proxy 에서 사용자의 API 서버로 요청을 포워딩하고 응답 값을 전달받아 요청자에게 전달합니다.
Access Control
IP ACL
- 특정 클라이언트만 요청을 허용할 수 있도록 블랙/화이트리스트 방식의 IP 접근 제어 기능을 제공합니다.
사용량 제한(Usage Limit)
- 단위 시간(초 단위) 동안 호출 가능한 횟수만큼만 클라이언트가 API를 호출할 수 있도록 설정할 수 있습니다.
- QoS(Quality of Service) 또는 엔드포인트 서버의 보호 목적으로 API 사용량을 제어할 수 있습니다.
CORS(Cross-Origin Resource Sharing)
- 동일 출처 정책(Same Origin Policy)에 의해 브라우저에서는 다른 도메인의 리소스를 요청할 경우 보안 문제를 발생시킵니다. 이를 우회하기 위해서는 CORS 규약에 의해 웹 브라우저와 서버 간 정의된 헤더와 함께 요청과 응답 주고 받아야 합니다. CORS 플러그인을 사용하면 엔드포인트에서 구현하지 않아도 되며, 변경이 발생하는 경우에도 쉽게 설정을 변경할 수 있습니다.
Authentication
사전 호출 API (Pre-call API)
- API Gateway가 클라이언트의 요청을 엔드포인트로 포워딩하기 전, 설정한 사전 호출 API를 호출합니다.
사전 호출 API의 응답 HTTP Status Code가 200 OK가 아닌 경우 요청을 거부합니다. - 사전 호출 API를 통해 사용자 정의 형식의 인증을 처리할 수 있습니다. (예: 세션 토큰의 유효성 검사)
HMAC, JWT
- 클라이언트의 요청이 중간에 변조되진 않았는지 무결성을 검증합니다.
- HMAC 또는 JWT 플러그인에서 비밀키를 설정합니다.
- 클라이언트는 비밀키를 이용하여 요청정보의 해시 값을 생성하여 요청 헤더에 추가하여 API Gateway로 요청을 전달합니다.
- API Gateway는 클라이언트의 요청 정보와 사용자가 설정한 비밀키를 이용하여 해시 값을 생성합니다.
- 클라이언트가 전송한 해시 값과 API Gateway가 생성한 해키 값이 일치하지 않은경우, 무결성이 보장되지 않은 것으로 보아 요청을 거부합니다.
Custom Plugin
Modify Header
- 엔드포인트 서버로 전달되는 요청의 헤더값을 변조하여 엔드포인트로 요청할 수 있습니다.
- 클라이언트로 전달되는 응답의 헤더값을 변조하여 클라이언트에 응답을 전달 할 수 있습니다.
URL Rewrite
- 클라이언트의 요청 URL을 변조하여 사용자의 엔드포인트 서버 URL로 요청을 포워딩할 수 있습니다.
사용자 정의 응답 (User-defined Response)
- 사용자가 정의한 응답 헤더와 본문(Body)을 응답하도록 설정합니다.
통계
API Gateway 콘솔> Dashboard 에서 각 도메인별 API 통계를 확인할 수 있습니다.
API 호출 성공 수(HTTP 400미만), 실패 수(HTTP 4XX, 5XX) 그리고 평균 응답시간(ms)과 아웃바운드 네트워크 트래픽를 확인할 수 있습니다.
통계를 통해 특정 엔드포인트의 REST API의 이상 동작이나 품질을 쉽게 확인할 수 있습니다.
출처
https://meetup.toast.com/posts/201
'Back-end > API' 카테고리의 다른 글
API와 ENDPOINT란? (0) | 2022.04.06 |
---|---|
REST / REST API / RESTful API 개념 (0) | 2022.01.21 |