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