Node.jsでリクエストから接続元のIPアドレスを取得する方法

Node.jsを使用して、リクエストから接続元のIPアドレスを取得する方法は、ウェブアプリケーションやネットワーク関連のプロジェクトで非常に重要です。
この記事では、Node.jsを用いた2つの異なる方法を詳しく説明し、それぞれの方法について変数へのIPアドレスの代入するソースコードのサンプルを提供します。

IPアドレスを取得する2つの方法

Express.jsを使用した方法

Express.jsNode.jsのWebアプリケーションフレームワークであり、リクエストからIPアドレスを取得するのが非常に簡単です。
以下はその手順です。

Express.jsをプロジェクトに追加します。

const express = require('express');
const app = express();

Expressのミドルウェアを使用してIPアドレスを取得します。

app.use((req, res, next) => {
  const clientIP = req.ip; // IPアドレスを取得
  console.log('接続元IPアドレス: ' + clientIP);
  next();
});

// ここにアプリケーションのルーティングを追加

この方法では、req.ipを使用してIPアドレスを取得し、に代入することができます。

HTTPモジュールを使用した方法

HTTPモジュールを使用する方法は、Express.jsを使用する場合と比べると手順が多少煩雑ですが、Node.jsの基本的なHTTPサーバーとしても役立ちます。

HTTPモジュールをインポートします。

const http = require('http');

HTTPサーバーを作成し、リクエストハンドラーを追加します。

const server = http.createServer((req, res) => {
  const clientIP = req.connection.remoteAddress; // IPアドレスを取得
  console.log('接続元IPアドレス: ' + clientIP);
  // ここにレスポンスの処理を追加
});

// サーバーを指定のポートでリッスン
const port = 3000;
server.listen(port, () => {
  console.log(`サーバーがポート${port}で実行中`);
});

この方法では、req.connection.remoteAddressを使用してIPアドレスを取得し、変数に代入します。

リバースプロキシを使用している場合

リバースプロキシを使用している場合、req.ipreq.connection.remoteAddressを使用すると、ローカルIPアドレスではなく正確な接続元のIPアドレスを取得することが難しくなります。
そのため、x-forwarded-forヘッダーを使用することが推奨されます。
以下は、上記のソースコードに関する詳しい説明です。

// リバースプロキシを使用した場合に正確な接続元IPアドレスを取得する関数
var getIP = function (req) {
  // リクエストヘッダーからx-forwarded-forヘッダーをチェックします。
  if (req.headers['x-forwarded-for']) {
    return req.headers['x-forwarded-for'];
  }

  // 以下、x-forwarded-forヘッダーが存在しない場合、接続情報からIPアドレスを取得します。
  if (req.connection && req.connection.remoteAddress) {
    return req.connection.remoteAddress;
  }

  if (req.connection.socket && req.connection.socket.remoteAddress) {
    return req.connection.socket.remoteAddress;
  }

  if (req.socket && req.socket.remoteAddress) {
    return req.socket.remoteAddress;
  }

  // 上記の条件に該当しない場合、デフォルトで'0.0.0.0'を返します。
  return '0.0.0.0';
};

解説

リバースプロキシx-forwarded-forヘッダーを提供している場合、それを使用してクライアントのIPアドレスを取得します。

x-forwarded-forヘッダーが存在しない場合、req.connection.remoteAddressreq.connection.socket.remoteAddress、およびreq.socket.remoteAddressを順番にチェックし、最初に見つかったIPアドレスを返します。これらは接続情報から取得されます。

上記の条件すべてに該当しない場合、デフォルトで0.0.0.0を返します。

この関数を使用することで、リバースプロキシを介して正確な接続元のIPアドレスを取得できます。
この情報を元に、リクエストの解析やセキュリティ対策などを行うことができます。

おまけ

関数の中身はただのif文なので、returnを1つにしてもっと簡潔にまとめてみました!

return req.headers['x-forwarded-for'] || 
    (req.connection && req.connection.remoteAddress) || 
    (req.connection.socket && req.connection.socket.remoteAddress) || 
    (req.socket && req.socket.remoteAddress) || 
    '0.0.0.0';

まとめ

Node.jsを使用してリクエストから接続元のIPアドレスを取得する方法について2つのアプローチを紹介しました。Express.jsを使用する場合とHTTPモジュールを使用する場合は、プロジェクトの要件や好みに応じて、どちらの方法を選択するかを検討してください。

また、リバースプロキシを使用していて、接続元のIPアドレスが正確に取得できない場合の対処方法も紹介しました。
結論としては、Express.jsHTTPモジュールを使うより、x-forwarded-forヘッダーをから取得した方が万能な気がします。

著:伊藤 康太
¥3,114 (2023/10/07 04:46時点 | Amazon調べ)


Amazonベストセラー

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA