programing

노드에서 사용자의 IP 주소를 확인하는 방법

lovejava 2023. 6. 18. 10:00

노드에서 사용자의 IP 주소를 확인하는 방법

컨트롤러 내에서 지정된 요청의 IP 주소를 확인하려면 어떻게 해야 합니까?예: (익스프레스로):

app.post('/get/ip/address', function (req, res) {
    // need access to IP address here
})

개체에는 개체라는 속성이 있습니다.net.Socket개체에 속성이 있으므로 다음 호출로 IP를 가져올 수 있습니다.

request.socket.remoteAddress

(노드 버전이 13 이하인 경우 지금은 사용하지 않는 것을 사용하십시오.)

편집

뒤에 있을 은 @juand 가코지서적했듯를이에트멘, 서버프시뒤록 입니다.request.headers['x-forwarded-for']

편집 2

을 할 때expressNode.js 파일:

설정하는 경우app.set('trust proxy', true),req.ip프록시 뒤에 있더라도 실제 IP 주소를 반환합니다.자세한 내용은 설명서를 참조하십시오.

var ip = req.headers['x-forwarded-for'] ||
     req.socket.remoteAddress ||
     null;

때때로 두 개 이상의 IP 주소를 얻을 수 있습니다.req.headers['x-forwarded-for'] 한또는,x-forwarded-for헤더가 항상 설정되지 않아 오류가 발생할 수 있습니다.

필드의 일반적인 형식은 다음과 같습니다.

x-제곱-함수: client, proxy1, proxy2, proxy3

여기서 값은 쉼표+공간으로 구분된 IP 주소 목록으로, 맨 왼쪽이 원래 클라이언트이며 요청을 받은 위치에 IP 주소를 추가하여 요청을 통과한 각 연속 프록시입니다.이 예에서는 요청이 전달되었습니다.proxy1,proxy2,그리고 나서.proxy3.proxy3요청의 원격 주소로 나타납니다.

이것은 Arnav Gupta가 제안한 해결책으로 마틴이 아래의 경우에 대한 코멘트에서 제안한 해결책입니다.x-forwarded-for설정되지 않음:

var ip = (req.headers['x-forwarded-for'] || '').split(',').pop().trim() || 
         req.socket.remoteAddress

최신 JS를 사용한 제안:

  • 중입니다.x-forwarded-for설정된 경우에만, 설정된 경우 첫 번째 주소를 사용합니다.
  • 다른 매개 변수는 선택적 체인(?)사용합니다.
const parseIp = (req) =>
    req.headers['x-forwarded-for']?.split(',').shift()
    || req.socket?.remoteAddress

console.log(parseIp(req))
// => 127.0.0.1

익스프레스를 사용하는 경우...

req.ip

제가 이걸 찾아보고 있자니 기다리기만 했어요, 급행을 이용하고 있습니다.어휴.

DRY 상태를 유지하면서 IPv4와 IPv6모두 지원하는 노드 IP웨어를 사용할 수 있습니다.

설치:

npm install ipware

app.js 또는 미들웨어에서:

var getIP = require('ipware')().get_ip;
app.use(function(req, res, next) {
    var ipInfo = getIP(req);
    console.log(ipInfo);
    // { clientIp: '127.0.0.1', clientIpRoutable: false }
    next();
});

의 IP 의 노력을 반환을 할 입니다.127.0.0.1사용자의 IP 주소를 확인할 수 없음을 나타냅니다.고급 옵션은 README 파일을 참조하십시오.

request-ip을 사용하여 사용자의 IP 주소를 검색할 수 있습니다.다른 답변에 언급된 다양한 에지 사례 중 상당 부분을 처리합니다.

공개:이 모듈을 만들었습니다.

설치:

npm install request-ip

앱에서:

var requestIp = require('request-ip');

// inside middleware handler
var ipMiddleware = function(req, res, next) {
    var clientIp = requestIp.getClientIp(req); // on localhost > 127.0.0.1
    next();
};

이것이 도움이 되길 바랍니다.

request.headers['x-forwarded-for'] || request.connection.remoteAddress

에 약에만.x-forwarded-for 다음 합니다. 헤가거있사그고용하, 않지으면그렇을을 합니다..remoteAddress소유물.

x-forwarded-forHTTP 또는 HTTPS에 대해 설정된 로드 밸런서(또는 다른 유형의 프록시)를 통과하는 요청에 헤더가 추가됩니다(프록시 프로토콜을 사용하여 TCP 수준에서 밸런싱할 때 요청에 이 헤더를 추가할 수도 있습니다).그 이유는request.connection.remoteAddress이 속성에는 클라이언트의 공용 IP 주소가 아닌 로드 밸런서의 개인 IP 주소가 포함됩니다.OR 문을 사용하여 위의 순서대로 다음과 같이 확인합니다.x-forwarded-for가 있으면 합니다. 그렇지 가▁the다▁header▁it▁use▁use"를 사용합니다. 그렇지 않으면request.connection.remoteAddress.

Following Function에서 다루는 모든 사례가 도움이 됩니다.

var ip;
if (req.headers['x-forwarded-for']) {
    ip = req.headers['x-forwarded-for'].split(",")[0];
} else if (req.connection && req.connection.remoteAddress) {
    ip = req.connection.remoteAddress;
} else {
    ip = req.ip;
}console.log("client IP is *********************" + ip);

하지만 모두 시도해 봤지만, 효과는 없었습니다.

console.log(clientIp);
console.log(req.ip);

console.log(req.headers['x-forwarded-for']);
console.log(req.connection.remoteAddress);
console.log(req.socket.remoteAddress);
console.log(req.connection.socket.remoteAddress.split(",")[0]);

Nginx에 대한 프록시 뒤에서 Express 앱을 실행할 때 응용 프로그램 변수 신뢰 프록시를 true로 설정해야 합니다.Express는 문서에서 검토할 수 있는 몇 가지 다른 트러스트 프록시 값을 제공하지만, 아래 단계가 저에게 도움이 되었습니다.

  1. Express 앱에 app.set('trust proxy', true)이 있습니다.

app.set('trust proxy', true);

  1. 서버 블록에 대한 Nginx 구성의 $remote_addr에 대해 proxy_set_header X-Forwarded-for를 추가합니다.
  location /  {
                proxy_pass    http://localhost:3001;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $remote_addr;  # this line
                proxy_cache_bypass $http_upgrade; 
        }
  1. 이제 req.header('x-forwarded-for') 또는 req.connection.remoteAddress; ipfilter의 전체 코드에서 클라이언트의 IP 주소를 읽을 수 있습니다.
module.exports =  function(req, res, next) {
    let enable = true; // true/false
    let blacklist = ['x.x.x.x'];
    let whitelist = ['x.x.x.x'];
    let clientIp = req.header('x-forwarded-for') || req.connection.remoteAddress;
    if (!clientIp) {
        return res.json('Error');
    }
    if (enable
        && paths.some((path) => (path === req.originalUrl))) {

        let blacklist = blacklist || [];
        if (blacklist.some((ip) => clientIp.match(ip) !== null)) {
            return res.json({ status: 401, error: 'Your IP is black-listed !'});
        }
        let whitelist = whitelist || [];
        if (whitelist.length === 0 || whitelist.some((ip) => clientIp.match(ip) !== null)) {
            next();
            return;
        } else {
            return res.json({ status: 401, error: 'Your IP is not listed !'});
        }
    }
    next();
};

경고:

중요한 속도 제한을 위해 무작정 사용하지 마십시오.

let ip = request.headers['x-forwarded-for'].split(',')[0];

스푸핑은 매우 쉽습니다.

curl --header "X-Forwarded-For: 1.2.3.4" "https://example.com"

이 경우 사용자의 실제 IP 주소는 다음과 같습니다.

let ip = request.headers['x-forwarded-for'].split(',')[1];

저는 다른 답변들이 이것을 언급하지 않았다는 것에 놀랐습니다.

IP 주소를 가져오는 두 가지 방법이 있습니다.

  1. let ip = req.ip

  2. let ip = req.connection.remoteAddress;

그러나 위의 접근법에는 문제가 있습니다.

또는 뒤에서 , 는 Nginx 또는에서앱을경실우행는모 .127.0.0.1.

따라서 사용자의 IP 주소를 얻는 가장 좋은 솔루션은 다음과 같습니다.

let ip = req.header('x-forwarded-for') || req.connection.remoteAddress;

function getCallerIP(request) {
    var ip = request.headers['x-forwarded-for'] ||
        request.connection.remoteAddress ||
        request.socket.remoteAddress ||
        request.connection.socket.remoteAddress;
    ip = ip.split(',')[0];
    ip = ip.split(':').slice(-1); //in case the ip returned in a format: "::ffff:146.xxx.xxx.xxx"
    return ip;
}

nginx 뒤에 있는 노드 10.14에서는 다음과 같이 nginx 헤더를 통해 IP를 요청하여 검색할 수 있습니다.

proxy_set_header X-Real-IP $remote_addr;

그러면 앱에서.js:

app.set('trust proxy', true);

그런 다음 원하는 위치에 표시합니다.

var userIp = req.header('X-Real-IP') || req.connection.remoteAddress;

Express 버전 3.x 이상을 사용하는 경우 trust proxy 설정(http://expressjs.com/api.html#trust.proxy.options.table) 을 사용하면 x-proxy-for 헤더의 주소 체인을 걷고 신뢰할 수 있는 프록시로 구성되지 않은 체인의 최신 IP를 req 개체의 ip 속성에 넣습니다.

만약 당신이 express.js를 사용한다면,

app.post('/get/ip/address', function (req, res) {
      res.send(req.ip);
})

var ipaddress = (req.headers['x-forwarded-for'] || 
req.connection.remoteAddress || 
req.socket.remoteAddress || 
req.connection.socket.remoteAddress).split(",")[0];

IP가 여러 개인 경우 다음과 같은 이점이 있습니다.

var ipaddress = (req.headers['x-forwarded-for'] || 
req.connection.remoteAddress || 
req.socket.remoteAddress || 
req.connection.socket.remoteAddress).split(",")[0];

nodejs에서 단순 원격 IP 가져오기:

var ip = req.header('x-forwarded-for') || req.connection.remoteAddress;

req.connectionnode@12.12.0 이후에는 더 이상 사용되지 않습니다.사용.req.connection.remoteAddress클라이언트 IP를 가져오는 것은 여전히 작동할 수 있지만 권장되지 않습니다.

다행히도 node@0.5.10 이후로 존재해 왔으며 완벽한 대체품입니다.

원격 IP 주소의 문자열 표현입니다.를 들면, 들면를예,'74.125.127.100'또는'2001:4860:a005::68'값은 다음과 같습니다.undefined소켓이 파괴된 경우(예: 클라이언트의 연결이 끊어진 경우).

여기에는 많은 장점이 있었지만 포괄적인 내용은 없었습니다. 따라서 다음과 같이 사용하게 되었습니다.

function getIP(req) {
  // req.connection is deprecated
  const conRemoteAddress = req.connection?.remoteAddress
  // req.socket is said to replace req.connection
  const sockRemoteAddress = req.socket?.remoteAddress
  // some platforms use x-real-ip
  const xRealIP = req.headers['x-real-ip']
  // most proxies use x-forwarded-for
  const xForwardedForIP = (() => {
    const xForwardedFor = req.headers['x-forwarded-for']
    if (xForwardedFor) {
      // The x-forwarded-for header can contain a comma-separated list of
      // IP's. Further, some are comma separated with spaces, so whitespace is trimmed.
      const ips = xForwardedFor.split(',').map(ip => ip.trim())
      return ips[0]
    }
  })()
  // prefer x-forwarded-for and fallback to the others
  return xForwardedForIP || xRealIP || sockRemoteAddress || conRemoteAddress
}

저는 이것이 죽을 때까지 답이 있었다는 것을 알지만, 여기 제가 쓴 최신 ES6 버전이 에어비앤비 기반의 에스슬린트 표준을 따르고 있습니다.

const getIpAddressFromRequest = (request) => {
  let ipAddr = request.connection.remoteAddress;

  if (request.headers && request.headers['x-forwarded-for']) {
    [ipAddr] = request.headers['x-forwarded-for'].split(',');
  }

  return ipAddr;
};

X-Forwarded-For 헤더에는 쉼표로 구분된 프록시 IP 목록이 포함될 수 있습니다.순서는 클라이언트, proxy1, proxy2, ..., proxyN입니다.현실 세계에서 사람들은 이 헤더에서 원하는 것을 무엇이든 제공할 수 있는 프록시를 구현합니다.로드 밸런서 등의 배후에 있는 경우 목록의 첫 번째 IP가 적어도 일부 요청을 통해 전송된 프록시임을 신뢰할 수 있습니다.

ipv4 형식에 사용합니다.

req.connection.remoteAddress.split(':').slice(-1)[0]

다음과 같은 Express를 사용하여 사용자 IP를 얻을 수 있습니다.

req.ip

예를 들어 이 경우 사용자 IP를 가져와 사용자 With req.ip에게 다시 보냅니다.

app.get('/', (req, res)=> { 
    res.send({ ip : req.ip})
    
})

Graphql-Yoga를 사용하는 경우 다음 기능을 사용할 수 있습니다.

const getRequestIpAddress = (request) => {
    const requestIpAddress = request.request.headers['X-Forwarded-For'] || request.request.connection.remoteAddress
    if (!requestIpAddress) return null

    const ipv4 = new RegExp("(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)")

    const [ipAddress] = requestIpAddress.match(ipv4)

    return ipAddress
}

저는 nginx 뒤에 있는 express를 사용하고 있고,

req.headers.origin

나를 위해 속임수를 썼습니다.

    const express = require('express')
    const app = express()
    const port = 3000

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

   // Run as nodejs ip.js
    app.listen(port, () => {
    console.log(`Example app listening at http://localhost:${port}`)
    })

속에서는 껍기속서에, ▁just.curl https://api.ipify.org

이제 node.js로 포팅하기 위해 이것을 관찰하겠습니다.

curl웹 사이트에서 데이터를 가져오는 응용 프로그램으로, "https://api.ipify.org " 웹 사이트를 인수로 전달합니다.우리는 사용할 수 있습니다.node-fetchcurl!

우리가 웹사이트에서 얻는 데이터는 우리의 IP 주소입니다. 그것은 당신의 IP를 가져오는 일종의 것입니다.

요약하자면:

const fetch = require('node-fetch');

fetch('https://api.ipify.org')
  .then(response => {/* whatever */})
  .catch(err => {/* whatever */})

먼저 프로젝트에 설치합니다.

import requestIp from 'request-ip';
const clientIp = requestIp.getClientIp(req); 
console.log(clientIp)

하면 결과가 수 .::1::1는 실제 IP 주소이며 localhost에 대한 IPV6 표기법입니다.

검증자 사용유형 스크립트에 JS가 있습니다.다음은 NodeJS 미들웨어입니다.

// Extract Client IP Address
app.use((req, res, next) => {
    let ipAddress = (req.headers['x-forwarded-for'] as string || '').split(',')[0]
    if (!validator.isIP(ipAddress))
        ipAddress = req.socket.remoteAddress?.toString().split(':').pop() || ''
    if (!validator.isIP(ipAddress))
        return res.status(400).json({errorMessage: 'Bad Request'})

    req.headers['x-forwarded-for'] = ipAddress
    next()
})

여기서는 모든 요청에 유효한 IP 주소가 있어야 하므로 유효한 IP 주소가 없으면 코드 400으로 응답을 반환합니다.

큐버넷 입력(NGINX)을 사용하는 경우:

req.headers['x-original-forwarded-for']

Node.js에서 매력적으로 작동했습니다.

우리는 노드 js에서 이 코드로 확인할 수 있습니다.

const os       = require('os');
const interfaces = os.networkInterfaces();

let addresses = [];

for (var k in interfaces) {

    for (var k2 in interfaces[k]) {

        const address = interfaces[k][k2];

        if ( (address.family === 'IPv4' || address.family === 'IPv6')  && 
            !address.internal) {

            addresses.push(address.address);

        }
    }
}
console.log(addresses);

언급URL : https://stackoverflow.com/questions/8107856/how-to-determine-a-users-ip-address-in-node