ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Nodejs] express-rate-limit으로 DoS 예방하기
    Knowledge 2019. 11. 20. 11:15


    Nodejs의 express 모듈은 간편한 방식으로 Web API를 구성할 수 있게 해준다.
    나름 안정성도 꽤 뛰어나 기본적으로 많이 쓰이는 모듈일 것이다.

    그런데, Nodejs에 익숙하지 않아 일반적인 튜토리얼을 참고해 서버를 만들어 구동했더니, 

    예상치 않은 문제가 나타났다.
    운영중인 서버에 단순 DoS (Denial of Service) 공격이 발생했는데, 
    서버 인스턴스의 모든 리소스가 순식간에 Max를 치고 서버가 무응답 상태로 전환되었다.
    인스턴스가 살아는 있으나 간단한 SSH 접속 조차 불가능한 상태라 어쩔 수 없이 인스턴스 재부팅을 했다.

    로그를 살펴보니 인커밍 패킷이 엄청 들어오고, CPU 점유가 맥스를 치고, 아웃고잉 패킷이 엄청 늘어났다.
    대단한 서버도 아닌데, 왜 공격한지는 모르겠지만... 초단순 DoS 공격인 것 같다.
    DB에 쓰는 내용이 없어서 다행이지, 있었으면 DB도 망칠뻔 했다.

    DDoS까지 고려해서 완벽하게 서버를 유지하려면 WAF나 기타 유용한고 훌륭한 툴이 많겠지만, 
    일단 금전적이나 시간적 비용이 목적을 초과하므로 좀 더 단순한 방법을 생각했다.
    express에 요구되는 콜의 숫자를 컨트롤하면 어떨까 하는 생각이 들었고, 

    역시나 간단한 방법이 존재했다.

    Nodejs 모듈 중 express-rate-limit이 그것이다.
    단위 시간 동안 하나의 ip 주소에서 들어오는 request의 숫자를 제한할 수 있는 간단한 모듈이다.

    예를 들어 ip당 1분간 들어오는 request의 숫자를 100으로 제한하려면 다음과 같이 사용 가능하다.

    var app = require("express"); 
    var rateLimit = require("express-rate-limit"); 
    
    // Apply to all requests 
    api.use(rateLimit({ 
        windowMs: 1*60*1000, 
        max: 100 
        })
    );


    만약 특정 end point에 리밋을 적용하고 싶다면 다음과 같이 한다.

    app.use("/api/", rateLimit({ 
        windowMs: 1*60*1000, 
        max: 100 
        })
    ); 


    만약 분당 max값을 넘는 requests가 들어오면 다음과 같은 응답이 클라이언트로 전달된다.

    Too many requests, please try again later.



    Fin.

    반응형

    댓글

Calvin's Memo