メインコンテンツまでスキップ

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

参考リンク​