3. WebSocket URIs
本仕様は、ABNF構文とRFC 3986で定義された用語を使用して、2つのURIスキームを定義します。
URIスキームの定義
ws-URI (非暗号化)
ws-URI = "ws:" "//" host [ ":" port ] path [ "?" query ]
- スキーム名: ws
- デフォルトポート: 80
- 用途: 非暗号化WebSocket接続
例:
ws://example.com/socket
ws://example.com:8080/chat
ws://192.168.1.1/data
wss-URI (TLS暗号化)
wss-URI = "wss:" "//" host [ ":" port ] path [ "?" query ]
- スキーム名: wss
- デフォルトポート: 443
- 用途: TLS暗号化されたWebSocket接続
例:
wss://example.com/socket
wss://secure.example.com:8443/chat
URIコンポーネントの説明
host (ホスト)
ホスト部分は以下のいずれかです:
- ドメイン名:
example.com - IPv4アドレス:
192.168.1.1 - IPv6アドレス:
[2001:db8::1]
port (ポート)
- 省略された場合、デフォルトポートを使用(wsは80、wssは443)
- 任意の有効なポートを明示的に指定可能
path (パス)
/で始まる必要があります- 空の場合、デフォルトは
/
query (クエリ文字列)
- オプションのクエリパラメータ
- 形式:
?key1=value1&key2=value2
セキュリティに関する考慮事項
推奨: wss://を使用
本番環境では、ws://ではなくwss://(TLS暗号化)の使用を強く推奨します:
✅ wss://の利点:
- 暗号化された転送、中間者攻撃を防止
- データの盗聴を防止
- より優れたファイアウォール通過能力
- ブラウザのセキュリティポリシーのサポート(混合コンテンツポリシーなど)
❌ ws://のリスク:
- データが平文で転送される
- 傍受および改ざんが容易
- ブラウザがHTTPSページからのws://接続をブロックする可能性
オリジンの検証
サーバーはOriginヘッダーを検証し、信頼できるソースからの接続のみを受け入れる必要があります:
// サーバー側検証の例
const allowedOrigins = ['https://example.com', 'https://app.example.com'];
const origin = request.headers['origin'];
if (!allowedOrigins.includes(origin)) {
response.status(403).send('Forbidden');
}
URI解析の例
例1: 完全なURI
wss://chat.example.com:8443/room/general?user=alice
解析結果:
- Scheme: wss
- Host: chat.example.com
- Port: 8443
- Path: /room/general
- Query: user=alice
例2: 最小のURI
ws://example.com
解析結果:
- Scheme: ws
- Host: example.com
- Port: 80 (デフォルト)
- Path: / (デフォルト)
- Query: (なし)
例3: IPv6アドレス
wss://[2001:db8::1]:443/socket
解析結果:
- Scheme: wss
- Host: 2001:db8::1
- Port: 443
- Path: /socket
ブラウザでの使用例
JavaScriptクライアント
// 非暗号化WebSocketに接続
const ws1 = new WebSocket('ws://example.com/socket');
// TLS暗号化WebSocketに接続(推奨)
const ws2 = new WebSocket('wss://example.com/socket');
// ポートとパスを指定
const ws3 = new WebSocket('wss://example.com:8443/chat/room1');
// クエリパラメータを使用
const ws4 = new WebSocket('wss://example.com/socket?token=abc123');
関連仕様
- RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
- RFC 2818: HTTP Over TLS
参考リンク
- 前の章: 2. Conformance Requirements (適合性要件)
- 次の章: 4. Opening Handshake (オープニングハンドシェイク)
- 実装ガイド: WebSocket URI詳細