Apa itu WebSocket, dan Cara Implementasi WebSocket pada NodeJS (Part 3 dari 3)

Pendahuluan: Membawa WebSocket ke Level Berikutnya
Di dua bagian sebelumnya, kita telah mempelajari dasar WebSocket dan cara membuat komunikasi dua arah antara server dan client. Pada Part 3 ini, kita akan melanjutkan ke implementasi lanjutan, seperti:
-
Menambahkan autentikasi pengguna.
-
Mengintegrasikan WebSocket dengan ExpressJS.
-
Mengoptimalkan performa dan keamanan WebSocket.
Tujuan akhirnya adalah membuat sistem WebSocket yang siap digunakan di lingkungan produksi.
1. Menggabungkan WebSocket dengan ExpressJS
Biasanya dalam proyek nyata, kita tidak hanya menggunakan WebSocket, tapi juga framework seperti ExpressJS untuk mengelola rute HTTP biasa. Untungnya, WebSocket bisa dengan mudah diintegrasikan dengan Express.
Contoh Kode:
const express = require("express"); const http = require("http"); const WebSocket = require("ws"); const app = express(); const server = http.createServer(app); const wss = new WebSocket.Server({ server }); app.get("/", (req, res) => { res.send("Aplikasi WebSocket dengan Express"); }); wss.on("connection", (ws) => { console.log("Client terhubung melalui WebSocket"); ws.on("message", (message) => { console.log("Pesan diterima:", message); ws.send("Pesan diterima oleh server melalui Express WebSocket"); }); }); server.listen(3000, () => { console.log("Server berjalan di http://localhost:3000"); });
Kode di atas menunjukkan bahwa WebSocket bisa hidup berdampingan dengan Express dalam satu server.
Dengan begitu, kita bisa membuat API REST untuk data statis dan WebSocket untuk data real-time.
2. Menambahkan Autentikasi WebSocket
Dalam aplikasi produksi, tidak semua orang boleh mengakses koneksi WebSocket.
Salah satu cara sederhana untuk menambahkan keamanan adalah menggunakan token autentikasi (misalnya JWT) sebelum koneksi dibuka.
Contoh Autentikasi Token:
const jwt = require("jsonwebtoken"); wss.on("connection", (ws, req) => { const token = req.url.split("token=")[1]; try { const user = jwt.verify(token, "rahasia"); ws.user = user; console.log("User terautentikasi:", user.username); } catch (err) { ws.close(); console.log("Autentikasi gagal"); } });
Dengan cara ini, hanya pengguna dengan token yang valid yang bisa tetap terhubung.
3. Optimisasi Performa dan Keamanan
Ketika jumlah client meningkat, performa menjadi faktor penting. Berikut beberapa tips agar sistem WebSocket tetap efisien:
a. Gunakan Kompresi Pesan
Aktifkan kompresi data untuk pesan yang dikirim agar lebih ringan.
const wss = new WebSocket.Server({ server, perMessageDeflate: true });
b. Gunakan Ping-Pong untuk Menjaga Koneksi
Beberapa koneksi bisa mati tanpa terdeteksi. Gunakan “ping-pong” untuk memastikan koneksi masih aktif.
setInterval(() => { wss.clients.forEach((ws) => { if (ws.isAlive === false) return ws.terminate(); ws.isAlive = false; ws.ping(); }); }, 30000);
c. Gunakan HTTPS dan WSS
Gunakan WSS (WebSocket Secure) agar data terenkripsi dan tidak mudah disadap.
Biasanya ini berjalan di atas HTTPS, menggunakan sertifikat SSL.
4. Menangani Skala Besar (Clustering)
Jika aplikasi Anda memiliki ribuan pengguna, WebSocket perlu dijalankan di beberapa server.
Untuk itu, gunakan sistem seperti Redis Pub/Sub untuk menghubungkan antar server WebSocket.
const redis = require("redis"); const publisher = redis.createClient(); const subscriber = redis.createClient(); subscriber.on("message", (channel, message) => { wss.clients.forEach((ws) => { if (ws.readyState === WebSocket.OPEN) ws.send(message); }); }); subscriber.subscribe("chat");
Dengan cara ini, pesan yang dikirim dari satu server akan diteruskan ke server lain melalui Redis.
Kesimpulan Akhir
Selama tiga bagian pembahasan ini, kita telah mempelajari:
-
Konsep dasar dan cara kerja WebSocket.
-
Implementasi dua arah dan broadcast antar client.
-
Integrasi dengan Express, autentikasi, dan optimisasi performa.
Dengan pemahaman ini, Anda sekarang dapat membangun aplikasi real-time seperti chat, notifikasi, atau dashboard data langsung menggunakan NodeJS dan WebSocket.