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

컨트롤러 내에서 주어진 요청의 IP 주소를 어떻게 확인할 수 있습니까? 예를 들어 (명시 적으로) :

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



답변

당신의에서 request객체라는 속성이 connectionA는, net.Socket객체. net.Socket 객체에는 속성이 있으므로이 remoteAddress호출로 IP를 얻을 수 있어야합니다.

request.connection.remoteAddress

httpnet 설명서를 참조하십시오

편집하다

@juand가 주석에서 지적했듯이 서버가 프록시 뒤에있는 경우 원격 IP를 얻는 올바른 방법은 다음과 같습니다. request.headers['x-forwarded-for']


답변

var ip = req.headers['x-forwarded-for'] ||
     req.connection.remoteAddress ||
     req.socket.remoteAddress ||
     (req.connection.socket ? req.connection.socket.remoteAddress : null);

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

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

x 전달 : client, proxy1, proxy2, proxy3

여기서 값은 쉼표 + 공백으로 구분 된 IP 주소 목록이며, 가장 왼쪽은 원래 클라이언트이며 요청을받은 각 연속 프록시는 요청을받은 IP 주소를 추가합니다. 이 예에서 요청은 proxy1,proxy2 다음 proxy3. proxy3요청의 원격 주소로 나타납니다.

이것은 Arnav GuptaMartinx-forwarded-for설정하지 않은 경우에 대한 주석에서 제안한 수정 사항으로 제안한 솔루션 입니다.

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


답변

Express를 사용하는 경우 …

req.ip

나는 이것을 찾고 있었고, 나는 기다림과 같았다. 나는 표현을 사용하고있다. 어.


답변

DRY 를 유지 하고 IPv4IPv6을 모두 지원 하는 node-ipware 만 사용할 수 있습니다 .

설치:

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 주소를 얻으려고 최선을 다하거나 사용자의 IP 주소를 127.0.0.1확인할 수 없음을 표시하기 위해 돌아갑니다 . 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-for헤더에 설정 부하 분산 (또는 프록시 다른 유형)를 통과 요청에 추가 HTTP 또는 HTTPS (그것은에서 균형 때 요청에이 헤더를 추가 할 수도 있습니다 TCP의 사용 수준 프록시 프로토콜 ). request.connection.remoteAddress속성에 클라이언트의 퍼블릭 IP 주소가 아닌로드 밸런서의 프라이빗 IP 주소가 포함 되기 때문 입니다. 위의 순서대로 OR 문 을 사용하여 x-forwarded-for헤더 의 존재를 확인하고 존재 하는 경우이를 사용하십시오 request.connection.remoteAddress.


답변

다음 기능은 모든 경우에 적용됩니다.

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);