3. WebSocket URIs
Questa specifica definisce due schemi URI utilizzando la sintassi ABNF e la terminologia della RFC 3986.
Definizioni degli schemi URI
ws-URI (Non crittografato)
ws-URI = "ws:" "//" host [ ":" port ] path [ "?" query ]
- Nome dello schema: ws
- Porta predefinita: 80
- Scopo: Connessioni WebSocket non crittografate
Esempi:
ws://example.com/socket
ws://example.com:8080/chat
ws://192.168.1.1/data
wss-URI (Crittografato TLS)
wss-URI = "wss:" "//" host [ ":" port ] path [ "?" query ]
- Nome dello schema: wss
- Porta predefinita: 443
- Scopo: Connessioni WebSocket crittografate TLS
Esempi:
wss://example.com/socket
wss://secure.example.com:8443/chat
Descrizione dei componenti URI
host
Il componente host può essere:
- Nome di dominio:
example.com - Indirizzo IPv4:
192.168.1.1 - Indirizzo IPv6:
[2001:db8::1]
port (porta)
- Se omesso, utilizza la porta predefinita (80 per ws, 443 per wss)
- Può specificare esplicitamente qualsiasi porta valida
path (percorso)
- Deve iniziare con
/ - Predefinito
/se vuoto
query (stringa di query)
- Parametri di query opzionali
- Formato:
?key1=value1&key2=value2
Considerazioni sulla sicurezza
Raccomandato: Utilizzare wss://
Negli ambienti di produzione, è fortemente raccomandato utilizzare wss:// (crittografato TLS) invece di ws://:
✅ Vantaggi di wss://:
- Trasmissione crittografata, previene attacchi man-in-the-middle
- Previene l'intercettazione dei dati
- Migliore capacità di attraversamento firewall
- Supporto per le politiche di sicurezza del browser (ad esempio, politica dei contenuti misti)
❌ Rischi di ws://:
- Dati trasmessi in chiaro
- Facilmente intercettabili e manipolabili
- I browser possono bloccare le connessioni ws:// da pagine HTTPS
Validazione dell'origine
I server dovrebbero validare l'header Origin per garantire che vengano accettate solo connessioni da fonti affidabili:
// Esempio di validazione lato server
const allowedOrigins = ['https://example.com', 'https://app.example.com'];
const origin = request.headers['origin'];
if (!allowedOrigins.includes(origin)) {
response.status(403).send('Forbidden');
}
Esempi di parsing URI
Esempio 1: URI completo
wss://chat.example.com:8443/room/general?user=alice
Risultato del parsing:
- Scheme: wss
- Host: chat.example.com
- Port: 8443
- Path: /room/general
- Query: user=alice
Esempio 2: URI minimo
ws://example.com
Risultato del parsing:
- Scheme: ws
- Host: example.com
- Port: 80 (predefinito)
- Path: / (predefinito)
- Query: (nessuna)
Esempio 3: Indirizzo IPv6
wss://[2001:db8::1]:443/socket
Risultato del parsing:
- Scheme: wss
- Host: 2001:db8::1
- Port: 443
- Path: /socket
Esempi di utilizzo nel browser
Client JavaScript
// Connessione a WebSocket non crittografato
const ws1 = new WebSocket('ws://example.com/socket');
// Connessione a WebSocket crittografato TLS (raccomandato)
const ws2 = new WebSocket('wss://example.com/socket');
// Con porta e percorso
const ws3 = new WebSocket('wss://example.com:8443/chat/room1');
// Con parametri di query
const ws4 = new WebSocket('wss://example.com/socket?token=abc123');
Specifiche correlate
- RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
- RFC 2818: HTTP Over TLS
Link di riferimento
- Capitolo precedente: 2. Conformance Requirements (Requisiti di conformità)
- Capitolo successivo: 4. Opening Handshake (Handshake di apertura)
- Guida all'implementazione: Dettagli URI WebSocket