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​