【JS応用|実務向け】URL APIを使いこなす:URL.prototype.host を活用した安全なホスト名取得術

1. 導入:なぜURLオブジェクトを使うべきなのか

Web開発において、文字列操作でURLを解析することは非常に危険です。正規表現で無理やりドメインやポート番号を抽出すると、エッジケース(IPv6アドレスやポート番号の省略など)でバグを生む可能性が高まります。
モダンブラウザおよびNode.jsで標準サポートされている「URL API」を活用することで、これらの複雑な解析をブラウザエンジンに任せ、安全かつ簡潔に処理を行うことができます。特に `URL.prototype.host` は、ホスト名とポート番号をセットで扱う際に非常に強力なツールとなります。

2. 基礎知識:URL.prototype.host とは

`URL.prototype.host` は、URLオブジェクトが保持する「ホスト部分」を返すプロパティです。ここで重要なのは、このプロパティが「ホスト名(ドメイン名またはIPアドレス)」と「ポート番号」の両方を含むという点です。

例えば、`https://example.com:8080/path` というURLであれば、`host` は `example.com:8080` を返します。対照的に、`hostname` プロパティはポート番号を除いた `example.com` のみを返します。この違いを理解することが、意図した通りのURL操作を行うための鍵となります。

3. 実装:URLオブジェクトの生成とプロパティ取得

URLを解析するには、まず `new URL()` コンストラクタを使ってURLオブジェクトを作成します。これにより、URL文字列が各コンポーネントに自動的に分解されます。その後、`.host` プロパティにアクセスするだけで、対象のホスト情報を安全に取り出すことが可能です。

4. サンプルプログラム

以下のコードは、実務で頻出する「URLから安全にホスト情報を抽出する」例です。ブラウザのコンソールやNode.js環境でそのまま動作確認が可能です。


// 解析対象のURL文字列
const urlString = "https://api.example.jp:443/v1/users?id=123";

try {
// URLオブジェクトを生成
const url = new URL(urlString);

// hostプロパティでホスト名とポートを取得
// 結果: "api.example.jp:443"
console.log("ホスト(ポート含む):", url.host);

// 参考:hostnameプロパティでホスト名のみ取得
// 結果: "api.example.jp"
console.log("ホスト名のみ:", url.hostname);

// 応用:特定のポートかどうかを判定するロジック
if (url.port === "443") {
console.log("この通信はHTTPS標準ポートを使用しています");
}
} catch (e) {
// 不正なURL形式だった場合のハンドリング
console.error("URLの解析に失敗しました:", e.message);
}

5. 応用・注意点:現場で役立つTips

実務において `host` プロパティを扱う際は、以下の点に注意してください。

・ポート番号の自動省略: ブラウザの仕様上、スキームに対して標準的なポート番号(HTTPの80やHTTPSの443など)が指定されている場合、ブラウザによっては `host` からポート番号が自動的に省略されることがあります。厳密にポート番号が必要な場合は、`url.port` プロパティを個別に参照してください。
・セキュリティチェック: ユーザーが入力したURLのドメインを検証する際は、`host` をそのまま使用せず、必ず `hostname` を使用して許可リスト(Allow-list)との照合を行ってください。ポート番号を含んだ状態で比較を行うと、意図しないポートへの誘導を許してしまう脆弱性につながります。
・相対URLの扱い: `new URL()` に相対パスを渡すと例外(TypeError)が発生します。必ずベースとなるURLと組み合わせて使用するか、try-catchブロックで囲むのが安全な実装の鉄則です。

タイトルとURLをコピーしました