Aller au contenu principal

3. WebSocket URIs

Cette spécification définit deux schémas d'URI utilisant la syntaxe ABNF et la terminologie de la RFC 3986.

Définitions des schémas d'URI

ws-URI (Non chiffré)

ws-URI = "ws:" "//" host [ ":" port ] path [ "?" query ]
  • Nom du schéma : ws
  • Port par défaut : 80
  • Objectif : Connexions WebSocket non chiffrées

Exemples :

ws://example.com/socket
ws://example.com:8080/chat
ws://192.168.1.1/data

wss-URI (Chiffré TLS)

wss-URI = "wss:" "//" host [ ":" port ] path [ "?" query ]
  • Nom du schéma : wss
  • Port par défaut : 443
  • Objectif : Connexions WebSocket chiffrées TLS

Exemples :

wss://example.com/socket
wss://secure.example.com:8443/chat

Description des composants d'URI

host (hôte)

Le composant hôte peut être :

  • Nom de domaine : example.com
  • Adresse IPv4 : 192.168.1.1
  • Adresse IPv6 : [2001:db8::1]

port

  • Si omis, utilise le port par défaut (80 pour ws, 443 pour wss)
  • Peut spécifier explicitement n'importe quel port valide

path (chemin)

  • Doit commencer par /
  • Par défaut / si vide

query (chaîne de requête)

  • Paramètres de requête optionnels
  • Format : ?key1=value1&key2=value2

Considérations de sécurité

Recommandé : Utiliser wss://

Dans les environnements de production, il est fortement recommandé d'utiliser wss:// (chiffré TLS) au lieu de ws:// :

Avantages de wss:// :

  • Transmission chiffrée, empêche les attaques de l'homme du milieu
  • Empêche l'écoute clandestine des données
  • Meilleure capacité de traversée de pare-feu
  • Support des politiques de sécurité du navigateur (par exemple, politique de contenu mixte)

Risques de ws:// :

  • Données transmises en texte clair
  • Facilement interceptées et altérées
  • Les navigateurs peuvent bloquer les connexions ws:// depuis des pages HTTPS

Validation de l'origine

Les serveurs doivent valider l'en-tête Origin pour s'assurer que seules les connexions provenant de sources fiables sont acceptées :

// Exemple de validation côté serveur
const allowedOrigins = ['https://example.com', 'https://app.example.com'];
const origin = request.headers['origin'];

if (!allowedOrigins.includes(origin)) {
response.status(403).send('Forbidden');
}

Exemples d'analyse d'URI

Exemple 1 : URI complète

wss://chat.example.com:8443/room/general?user=alice

Résultat de l'analyse :

  • Scheme : wss
  • Host : chat.example.com
  • Port : 8443
  • Path : /room/general
  • Query : user=alice

Exemple 2 : URI minimale

ws://example.com

Résultat de l'analyse :

  • Scheme : ws
  • Host : example.com
  • Port : 80 (par défaut)
  • Path : / (par défaut)
  • Query : (aucune)

Exemple 3 : Adresse IPv6

wss://[2001:db8::1]:443/socket

Résultat de l'analyse :

  • Scheme : wss
  • Host : 2001:db8::1
  • Port : 443
  • Path : /socket

Exemples d'utilisation dans le navigateur

Client JavaScript

// Se connecter à un WebSocket non chiffré
const ws1 = new WebSocket('ws://example.com/socket');

// Se connecter à un WebSocket chiffré TLS (recommandé)
const ws2 = new WebSocket('wss://example.com/socket');

// Avec port et chemin
const ws3 = new WebSocket('wss://example.com:8443/chat/room1');

// Avec paramètres de requête
const ws4 = new WebSocket('wss://example.com/socket?token=abc123');

Spécifications connexes

  • RFC 3986 : Uniform Resource Identifier (URI): Generic Syntax
  • RFC 2818 : HTTP Over TLS

Liens de référence