Keamanan web itu soal menjaga kode yang kamu tulis supaya gak gampang disalahgunakan orang lain. Bayangin rumah: kamu gak cuma kepengen pintunya bisa ditutup, kamu kepengen ada kunci, gorden, lampu, dan tetangga yang ngeliat. Satu pengaman gampang ditembus, banyak pengaman bikin maling capek duluan. Kode yang kamu tulis adalah pintu itu, dan tiap endpoint adalah satu jalan masuk.
🧪 Tebakan cepat: sebuah endpoint
GET /admincuma menjalankanres.send(adminPanel), tanpa cek apa pun. Siapa yang bisa membukanya? Tebak dulu, jawabannya ada di bagian "Developer adalah pintu pertama".
Kenapa ini penting buat kamu
Tiap hari ada bot yang nyisir internet nyari celah, dan mereka gak peduli aplikasimu besar atau kecil. Kalau ada lubang, mereka nemu. Dampaknya nyata: data user bocor, perusahaan kena denda dan kehilangan kepercayaan, dan kamu yang nulis kodenya ikut repot. Security bukan fitur tambahan yang dikerjain belakangan, tapi cara kita nulis tiap baris.
Satu istilah yang bakal sering muncul: vulnerability, atau dalam bahasa Indonesia kerentanan. Vulnerability adalah celah atau kelemahan di software yang bisa dimanfaatkan penyerang buat masuk tanpa izin atau merusak sistem. Jadi kalau kamu dengar "aplikasi ini punya vulnerability", artinya ada pintu yang gak terkunci.
CIA Triad: tiga hal yang kita jaga
Keamanan informasi dibangun di atas tiga pilar, disingkat CIA. Ini bukan nama badan intelijen, tapi tiga kata.
- Confidentiality (kerahasiaan): cuma orang yang berhak yang bisa melihat data. Password orang lain, isi chat, nomor kartu, semua harus tertutup. Dijaga pakai enkripsi dan kontrol akses.
- Integrity (integritas): data gak bisa diubah diam-diam. Saldo, harga, dan hasil transaksi harus persis seperti yang seharusnya. Dijaga pakai hashing dan tanda tangan digital.
- Availability (ketersediaan): sistemnya tetap hidup waktu dibutuhkan. Kalau server dibanjiri sampai tumbang, user gak bisa pakai, dan itu juga masalah keamanan.
Huruf C berdiri untuk Confidentiality. Itu pilar pertamanya.
Developer adalah pintu pertama
Keamanan dimulai dari kode. Lihat endpoint admin yang tadi, versi rentannya seperti ini:
// RENTAN: siapa pun yang tahu URL-nya bisa buka panel admin
app.get('/admin', (req, res) => {
res.send(adminPanel)
})
- Gak ada pengecekan sama sekali sebelum
res.send. Masalahnya: tidak ada autentikasi. Siapa pun yang mengetik/admindi browser langsung dapat panelnya, gak perlu login, gak perlu jadi admin. Itu jawaban tebakannya: semua orang bisa membukanya.
Versi yang diperbaiki memasang pengecekan dulu:
// AMAN: cek login dulu, lalu cek apakah dia admin
app.get('/admin', requireLogin, requireAdmin, (req, res) => {
res.send(adminPanel)
})
requireLoginmenolak tamu yang belum login dengan status 401.requireAdminmenolak user biasa yang sudah login tapi bukan admin, dengan status 403.- Baru setelah dua pintu itu lolos, panel dikirim. Dua hal yang berbeda:
requireLoginmemastikan siapa kamu (autentikasi),requireAdminmemastikan kamu boleh (otorisasi).
Defense in depth: jangan andalkan satu lapis
Di Lab, ada sebuah request GET /admin dari seorang tamu, dan kamu bisa menyalakan lapisan satu per satu: requireLogin, requireAdmin, rateLimit, auditLog. Dengan semua lapisan mati, tamu langsung sampai ke data admin. Nyalakan requireLogin, tamu berhenti di pintu pertama. Inilah defense in depth: pasang beberapa lapisan, jadi kalau satu lapis jebol, lapis berikutnya masih menahan.
requireLogindanrequireAdminmenjaga akses.rateLimitmenahan serangan coba-coba password berkali-kali.auditLoggak menolak apa pun, tapi mencatat tiap percobaan, jadi kalau ada yang menyerang, kamu tahu.
Gak ada sistem yang seratus persen aman. Tujuannya bukan "gak bisa dijebol", tapi bikin penyerang harus kerja jauh lebih mahal daripada nilai yang dia incar.
⚠️ Jebakan yang sering ketemu
- "Aplikasi kecil gak akan diserang." Salah. Bot nyisir alamat secara otomatis, bukan milih korban terkenal.
- Endpoint tanpa pengecekan. Sembunyiin URL admin bukan pengaman. Selalu pasang autentikasi dan otorisasi, bukan cuma berharap gak ada yang menebak alamatnya.
- Percaya input user mentah. Input dari form, URL, header, dan cookie semua harus dianggap berbahaya sampai diperiksa.
- Nyimpen rahasia di dalam kode. Password dan API key yang ditulis di kode bisa ikut ter-upload ke repo publik dan bocor selamanya. Pakai environment variable.
TL;DR: Keamanan web wajib di tiap baris kode, karena bot nyari celah tiap hari dan dampak kebocoran itu nyata. Vulnerability berarti celah yang bisa dimanfaatkan penyerang. CIA Triad adalah tiga hal yang dijaga: Confidentiality (kerahasiaan), Integrity (integritas), Availability (ketersediaan). Endpoint seperti GET /admin tanpa pengecekan berarti tidak ada autentikasi, jadi siapa pun bisa masuk, maka pasang requireLogin lalu requireAdmin. Defense in depth berarti banyak lapisan, biar satu jebol pun masih ada yang menahan.