Agensi Mata-Mata 3.0: Cara Mengamankan WebSockets dengan Autentikasi JWT

Dalam artikel ini, kami menjelajahi cara mengamankan komunikasi WebSocket menggunakan autentikasi JWT untuk melindungi data sensitif selama operasi real-time.

Sebelumnya, kita telah menjelajahi cara merancang operasi real-time menggunakan WebSockets + DTOs.

Agensi Mata-Mata 2.0: Cara Merancang Operasi Real-Time dengan WebSockets + DTOs
Dalam lanskap teknologi yang bergerak cepat saat ini, merancang operasi real-time yang efisien dan aman sangat penting bagi aplikasi. Artikel ini menjelaskan bagaimana memanfaatkan WebSockets dan Data Transfer Objects (DTO) dapat meningkatkan kinerja dan keamanan aplikasi Anda.

Kini, kita menghadapi misi berisiko tinggi. Kita perlu memastikan bahwa komunikasi WebSocket tetap aman selama misi kita. Jika musuh menyusup ke saluran real-time kita, intelijen rahasia bisa dikompromikan.

Tugas Anda? Implementasikan autentikasi JWT untuk memastikan hanya pegawai yang terotorisasi yang dapat mengakses jaringan kita. Mari kita mulai!

1️⃣ Mengapa Mengamankan WebSockets?

Mengapa Mengamankan WebSockets?


WebSockets memungkinkan komunikasi instan dua arah, tetapi tanpa langkah keamanan yang tepat, agen musuh bisa:

  • Menyadap transmisi (Kebocoran intel sensitif)
  • Menyamar sebagai pegawai (Pembajakan sesi)
  • Meluncurkan serangan tidak sah (Mengkompromikan data penting misi)

🔹 Tujuan Anda: Autentikasi setiap agen sebelum mereka membangun koneksi menggunakan JWT!

2️⃣ Cara JWT + WebSockets Bekerja Bersama

Langkah 1: Autentikasi Agen (Penerbitan JWT)

Sebelum seorang agen dapat mengakses saluran misi WebSocket, mereka harus terlebih dahulu autentikasi dan mendapatkan izin yang tepat.

1. Agen masuk ke HQ via API yang aman

  • Agen memberikan kredensial operasional mereka (misalnya, nama pengguna & kata sandi atau autentikasi multi-faktor).
  • Permintaan dikirim melalui HTTPS untuk mencegah penyadapan.

Contoh permintaan API:

POST /api/auth/login  
Content-Type: application/json  
{ "username": "AgentX", "password": "TopSecret123" }

2. Server memvalidasi kredensial dan menerbitkan token JWT

  • Jika autentikasi berhasil, server menghasilkan JWT (JSON Web Token) yang berisi:
    • ID unik agen
    • tingkat izin mereka
    • waktu kedaluwarsa untuk membatasi sesi
  • JWT ditandatangani menggunakan kunci pribadi untuk mencegah manipulasi.

Contoh payload JWT:

{
  "sub": "AgentX",
  "role": "field-operative",
  "exp": 1714598400
}

3. Agen Menerima Token JWT

Agen menerima token JWT sebagai bagian dari respons server setelah permintaan autentikasi berhasil. Token biasanya diberikan sebagai cookie yang hanya untuk HTTP.

Server Mengirim JWT sebagai Cookie HTTP-Saja (Lebih Aman)
Untuk keamanan yang lebih baik, server mengatur cookie yang hanya untuk HTTP yang secara otomatis dikirim dengan permintaan.

Contoh Respons HTTP (Metode Cookie)

HTTP/1.1 200 OK  
Set-Cookie: jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...; HttpOnly; Secure; SameSite=Strict  
  • Browser secara otomatis menyimpan cookie, dan ini disertakan dalam permintaan berikutnya.
  • Tidak perlu penyimpanan sisi klien.
  • Token tidak dapat diakses oleh JavaScript, mencegah serangan XSS.

Contoh Sisi Klien (Tidak Perlu Menyimpan JWT Secara Manual)

fetch("https://hq-secure.com/api/auth/login", {
  method: "POST",
  credentials: "include", // Memastikan cookie dikirim dengan permintaan
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ username: "AgentX", password: "TopSecret123" }),
})
  .then(response => {
    if (response.ok) console.log("Login berhasil, JWT disimpan dalam cookie HttpOnly!");
  })
  .catch(error => console.error("Autentikasi gagal", error));

Kekurangan: WebSockets tidak secara otomatis menyertakan cookie dalam permintaan koneksi. Klien perlu mengambil JWT dari cookie dan melampirkannya saat membuka koneksi WebSocket.

Langkah 2: Membangun Koneksi WebSocket yang Aman

Setelah terautentikasi, agen harus menyajikan token izin mereka saat memulai koneksi WebSocket.

1. Agen menyajikan JWT saat permintaan koneksi

  • Klien WebSocket menyertakan JWT dalam header permintaan atau sebagai parameter kueri.

Contoh permintaan koneksi WebSocket:

const socket = new WebSocket("wss://hq-secure.com/missions?token=eyJhbGciOiJIUzI1...");

2. Server WebSocket memverifikasi izin sebelum membangun tautan

  • Server mengekstrak dan memvalidasi JWT, memeriksa:
    • Integritas tanda tangan (untuk memastikan tidak diubah)
    • Waktu kedaluwarsa (untuk menolak token yang sudah kadaluwarsa)
    • Tingkat izin agen (untuk memungkinkan hanya akses terotorisasi)
    • Jika JWT tidak valid atau kedaluwarsa, koneksi ditolak.

3. Kontrol Akses: Beri atau Tolak

  • Jika valid, koneksi WebSocket terbentuk, memungkinkan agen menerima pembaruan penting misi.
  • Jika tidak valid atau kedaluwarsa, server segera menutup koneksi.

Contoh validasi sisi server:

if (!isValidJWT(token)) {
    socket.close(4001, "Unauthorized: Invalid Token");
}

Dengan menegakkan autentikasi berbasis JWT untuk koneksi WebSocket, kita memastikan bahwa hanya agen yang terotorisasi yang dapat mengakses data misi sambil mempertahankan komunikasi real-time yang aman.

3️⃣ Mengimplementasikan JWT + WebSockets di Node.js

Langkah 1: Instal Alat yang Diperlukan

npm install express socket.io jsonwebtoken cors

Langkah 2: Menghasilkan & Memverifikasi Kredensial JWT

const jwt = require("jsonwebtoken");
const SECRET_KEY = "top_secret_mission_code"; // 🔥 Simpan ini dengan rahasia!

// Menghasilkan Token Izin yang Aman
function generateToken(agent) {
  return jwt.sign({ id: agent.id, codename: agent.codename }, SECRET_KEY, { expiresIn: "1h" });
}

// Memverifikasi Izin Agen
function verifyToken(token) {
  try {
    return jwt.verify(token, SECRET_KEY);
  } catch (err) {
    return null;
  }
}

Langkah 3: HQ WebSocket - Menerima Hanya Pegawai Terotorisasi

const express = require("express");
const http = require("http");
const { Server } = require("socket.io");

const app = express();
const server = http.createServer(app);
const io = new Server(server, { cors: { origin: "*" } });

// Komunikasi WebSocket yang Aman
io.use((socket, next) => {
  const token = socket.handshake.auth.token;
  const agent = verifyToken(token);
  if (!agent) return next(new Error("Akses Tidak Sah - Izin Ditolak!"));
  socket.agent = agent; // Lampirkan detail agen ke sesi
  next();
});

io.on("connection", (socket) => {
  console.log(`Agen Terhubung: ${socket.agent.codename}`);

  socket.on("message", (msg) => {
    console.log(`Transmisi dari ${socket.agent.codename}: ${msg}`);
  });

  socket.on("disconnect", () => {
    console.log(`Agen Terputus: ${socket.agent.codename}`);
  });
});

server.listen(3000, () => console.log("HQ WebSocket yang Aman berjalan di port 3000"));

Sekarang, hanya agen yang terverifikasi yang dapat membangun saluran komunikasi yang aman!

4️⃣ Setup Agen Lapangan: Menghubungkan dengan WebSocket Aman

Langkah 1: Instal Modul Klien WebSocket

npm install socket.io-client

Langkah 2: Koneksi Agen Lapangan ke HQ

import { io } from "socket.io-client";

const clearanceToken = localStorage.getItem("jwt"); // Ambil token yang aman
const socket = io("http://localhost:3000", {
  auth: { token: clearanceToken },
});

socket.on("connect", () => {
  console.log("✅ Saluran Aman Didirikan dengan HQ!");
});

socket.on("message", (msg) => {
  console.log("Transmisi Masuk:", msg);
});

socket.on("disconnect", () => {
  console.log("Saluran Aman Hilang! Mencoba lagi...");
});

Sekarang, hanya agen dengan token izin valid yang dapat mengakses pembaruan penting misi!

5️⃣ Protokol Keamanan Agen: Praktik Terbaik

Gunakan cookie yang hanya untuk HTTP untuk menyimpan JWT (mencegah serangan XSS dari musuh).
Atur token berumur pendek (misalnya, validitas 1 jam) untuk meminimalkan risiko pelanggaran.
Implementasikan refresh token untuk melakukan re-autentikasi agen setelah kedaluwarsa.
Enkripsi saluran WebSocket (WSS) menggunakan SSL/TLS untuk komunikasi yang aman.
Pantau & catat semua koneksi WebSocket untuk mendeteksi aktivitas mencurigakan.

6️⃣ Bagaimana EchoAPI Membantu

Fitur EchoAPI

EchoAPI adalah alat yang kuat yang memungkinkan Anda menguji, memperbaiki, dan memantau komunikasi WebSocket secara real-time.

Manfaat EchoAPI:

  • Solusi API All-in-One → Rancang, uji, perbaiki, integrasi CI/CD, layanan tiruan, pengujian stres, dan dokumentasi yang mulus—semua dalam satu tempat.
  • Tanpa Memerlukan Login → Akses dan gunakan tanpa pengaturan akun—langsung saja dan mulai bekerja!
  • Impor Bertenaga AI → Ubah dokumen API menjadi antarmuka yang dapat dioperasikan dengan alat pengenalan cerdas.
  • Plugin Gratis → Kompatibel dengan IntelliJ IDEA, VS Code, Cursor, dan Chrome—tanpa biaya tambahan.
  • Dukungan Offline → Bekerja kapan saja, di mana saja—tanpa memerlukan internet.
  • Berbagai Protokol Komunikasi → Mendukung HTTP, GraphQL, WebSocket, TCP, SSE, dan lainnya.
  • Autentikasi Cerdas → Dukungan bawaan untuk OAuth 2.0, JWT Bearer, AWS Signature, Basic Auth, Hawk Authentication, dan lainnya.
  • Kompatibilitas Lintas Alat → Impor/ekspor proyek dari Postman, Swagger, dan Insomnia dengan mudah.
  • Kolaborasi Tim yang Mudah → Bekerja secara real-time, sinkronisasi data instan, dan berbagi kemajuan dengan mulus.
EchoAPI: Alternatif Ringan ke Postman
EchoAPI menawarkan solusi pengembangan API yang efisien dan terintegrasi, mengatasi masalah penggunaan alat berat seperti Postman.

Misi Selesai: Mengapa JWT + WebSockets?

Fitur Keamanan Manfaat Misi
Autentikasi JWT Memastikan hanya agen terotorisasi yang terhubung
Tanpa Memerlukan Polling API Mengurangi beban server HQ
Pembaruan Real-Time yang Aman Melindungi intel rahasia
Identitas Persisten Mempertahankan sesi di seluruh reconnect

Perintah HQ: Anda kini memiliki alat untuk membangun jaringan real-time yang aman menggunakan JWT & WebSockets. Terapkan strategi ini di lapangan dan pastikan tidak ada akses tidak sah terhadap komunikasi penting misi!