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
- Chapitre précédent : 2. Conformance Requirements (Exigences de conformité)
- Chapitre suivant : 4. Opening Handshake (Poignée de main d'ouverture)
- Guide d'implémentation : Détails sur les URI WebSocket