Acredito que Websocket já tem criptogria sobre o TLS (WebSocket Secure). Não faria sentido implementar sua própria camada de criptografia em cima dele.

Mesmo assim eu acho que é melhor usar HTTPS (API REST) para a maioria das coisas pois a complexidade é bem menor. Websocket é mais para coisas de tempo real como Chats ou Jogos (na verdade UDP seria melhor que TCP para jogos mas o Websocket só funciona sobre TCP) e é uma conexão bidirecional entre o navegador e o servidor.

Se você precisar manter uma conexão aberta entre o servidor e o navegador, mas permitindo que apenas o servidor envie dados para o navegador, você pode utilizar Server Side Events.

Também poderia utilizar Long Polling como o @Viserion sugeriu.

Abaixo, o primeiro link é um artigo com os prós e contras de cada um.

Fontes: https://dev.to/karanpratapsingh/system-design-long-polling-websockets-server-sent-events-sse-1hip https://developer.mozilla.org/pt-BR/docs/Web/API/Server-sent_events/Using_server-sent_events https://en.wikipedia.org/wiki/WebSocket

Curiosidade: Uma forma de usar UDP no navegador é pelo WebRTC (p2p) mas fazendo de forma que só exista um servidor principal. Mesmo assim se pudesse usar UDP em sockets seria muito melhor para jogos, permitindo escrever seu próprio protocolo de rede.

Veja este excelente artigo de Glenn Fiedler https://gafferongames.com/post/why_cant_i_send_udp_packets_from_a_browser/

Obrigado por postar esse link do curso de System Design. Tremendo material! Devorando ele pra revisar algumas coisas. :)

Obrigado! O engraçado é que eu achei ele quanndo estava escrevendo a resposta sobre Websockets. Procurei ouro e achei diamante kkkk Já fiz o fork do repositório dele pra garantir que eu não perca: https://github.com/karanpratapsingh/system-design