認証付き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"
一般的な用途
- データベース接続文字列 —
postgres://user:pass@localhost:5432/mydb - FTPアクセス —
ftp://user:pass@ftp.example.com/files/ - GitリモートURL —
https://token@github.com/org/repo.git - Redis/AMQP —
redis://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解析の理解は、ログに誤って認証情報を公開するなどのセキュリティ問題のキャッチに役立ちます。