rate-limit 적용

유석현(SeokHyun Yu)·2022년 12월 12일
0

Node.js

목록 보기
25/29
post-thumbnail

rate-limiter.js

import rateLimiter from "express-rate-limit";

export default rateLimiter({
  	// windowMs: 기준 시간을 설정 (단위: milliSecond)
    windowMs: 10 * 1000,
  	// max: 설정한 시간 안에 허용할 최대 요청 수
    max: 10,
    message: "요청이 너무 많습니다.",
  	// rate-limit 핸들러
    handler: (req, res, next, options) => {
        console.log("options.statusCode -", options.statusCode);
        console.log("options.message -", options.message);

        res.status(options.statusCode).send(options.message);
    },
});

app.js

import express from "express";
import helmet from "helmet";
import morgan from "morgan";
import cors from "cors";
import tweetController from "./tweet/tweet.controller.js";
import authController from "./auth/auth.controller.js";
import { config } from "../config.js";
import sequelize from "../database.js";
import csrf from "./middleware/csrf.js";
import rateLimiter from "./middleware/rate-limiter.js";

// 서버 생성
const app = express();

// 미들웨어
app.use(csrf);
app.use(express.json());
app.use(morgan("dev"));
app.use(helmet());
app.use(cors());

// rate-limit 미들웨어 추가
app.use(rateLimiter);

// 라우터
app.use("/tweet", tweetController);
app.use("/auth", authController);

// 404 에러 핸들러
app.use((req, res, next) => {
    res.sendStatus(404);
});

// 500 에러 핸들러
app.use((err, req, res, next) => {
    res.sendStatus(500);
});

// DB 연결
sequelize.sync().then(() => {
    // 8000 포트로 listen
    // DB가 연결된 다음에 서버 실행
    app.listen(config.port, () => {
        console.log("Server On...");
    });
});

POST: http://localhost:8000/tweet

  • 10번이 limit인데 11번 요청했을 경우, 마지막 11번째 요청은 429: Too Many Request

profile
Backend Engineer

0개의 댓글