노드에서 사용자의 IP 주소를 확인하는 방법
컨트롤러 내에서 주어진 요청의 IP 주소를 어떻게 확인할 수 있습니까? 예를 들어 (명시 적으로) :
app.post('/get/ip/address', function (req, res) {
// need access to IP address here
})
당신의에서 request
객체라는 속성이 connection
A는, net.Socket
객체. net.Socket 객체에는 속성이 있으므로이 remoteAddress
호출로 IP를 얻을 수 있어야합니다.
request.connection.remoteAddress
편집하다
@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 Gupta 가 Martin 이 x-forwarded-for
설정하지 않은 경우에 대한 주석에서 제안한 수정 사항으로 제안한 솔루션 입니다.
var ip = (req.headers['x-forwarded-for'] || '').split(',').pop() ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress
Express를 사용하는 경우 ...
나는 이것을 찾고 있었고, 나는 기다렸고, 나는 표현을 사용하고있다. 어.
DRY 를 유지 하고 IPv4 및 IPv6을 모두 지원 하는 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);
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;
}
IP 주소를 얻는 방법에는 두 가지가 있습니다.
let ip = req.ip
let ip = req.connection.remoteAddress;
그러나 위의 접근법에는 문제가 있습니다.
Nginx 또는 프록시 뒤에서 앱을 실행하는 경우 모든 단일 IP 주소는입니다 127.0.0.1
.
따라서 사용자의 IP 주소를 얻는 가장 좋은 해결책은 다음과 같습니다.
let ip = req.header('x-forwarded-for') || req.connection.remoteAddress;
Express 버전 3.x 이상을 사용하는 경우 신뢰 프록시 설정 ( http://expressjs.com/api.html#trust.proxy.options.table )을 사용하면 주소 체인이 x-forwarded-for 헤더를 사용하고 신뢰할 수있는 프록시로 구성하지 않은 체인에 최신 ip를 req 객체의 ip 속성에 넣습니다.
여러 개의 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;
나는 이것이 죽음에 대한 답을 얻었음을 알고 있지만, 여기에 필자가 작성한 에어 ESB 기반의 eslint 표준을 따르는 현대 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 목록을 포함 할 수 있습니다. 순서는 client, proxy1, proxy2, ..., proxyN입니다. 실제로 사람들은이 헤더에 원하는 것을 제공 할 수있는 프록시를 구현합니다. 로드 밸런서 또는 그 뒤에있는 경우 목록의 첫 번째 IP는 적어도 일부 요청이 통과 한 프록시가 무엇인지 신뢰할 수 있습니다.
nginx 뒤의 노드 10.14에서 다음과 같이 nginx 헤더를 통해 요청하여 ip를 검색 할 수 있습니다.
proxy_set_header X-Real-IP $remote_addr;
그런 다음 app.js에서 :
app.set('trust proxy', true);
그런 다음 원하는 곳에 표시하십시오.
var userIp = req.header('X-Real-IP') || req.connection.remoteAddress;
경고:
중요한 속도 제한을 위해 이것을 맹목적으로 사용하지 마십시오.
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];
다른 답변이 이것을 언급하지 않은 것에 놀랐습니다.
같은 문제가 있었지만 자바 스크립트에서도 새로운 것이었지만 req.connection.remoteAddress 로이 문제를 해결했습니다. 그것은 나에게 IP 주소 (그러나 ipv6 형식 :: ffff.192.168.0.101)와 .slice 를 제공하여 7 번째 숫자를 제거했습니다.
var ip = req.connection.remoteAddress;
if (ip.length < 15)
{
ip = ip;
}
else
{
var nyIP = ip.slice(7);
ip = nyIP;
}
참고 URL : https://stackoverflow.com/questions/8107856/how-to-determine-a-users-ip-address-in-node
'Programing' 카테고리의 다른 글
기존 배열에서 하위 배열 얻기 (0) | 2020.03.11 |
---|---|
내 레지스트리없이 개인 NPM 모듈을 설치하는 방법은 무엇입니까? (0) | 2020.03.11 |
git rebase :“오류 : 'file'통계를 할 수 없습니다 : 권한이 거부되었습니다.” (0) | 2020.03.11 |
활동을 종료하려면 뒤로 단추를 두 번 클릭하십시오. (0) | 2020.03.11 |
iPhone Simulator가 갑자기 매우 느리게 실행되기 시작했습니다. (0) | 2020.03.11 |