사용자 IP 얻기 (express)

개발빼-엠·2023년 1월 30일
0

배움을 기록

목록 보기
15/47
post-thumbnail

Node.js를 이용한 express 서버에 요청이 왔을 때, 요청한 사용자의 IP를 얻는 방법

1) requestIp 모듈

requestIp 모듈을 받고, get요청이 들어올때 사용자 IP가 콘솔에 찍힐 수 있도록 작성했었는데, 밑의 코드로 작성해 로컬에서 get요청을 하면 ::1 이 콘솔에 출력되었다.

const express = require("express");
const app = express();
const requestIp = require("request-ip");

app.get("/", (req, res) => {
	res.send("서버");
	console.log("client IP: " + requestIp.getClientIp(req));
});

app.listen(90, () => console.log("로그 서버실행")); // client IP: ::1

검색해보니 ::1 은 IPv6에서 로컬 호스트를 의미해 express서버를 생성할 때 IPv4를 사용하도록 설정해야 된다는 블로그를 발견했다.

~~app.listen(90, () => console.log("로그 서버실행"));~~

// 서버에서 수신할 때 IPv4를 지정하는 방법
app.listen(90, "0.0.0.0"); // client IP: 127.0.0.1

위처럼 작성하면 IPv4로 IP가 콘솔에 찍히게 된다.

2) os 모듈

컴퓨터의 네트워크 인터페이스에 대한 정보를 얻기 위해 사용되는 모듈이다.

각 네트워크 인터페이스에 대한 정보가 포함된 개체를 반환한다.

  • address: 할당된 네트워크 주소를 지정하는 문자열 ( IPv4 / IPv6 )
  • netmask: IPv4 / IPv6 네트워크 마스크를 지정하는문자열
  • family: Family를 지정하는문자열로 값은 IPv4 또는 IPv6
  • mac: 네트워크 인터페이스의 MAC 주소를 지정하는 문자열
  • internal: 불린값으로 인터페이스가 루프백 1이면 true, 그렇지 않으면 false
  • scopeid: IPv6의 범위 ID를 지정하는 숫자
  • cidr: CIDR 표기법에서 라우팅 접두사와 함께 할당된 IPv4 또는 IPV6주소를 지정하는 문자열로 netmast가 유효하지 않으면 null

참고

const express = require("express");
const app = express();
const os = require("os");

const nets = os.networkInterfaces();
const results = Object.create(null);

for (const name of Object.keys(nets)) {
	for (const net of nets[name]) {
		if (net.family === "IPv4" && !net.internal) {
			if (!results[name]) {
				results["IP"] = net.address;
			}
		}
	}
}

app.get("/", (req, res) => {
	res.send("서버");
	console.log(nets);
	console.log(results);
});

// nets 콘솔
{
  lo0: [
    {
      address: '127.0.0.1',
      netmask: '255.0.0.0',
      family: 'IPv4',
      mac: '00:00:00:00:00:00',
      internal: true,
      cidr: '127.0.0.1/8'
    },
    {
      address: '::1',
      netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
      family: 'IPv6',
      mac: '00:00:00:00:00:00',
      internal: true,
      cidr: '::1/128',
      scopeid: 0
    },
    {
      address: 'fe80::1',
      netmask: 'ffff:ffff:ffff:ffff::',
      family: 'IPv6',
      mac: '00:00:00:00:00:00',
      internal: true,
      cidr: 'fe80::1/64',
      scopeid: 1
    }
  ],
.
.
.
  utun4: [
    {
      address: 'fe80::9903:f3a6:77eb:efe8',
      netmask: 'ffff:ffff:ffff:ffff::',
      family: 'IPv6',
      mac: '00:00:00:00:00:00',
      internal: false,
      cidr: 'fe80::9903:f3a6:77eb:efe8/64',
      scopeid: 19
    }
  ]
}

3) ip 모듈 (내 IP가져오기)

const express = require("express");
const app = express();
const ip = require("ip");

app.get("/", (req, res) => {
	res.send("서버");
	console.log(ip.address());
});

0개의 댓글