[IT 잡썰] API GateWay 기본 기능

API Gateway를 직접 설계하여 간단하게 구현하려면, 기본적으로 각 마이크로서비스에 대한 요청을 관리하고, 인증 및 로깅, 라우팅을 처리할 수 있는 구조로 설계해야 합니다. 다음은 API Gateway의 주요 기능과 이를 기반으로 한 설계 방안입니다.

핵심 기능 정의

API Gateway는 여러 마이크로서비스를 하나의 진입점으로 묶어주는 역할을 합니다. 이를 위해 아래와 같은 기능들을 제공해야 합니다.

  • 요청 라우팅 : 클라이언트의 요청을 받아 각 마이크로서비스로 전달합니다. URI 경로 또는 요청 헤더에 따라 적절한 서비스로 요청을 라우팅합니다.
  • 인증 및 권한 관리 : API Gateway는 중앙에서 인증과 권한 관리를 처리합니다. 예를 들어, OAuth2, JWT(JSON Web Token)를 사용하여 클라이언트 인증을 수행할 수 있습니다.
  • 로깅 및 모니터링 : API 호출에 대한 로그를 남기고, 요청 시간, 상태 코드, 응답 시간 등의 메트릭을 기록하여 모니터링할 수 있습니다.
  • 로드 밸런싱 : 동일한 마이크로서비스의 여러 인스턴스가 있을 경우, API Gateway는 트래픽을 적절히 분배하여 서버 부하를 최소화할 수 있습니다.
  • API Rate Limiting & Caching : 사용자가 일정 시간 내에 너무 많은 요청을 보내지 않도록 제한하는 기능(Rate Limiting)과 자주 사용되는 응답을 캐시(Cache)하여 성능을 개선합니다.

설계 단계

간단한 API Gateway를 직접 설계할 때 필요한 구성 요소와 구현 방안을 살펴보겠습니다.

기본 아키텍처

API Gateway는 클라이언트와 마이크로서비스 간의 중간 계층으로, 각 요청을 받아서 올바른 마이크로서비스에 전달하는 역할을 합니다. 기본적인 흐름은 다음과 같습니다:

  • 클라이언트API Gateway각 마이크로서비스

요청 라우팅 구현

  • 프록시 패턴: 요청 라우팅을 구현하기 위해 프록시 서버를 설계합니다. 각 경로에 따라 특정 마이크로서비스로 요청을 전달합니다.
  • 예를 들어, http://api.example.com/users로 들어오는 요청은 User Service로 전달되고, http://api.example.com/ordersOrder Service로 전달됩니다.
  • 이를 위해 Reverse Proxy를 구현할 수 있습니다. Reverse Proxy는 클라이언트의 요청을 받아 내부 서버로 전달하는 방식입니다.
const express = require('express');
const app = express();
const request = require('request');

// 유저 서비스로 라우팅
app.use('/users', (req, res) => {
  const url = `http://user-service:3001${req.originalUrl}`;
  req.pipe(request(url)).pipe(res);
});

// 주문 서비스로 라우팅
app.use('/orders', (req, res) => {
  const url = `http://order-service:3002${req.originalUrl}`;
  req.pipe(request(url)).pipe(res);
});

app.listen(3000, () => {
  console.log('API Gateway listening on port 3000');
});

인증 및 권한 관리

API Gateway 에서는 인증 기능을 제공하여 각 요청이 마이크로서비스에 전달되기 전에 유요한 요청인지 확인해야 합니다.

  • 인증 및 인가: OAuth2, JWT 같은 표준 인증 방식을 지원하고, API Gateway에서 인증을 처리하여 마이크로서비스가 인증 관련 로직을 처리하지 않도록 해야 합니다.
  • IP 필터링 및 접근 제어: IP 기반 필터링과 API Key를 사용한 접근 제어를 통해 보안을 강화할 수 있습니다.
  • SSL/TLS 암호화: 모든 클라이언트 요청과 응답은 HTTPS를 사용해 암호화하고, SSL/TLS 인증서를 자동 갱신할 수 있는 시스템도 필요합니다.
  • 미들웨어 방식으로 인증 로직을 추가하여 각 요청이 마이크로서비스에 전달되기 전에 인증을 확인합니다.
const jwt = require('jsonwebtoken');

const authenticateJWT = (req, res, next) => {
  const token = req.header('Authorization');
  if (!token) return res.sendStatus(403); // 토큰이 없을 때

  jwt.verify(token, 'your_jwt_secret_key', (err, user) => {
    if (err) return res.sendStatus(403); // 토큰이 유효하지 않음
    req.user = user;
    next(); // 인증 성공 시 다음 단계로
  });
};

// 인증 미들웨어 적용
app.use(authenticateJWT);

로깅 및 모니터링

  • 로깅 미들웨어를 사용하여 API 요청과 응답에 대한 정보를 기록합니다. 이를 통해 API 사용 현황을 분석하고, 성능 병목을 찾을 수 있습니다.
  • 또한, 요청의 응답 시간, 상태 코드 등을 기록하는 메트릭 수집 기능을 구현합니다.

안정성 확보

API Gateway 는 MSA 에서 아주 중요한 역할을 담당하기 때문에 안정성을 확보하는 것이 매우 중요합니다. 아래는 그러한 안정성을 확보하기 위한 방법들에 대한 설명입니다.

로드 밸런서 사용
여러 API Gateway 인스턴스를 로드 밸런서 뒤에 두어 트래픽을 분산시키고, 특정 인스턴스가 장애가 발생하면 자동으로 다른 인스턴스로 트래픽을 전달할 수 있습니다. 일반적으로 AWS Elastic Load Balancer(ELB)나 Nginx, HAProxy 같은 소프트웨어 로드 밸런서를 활용합니다.

수평 확장(스케일 아웃)
API Gateway의 인스턴스를 여러 대로 확장하여 각 인스턴스가 동일한 서비스를 제공하도록 설정합니다. 이를 통해 특정 인스턴스에 장애가 발생하더라도 전체 서비스가 중단되지 않습니다. 클라우드 환경에서는 일반적으로 오토 스케일링 그룹(ASG)을 사용해 인스턴스의 수를 동적으로 조절할 수 있습니다.

DNS 기반의 부하 분산
DNS 라운드 로빈(Round Robin)이나 지리적 분산을 통해 각 API Gateway 인스턴스에 분산된 트래픽을 라우팅하는 방법입니다. 여러 지역에 API Gateway를 배포하여 사용자 요청을 가장 가까운 인스턴스로 전달해 지연을 줄이고, 장애 발생 시 다른 지역의 인스턴스로 라우팅할 수 있습니다.

API Gateway 자체의 멀티 리전 설정
클라우드 제공업체의 API Gateway 서비스를 사용할 경우 멀티 리전 지원을 통해 다중 리전에 배포하고, 각 리전에서 트래픽을 처리할 수 있도록 설정하는 방법입니다. 예를 들어, AWS API Gateway는 멀티 리전 배포를 지원하여 특정 리전에서 장애가 발생하면 다른 리전으로 트래픽을 넘길 수 있습니다.

캐싱 및 장애 복구 설정
캐시를 통해 반복되는 요청에 대한 응답을 빠르게 제공하여 API Gateway에 대한 부하를 줄이고, 장애 발생 시 캐시된 응답으로 트래픽을 처리할 수 있습니다. 추가적으로, AWS Lambda나 서버리스 함수와 연계해 장애 시 자동으로 복구 작업을 수행하는 방식을 사용할 수도 있습니다.

Rate Limiting 및 Caching

  • Rate Limiting은 일정 시간 동안의 요청 수를 제한하여 서버가 과부하되지 않도록 보호합니다. 이를 위해 express-rate-limit과 같은 라이브러리를 사용할 수 있습니다.
  • 캐싱은 자주 요청되는 데이터를 메모리에 저장하여 성능을 개선합니다.
const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15분
  max: 100 // 15분 동안 최대 100번 요청 허용
});

// 모든 라우터에 rate limiter 적용
app.use(limiter);

기능 확장

기본적인 API Gateway가 동작하면, 향후 요구에 따라 추가 기능을 설계할 수 있습니다:

  • Circuit Breaker 패턴: 마이크로서비스 장애 시 시스템 전체에 영향을 미치지 않도록 보호하는 패턴.
  • OAuth 통합: 외부 인증 서비스를 연동하여 보안을 강화.
  • API 버전 관리: 새로운 API 버전을 지원하고 구버전 API의 관리 및 마이그레이션을 처리.

종합 설계 방안

  • 컨테이너화: Docker를 사용하여 API Gateway 자체도 컨테이너로 패키징하고 Kubernetes 같은 오케스트레이션 도구를 통해 관리할 수 있습니다.
  • 라우팅과 로드 밸런싱: HTTP 요청을 적절히 라우팅하고, 여러 마이크로서비스 인스턴스로 트래픽을 분배합니다.
  • 인증 및 권한 부여: JWT 기반 인증을 통해 모든 요청을 인증하고, 보안성을 강화합니다.
  • 모니터링 및 로깅: 모든 API 요청을 기록하고, 성능을 모니터링하는 기능을 추가합니다.
  • Rate Limiting과 캐싱: API Gateway에 Rate Limiting 및 캐싱 기능을 추가하여 서버 부하를 줄이고, 성능을 최적화합니다.

이러한 구조를 통해 간단하지만 기능적인 API Gateway를 구축할 수 있습니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다