[javascript] Express.js에서의 IP 주소 제한 방법

Express.js는 Node.js를 위한 인기있는 웹 애플리케이션 프레임워크입니다. 이 프레임워크를 사용하여 애플리케이션을 개발하다보면 특정 IP 주소만 액세스를 허용하고 싶을 때가 있을 수 있습니다. 이번 블로그에서는 Express.js에서 IP 주소를 제한하는 방법에 대해 알아보겠습니다.

IP 주소 확인

Express.js에서 IP 주소를 확인하려면 요청(request) 객체의 ip 속성을 사용합니다. 이를 통해 클라이언트의 IP 주소를 알 수 있습니다. 아래의 예제는 IP 주소를 콘솔에 출력하는 방법을 보여줍니다.

app.get('/', (req, res) => {
  console.log(req.ip);
  res.send('Hello World!');
});

IP 주소 제한

IP 주소를 제한하기 위해서는 미들웨어를 사용해야 합니다. Express.js에서 미들웨어는 app.use() 메소드를 통해 등록할 수 있습니다. 이를 이용하여 특정 IP 주소를 제한할 수 있습니다. 아래의 예제는 특정 IP 주소 192.168.0.1만 액세스를 허용하는 미들웨어를 구현한 것입니다.

const allowOnlyIP = (allowedIP) => {
  return (req, res, next) => {
    const clientIP = req.ip;
    if (clientIP === allowedIP) {
      next();
    } else {
      res.status(403).send('Access denied');
    }
  };
};

app.use(allowOnlyIP('192.168.0.1'));

위의 코드에서 allowOnlyIP 함수는 allowedIP 매개변수와 함께 클로저를 반환합니다. 이 클로저는 요청이 들어왔을 때 해당 IP 주소가 허용 목록에 있는지 확인하고, 허용된 IP 주소라면 다음 미들웨어나 라우트 핸들러로 넘어갑니다. 그렇지 않은 경우에는 접근 거부 응답을 반환합니다.

CIDR 표기법으로 IP 주소 제한하기

CIDR(Classless Inter-Domain Routing) 표기법은 IP 주소 범위를 나타내는 방법 중 하나입니다. Express.js에서는 CIDR 표기법을 사용하여 IP 주소 범위를 제한할 수 있습니다. 아래의 예제는 CIDR 표기법을 사용하여 IP 주소 범위 내에서만 액세스를 허용하는 미들웨어를 구현한 것입니다.

const allowOnlyIPRange = (allowedIPRange) => {
  return (req, res, next) => {
    const clientIP = req.ip;
    if (isValidIPRange(clientIP, allowedIPRange)) {
      next();
    } else {
      res.status(403).send('Access denied');
    }
  };
};

const isValidIPRange = (ip, range) => {
  const [allowedIp, subnet] = range.split('/');
  const ipSegments = ip.split('.');
  const allowedIpSegments = allowedIp.split('.');
  const subnetMask = parseInt(subnet, 10);
  
  for (let i = 0; i < 4; i++) {
    const ipSegment = parseInt(ipSegments[i], 10);
    const allowedIpSegment = parseInt(allowedIpSegments[i], 10);
    const mask = 32 - subnetMask;
    
    if ((ipSegment >> mask) !== (allowedIpSegment >> mask)) {
      return false;
    }
  }
  
  return true;
};

app.use(allowOnlyIPRange('192.168.0.0/24'));

위의 예제에서는 allowOnlyIPRange 함수를 사용하여 허용할 IP 주소 범위를 나타냅니다. 함수 내에서는 주어진 IP 주소와 허용 범위를 비교하여 유효한지 확인하고, 유효한 경우에만 액세스를 허용합니다.

결론

Express.js에서 IP 주소를 제한하는 방법에 대해 알아보았습니다. 이를 통해 애플리케이션의 보안을 강화하고 특정 IP 주소로부터의 액세스를 제어할 수 있습니다. 추가적인 제한 조건이나 보안 메커니즘을 사용하기 위해서는 Express.js의 공식 문서나 관련 자료를 참고하시기 바랍니다.

참고 자료