특히 노드의 경우 이벤트 연결 에서 http 서버 구성 요소에 대한 설명서 는 다음 과 같이 말합니다.
새 TCP 스트림이 설정되면 [트리거 됨]. [The] socket은 net.Socket 유형의 객체입니다. 일반적으로 사용자는이 이벤트에 액세스하고 싶지 않습니다. 특히, 소켓은 프로토콜 파서가 소켓에 연결하는 방식 때문에 읽을 수있는 이벤트를 생성하지 않습니다. 소켓은에서 액세스 할 수도 있습니다 request.connection
.
따라서 request.connection
이는 소켓 임을 의미 하며 설명서 에 따르면 문서에 따라 socket.remoteAddress 속성이 있습니다.
원격 IP 주소의 문자열 표현 예를 들어, '74 .125.127.100 '또는'2001 : 4860 : a005 :: 68 '입니다.
명시 적으로 요청 객체는 Node http 요청 객체의 인스턴스이기도 하므로이 방법은 여전히 작동합니다.
그러나 Express.js에서는 요청에 req.ip 및 req.ips 라는 두 가지 속성이 이미 있습니다.
req.ip
원격 주소를 반환하거나 "신뢰 프록시"가 활성화 된 경우 업스트림 주소를 반환합니다.
req.ips
때 "신뢰 프록시는" 이다 true
는 "X가 전달 된-은"IP 주소 목록을 구문 분석하고 배열, 그렇지 않은 경우는 하늘의 배열이 반환을 반환합니다. 예를 들어 값이 "client, proxy1, proxy2"인 경우 배열 ""client ","proxy1 ","proxy2 "]를 수신합니다. 여기서"proxy2 "는 가장 다운 스트림입니다.
그것은 가치가 언급 될 수있다, 내 이해에 따르면, Express는 req.ip
보다 더 나은 접근 방식 req.connection.remoteAddress
때문에,req.ip
실제 클라이언트 ip (신뢰할 수있는 프록시가 명시 적으로 활성화되어있는 경우)를 포함하고 다른 하나는 프록시의 IP 주소를 포함 할 수 가 있습니다. 하나).
이것이 현재 받아 들여진 대답이 제안하는 이유입니다.
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress;
는 req.headers['x-forwarded-for']
표현에 해당 될 것입니다 req.ip
.