Game browser real-time ala TinyWind menuntut otentikasi dan sesi yang ketat agar pemain tidak bisa memanipulasi physics, mengirim command berlebihan, atau mengekspos credential. Solusi praktis mencakup token pendek yang sering diputar, session store dengan metadata, validasi physics sisi server, kontrol upload asset, limitasi event, serta mekanisme pemantauan dan secret handling yang bisa diskalakan.
Arsitektur Auth dan Token Short-Lived dengan Rotasi
Gunakan token akses waktu pendek (misalnya 1-2 menit) yang dikeluarkan setelah login dan diganti secara berkala lewat refresh token berumur lebih panjang. Token pendek menjaga sesi tetap minimal saat kebocoran terjadi, sementara rotasi memperkecil window replay.
Implementasi tipikal menggunakan JWT atau opaque token di backend, lalu menyimpan metadata rotasi di Redis supaya backend bisa membatalkan token yang sudah dipakai.
// contoh skema Node.js (psuedocode)
const accessToken = createAccessToken({ userId }, { expiresIn: '90s' });
const rotationId = randomId();
await redis.set(`token:${rotationId}`, userId, 'EX', 120);
return { accessToken, rotationId };
// saat refresh
const storedUser = await redis.get(`token:${rotationId}`);
if (!storedUser) throw new Error('Token kadaluarsa');
await redis.del(`token:${rotationId}`);
return issueNewPair(storedUser);
Catatan: pastikan backend memvalidasi setiap request real-time (misalnya WebSocket message) dengan memverifikasi signature token atau mencocokkan rotationId yang aktif. Hindari menyimpan token di local storage; gunakan cookie HttpOnly untuk XHR/WS upgrade jika memungkinkan.
Pengelolaan Sesi dan Session Store
Session store harus mencakup metadata yang menunjang pengambilan keputusan keamanan, seperti IP terakhir, timestamp activity, dan platform browser. Gunakan TTL berbeda untuk sesi aktif (misalnya 5 menit) dibanding incative cleanup (misal 30 menit) untuk merespon pemain yang tiba-tiba hilang.
Policy terbaik:
- Segregasi sesi: setiap device mendapat entry unik agar invalidasi sesi tak mempengaruhi pemain lain.
- Activity sliding window: perpanjang TTL saat ada event penting (misalnya command valid) tapi jangan terlalu lebar to avoid abuse.
- Session revocation: sediakan endpoint admin untuk memblokir sessionId tertentu dan pastikan listener real-time memutus event saat sesi dihapus.
Validasi Input dan Logika Physics
Validasi tidak cukup dengan hanya memeriksa format; harus memverifikasi consistency terhadap physics game. Contohnya, periksa delta posisi dan kecepatan bersamaan dengan timestamp server, lalu tolak perintah yang melampaui batas wajar.
Pola yang bisa diterapkan:
- State reconciliation: server mengirim balik state canonical dan membandingkan input client. Komponen ini juga memantau apakah player selalu menunggu update sebelum mengirim command berikutnya.
- Rate-based filtering: hitung jumlah command per detik per session, dan throttle jika melebihi threshold untuk jenis command tertentu (misal teleport).
- Sanitize physics payload: periksa jenis dan range numeric, hindari dependency langsung pada data client yang bisa disuntik.
Debug: log perintah yang ditolak dengan alasan jelas (misal "delta-x terlalu besar") agar bisa mengidentifikasi pola exploit.
Kontrol Upload Aset yang Aman
Game browser real-time sering memperbolehkan upload skin atau avatar; kontrol upload menjadi lapisan penting.
Prinsip implementasi:
- Validasi MIME dan signature: jangan hanya mengandalkan ekstensi file. Gunakan library server-side untuk membaca header file.
- Ukuran terbatas: batasi maksimal 1-2MB dan terapkan chunk upload jika perlu.
- Scan dan quarantine: jika menggunakan storage object (S3), jalankan lambda/scan saat upload selesai, lalu pindahkan ke folder "approved".
- Tokenisasi akses: generate signed URL sekali pakai untuk upload agar URL tidak disalahgunakan.
Batasi risiko misuse dengan menggabungkan rate limit dan monitoring upload asset dari IP tertentu.
Rate Limit Event dan Deteksi Abuse
Untuk game real-time, rate limit tidak hanya pada HTTP, tapi juga per event WebSocket. Terapkan token bucket atau leaky bucket yang memantau command rate per session dan per tipe pesan.
Contoh parameter:
- Command kritikal: 60 request per menit.
- Ping heartbeat: 1 per 10 detik.
- Upload event: max 3 per 5 menit.
Atur pembatas Rapid untuk event burst, dan berikan response yang informatif (misalnya event ditolak dengan header "Retry-After").
Deteksi behavior mencurigakan dengan monitoring:
- Spike per session: notifikasi saat satu sesi mengirim 5 kali lipat command rata-rata.
- Multi-IP per akun: perhatikan jika satu akun tiba-tiba login dari banyak IP dalam durasi pendek.
- Silent abuse: bandingkan physics data untuk mendeteksi teleport atau movement tidak mungkin.
Integrasikan log ke observability stack (Grafana, Loki, dsb.) untuk membuat alert otomatis.
Secret Handling & Environment
Pelihara konfigurasi secret (JWT secret, API key, DB credential) di environment terpisah, tidak di dalam repo. Gunakan vault (HashiCorp, AWS Secrets Manager, dsb.) atau set environment secara CI/CD saat deploy.
Tips praktis:
- Rotasi terjadwal: ganti secret tiap bulan, disertai automation untuk deploy service dengan secret baru.
- Least privilege: tiap service hanya membaca secret yang diperlukan. Contohnya, service WebSocket tidak perlu API key billing.
- Auditing: catat akses secret, terutama kalau ada akses oleh automation/pipeline.
Untuk lokal, gunakan file .env.example tanpa nilai rahasia dan load dengan tool seperti direnv. Pastikan secret tidak tercetak ke log.
Kesimpulan
Penerapan keamanan auth & sesi pada game browser real-time membutuhkan kombinasi token pendek + rotasi, session store ber-TTL, validasi physics, kontrol upload, rate limit command, monitoring behavior, serta secret handling yang disiplin. Langkah-langkah ini menjaga pengalaman pemain ala TinyWind tetap responsif tanpa mengorbankan integritas sistem.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!