Skip to main content

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

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

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