認証付きURL(user:pass@host)の解析

URLにuserinfo(ユーザー名とパスワード)がどのように埋め込まれるかを理解します。セキュリティへの影響、この形式が使用される場面、ブラウザがURL内の認証をどう処理するかを学びます。

Basic Parsing

詳細な説明

URL認証:Userinfoコンポーネント

URLにはprotocol://username:password@hostnameの形式で認証情報を直接埋め込むことができます。これはuserinfoコンポーネントと呼ばれ、RFC 3986で定義されています。

構文

https://admin:s3cret@api.example.com:8080/dashboard
\_____/ \___/ \____/ \_____________/ \__/ \_________/
  |       |     |          |          |       |
スキーム ユーザー パスワード ホスト名  ポート  パス

URL APIによる解析

const url = new URL("https://admin:s3cret@api.example.com:8080/dashboard");
console.log(url.username);  // "admin"
console.log(url.password);  // "s3cret"
console.log(url.hostname);  // "api.example.com"
console.log(url.host);      // "api.example.com:8080"

一般的な用途

  1. データベース接続文字列postgres://user:pass@localhost:5432/mydb
  2. FTPアクセスftp://user:pass@ftp.example.com/files/
  3. GitリモートURLhttps://token@github.com/org/repo.git
  4. Redis/AMQPredis://default:password@cache.internal:6379

セキュリティに関する考慮事項

  • WebアプリケーションではパスワードをURLに入れないこと — ブラウザ履歴、サーバーログ、HTTP Refererヘッダーに表示されます
  • モダンブラウザはHTTP/HTTPS URLの認証情報を削除または警告する場合があります
  • 認証情報を含むデータベースやサービスの接続文字列はコードではなく環境変数に保存すべきです
  • パスワード内の@文字は%40としてパーセントエンコードする必要があります

特殊文字

ユーザー名とパスワードの値に予約文字が含まれる場合はパーセントエンコードが必要です:

文字 エンコード
@ %40
: %3A
/ %2F
# %23
? %3F

ユースケース

認証付きURLの解析は、データベース接続文字列、内部APIエンドポイント、サービスディスカバリーを扱う際に一般的です。DevOpsエンジニアはPostgreSQL、MongoDB、Redis、RabbitMQの接続文字列を頻繁に構築・解析します。userinfo解析の理解は、ログに誤って認証情報を公開するなどのセキュリティ問題のキャッチに役立ちます。

試してみる — URL Parser & Builder

フルツールを開く