[javascript] Express.js에서의 API 호출 제한 방법

Express.js는 Node.js 기반의 웹 애플리케이션 프레임워크로서, API 개발에 많이 사용됩니다. 하지만 무분별한 API 호출로 인해 서버 부하가 증가할 수 있으므로, API 호출을 제한하는 방법을 알아보겠습니다.

1. Rate Limiting 미들웨어 사용하기

Rate Limiting은 허용된 시간 동안의 API 호출 횟수를 제한하는 방법입니다. Express.js에서는 다양한 Rate Limiting 미들웨어를 제공합니다.

express-rate-limit

express-rate-limit 패키지는 간단하게 Rate Limiting을 구현할 수 있는 미들웨어입니다.

const rateLimit = require('express-rate-limit');

// 1분 동안 100회의 API 호출 허용
const limiter = rateLimit({
  windowMs: 1 * 60 * 1000, 
  max: 100,
});

app.use(limiter);

위의 예는 1분 동안 100회의 API 호출을 허용하는 설정입니다.

express-slow-down

express-slow-down 패키지는 일정한 속도로 API 호출을 제한하는 미들웨어입니다. 특히 Brute Force 공격 등과 같이 짧은 시간 동안 다수의 요청이 들어오는 경우 유용합니다.

const slowDown = require('express-slow-down');

// 초당 5회씩 API 호출 허용
const limiter = slowDown({
  windowMs: 1000,
  delayAfter: 1,
  delayMs: 200,
});

app.use(limiter);

위의 예는 초당 5회씩 API 호출을 허용하며, 초과된 요청에 대해서는 200ms의 딜레이를 적용합니다.

2. API 키 사용하기

API 키를 사용하여 인증되지 않은 사용자의 API 호출을 제한할 수 있습니다. Express.js에서는 express-jwt 또는 jsonwebtoken과 같은 패키지를 사용하여 API 키를 구현할 수 있습니다.

const jwt = require('express-jwt');
const jwks = require('jwks-rsa');

const publicKey = jwks({
  jwksUri: 'https://your-auth0-domain/.well-known/jwks.json',
});

app.use(jwt({
  secret: publicKey,
  issuer: 'https://your-auth0-domain/',
  algorithms: ['RS256'],
}));

위의 예는 Auth0를 사용하여 JWT(JSON Web Token)을 검증하는 설정입니다. 이를 통해 허용된 사용자만이 API에 접근할 수 있습니다.

3. 무작위 시간 딜레이 적용하기

API 호출 사이에 무작위 시간 딜레이를 적용하여 부하를 분산시킬 수 있습니다. 이는 각 API 호출의 응답 속도를 조절하여 서버에 과부하가 걸리지 않도록 합니다.

function getRandomDelay() {
  // 0.5초부터 1초 사이의 무작위 시간 딜레이 적용
  const min = 500;
  const max = 1000;
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

app.use((req, res, next) => {
  setTimeout(next, getRandomDelay());
});

위의 예는 0.5초부터 1초 사이의 무작위 시간 딜레이를 적용하는 설정입니다. 각 API 호출마다 딜레이가 적용되어 서버 부하를 분산시킬 수 있습니다.

API 호출을 제한하는 방법은 다양하게 있으며, 상황에 맞게 적절한 방법을 선택하여 서버의 안정성과 보안을 유지할 수 있습니다.

참고 자료