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

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

参考リンク