Passa al contenuto principale

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