API, Autentikasi, dan Keamanan · 5/7
Authorization: siapa boleh melakukan apa
Authentication itu siapa kamu. Authorization itu apa yang boleh kamu sentuh — dan harus diperiksa di server, setiap kali.
Baca 28 menit
Setelah pelajaran ini kamu bisa
- Membedakan authentication dari authorization
- Memeriksa kepemilikan, bukan cuma identitas
- Mengenali IDOR saat code review
- Menjelaskan kenapa menyembunyikan tombol bukan pemeriksaan izin
Authentication itu *kamu siapa*. Authorization itu *kamu boleh menyentuh apa*. Keduanya pertanyaan berbeda, gagal dengan cara berbeda, dan mencampuradukkannya adalah bug serius paling umum di aplikasi web.
Authorization punya dua lapis, dan hanya memeriksa yang pertama itulah tempat masalahnya muncul.
- Role — apakah seorang *lead* boleh melakukan ini sama sekali? Kasar, mudah, biasanya diingat.
- Kepemilikan — apakah record *tertentu* ini miliknya? Halus, dan inilah yang sering terlupakan.
IDOR
IDOR — insecure direct object reference — adalah apa yang kamu dapat saat kamu memeriksa seseorang sudah masuk, lalu bertindak atas id apa pun yang mereka kirim. Ini tidak butuh alat: cukup ubah satu angka di URL.
Tiga handler, satu penyerang yang mengubah sebuah id. Hanya yang ketiga bertahan.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
Di mana pemeriksaannya harus berada
Taruh pemeriksaannya di tempat datanya disentuh. Apa pun yang lebih awal dari itu adalah optimasi yang bisa dilewati.
| Lapisan | Apakah ini kontrol keamanan? |
|---|---|
| Menyembunyikan tombolnya di UI | Tidak. Cuma kosmetik. |
| Pemeriksaan di proxy | Tidak. Ia melewati /api, dan action dijangkau POST langsung. |
| Pemeriksaan di component halaman | Ya, untuk rendering halaman itu |
| Pemeriksaan di dalam Server Action | Ya. Inilah yang sebenarnya. |
| Pemeriksaan di dalam Route Handler | Ya. |
| Constraint di database | Ya — garis pertahanan terakhir |
Matriks izin, cara menjaga aturan role tetap terbaca begitu jumlahnya lebih dari dua.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
Tugas praktik
Di proyek ini, daftarkan dua akun. Yang pertama jadi lead. Masuk sebagai yang kedua (learner) lalu buka /id/dashboard — kamu seharusnya melihat progresmu sendiri tapi tanpa tabel tim. Sekarang temukan pemeriksaan di app/[lang]/dashboard/page.tsx yang memutuskan ini, dan pastikan ia terjadi di server alih-alih dengan menyembunyikan markup.
Hasil yang diharapkan
`listUsers()` tidak pernah dipanggil untuk learner, jadi datanya tidak pernah sampai ke browser.
Cek pemahaman
Pilih jawaban dulu