How to get the IP address of the client
Direct connection
The IP address of the client can be found in the handshake
object:
io.on("connection", (socket) => {
const ipAddress = socket.handshake.address;
console.log(ipAddress); // prints something like "203.0.113.195" (IPv4) or "2001:db8:85a3:8d3:1319:8a2e:370:7348" (IPv6)
});
Behind a proxy
If you are behind a proxy like nginx, the address
attribute will be the IP address of the proxy.
In that case, the IP address of the client will be found in the request headers.
X-Forwarded-For
header
The X-Forwarded-For
request header was a de-facto standard header for identifying the originating IP address of a client connecting to a web server through a proxy server.
Reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For
Format:
X-Forwarded-For: <client>, <proxy1>, <proxy2>
Here's how you can retrieve the IP address of the client:
io.on("connection", (socket) => {
const ipAddress = socket.handshake.headers["x-forwarded-for"].split(",")[0];
console.log(ipAddress);
});
The X-Forwarded-For
header is now deprecated (although still widely used) in favor of the standard Forwarded
header.
Forwarded
header
The Forwarded
request header is the standard header for identifying the originating IP address of a client connecting to a web server through a proxy server.
Reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Forwarded
Format:
Forwarded: by=<identifier>;for=<identifier>;host=<host>;proto=<http|https>
Here's how you can retrieve the IP address of the client:
function parseHeader(header) {
for (const directive of header.split(",")[0].split(";")) {
if (directive.startsWith("for=")) {
return directive.substring(4);
}
}
}
io.on("connection", (socket) => {
const ipAddress = parseHeader(socket.handshake.headers["forwarded"] || "");
console.log(ipAddress);
});
This parseHeader()
method does not cover every edge case allowed by the specification. If you need a more robust method, please check the forwarded-parse
package.
CloudFlare
CloudFlare uses a specific header: cf-connecting-ip
Reference: https://developers.cloudflare.com/fundamentals/reference/http-request-headers/
Here's how you can retrieve the IP address of the client:
io.on("connection", (socket) => {
const ipAddress = socket.handshake.headers["cf-connecting-ip"];
console.log(ipAddress);
});
Fastly
Fastly uses a specific header: fastly-client-ip
Reference: https://developer.fastly.com/reference/http/http-headers/Fastly-Client-IP/
Here's how you can retrieve the IP address of the client:
io.on("connection", (socket) => {
const ipAddress = socket.handshake.headers["fastly-client-ip"];
console.log(ipAddress);
});