Dua kode ini kelihatan mirip — sama-sama artinya “akses ditolak”. Tapi sebenarnya keduanya menjawab dua pertanyaan yang berbeda. Salah pilih kode, API kamu jadi membingungkan dan berpotensi bocor informasi.
Inti Perbedaannya dalam Satu Kalimat
401 Unauthorized → Authentication — “Kamu ini siapa? Belum kenal aku.”
403 Forbidden → Authorization — “Aku sudah tahu kamu siapa, tapi kamu tidak punya izin untuk ini.”
1. 401 Unauthorized — Masalah Identitas
Server belum tahu siapa yang sedang mengakses. Kredensialnya tidak ada, tidak valid, atau sudah kedaluwarsa.
- Tidak mengirim token / API key sama sekali
- Token sudah expired
- Token rusak, dipalsukan, atau signature-nya tidak cocok
- Password / kredensial salah saat login
Ciri khas: server mengirim header WWW-Authenticate — semacam petunjuk cara login yang benar.
Solusi untuk client: login ulang atau refresh token.
2. 403 Forbidden — Masalah Izin
Server sudah tahu siapa kamu, dan identitasmu sah. Tapi akunmu tidak punya hak untuk melakukan operasi itu.
- Token valid, tapi role-nya tidak cukup (user biasa mencoba akses endpoint admin)
- Mencoba mengubah resource milik orang lain
- Akun diblokir, dinonaktifkan, atau langganannya habis
- Akses ditolak berdasarkan IP, region, atau kebijakan keamanan
Ciri khas: login ulang tidak akan menolong. Izinnya memang tidak ada.
Solusi untuk client: minta akses ke admin, atau jangan lakukan operasi itu.
Analogi Sederhana: Satpam Kantor
Bayangkan kamu masuk ke sebuah gedung perkantoran.
401 = Satpam bilang: “Maaf, Anda belum menunjukkan kartu identitas. Silakan lapor dulu di resepsionis.” Kamu belum terbukti siapa.
403 = Satpam bilang: “Kartu Anda valid, Pak. Tapi lantai direksi hanya untuk manajemen. Anda staf biasa.” Identitas jelas, izin tidak ada.
Perbandingan Cepat
| Aspek | 401 | 403 |
|---|---|---|
| Konsep | Authentication | Authorization |
| Pertanyaannya | Siapa kamu? | Boleh tidak kamu lakukan ini? |
| Status identitas | Belum terbukti | Sudah terbukti |
| Login ulang menolong? | Ya | Tidak |
| Contoh pemicu | Token expired | Role tidak cukup |
| Header khusus | WWW-Authenticate | Tidak ada |
Contoh Nyata di Kode
Skenario 1 — token expired → 401
GET /api/v1/profile
Authorization: Bearer <token_sudah_expired>
Response: 401 Unauthorized
{
"error": "Token expired, silakan login ulang"
}Skenario 2 — token valid tapi bukan admin → 403
GET /api/v1/admin/users
Authorization: Bearer <token_valid_user_biasa>
Response: 403 Forbidden
{
"error": "Akses ditolak: butuh role admin"
}Kesalahan Umum yang Sering Terjadi
- Pakai 403 padahal token-nya expired. Client jadi bingung: harus login ulang, atau memang tidak punya izin? Akibatnya user terjebak di loop error.
- Pakai 401 untuk masalah izin. Client akan mencoba refresh token terus-menerus padahal percuma — izinnya memang tidak ada.
- Pakai 400 atau 404 untuk urusan auth. 404 memang sengaja dipakai sebagian sistem untuk menyembunyikan keberadaan resource, tapi jangan campur aduk dengan auth.
- Membocorkan detail di pesan error. Jangan tulis “user budi bukan admin”. Cukup “akses ditolak”. Pesan detail bisa membantu penyerang memetakan sistem.
Catatan Penting: Nama 401 Itu Menyesatkan
Secara resmi namanya “401 Unauthorized”, tapi sebenarnya artinya unauthenticated (belum terautentikasi). Ini salah satu penamaan paling membingungkan di dunia HTTP — dan sering jadi jebakan saat interview kalau kamu tidak sadar. Yang benar-benar soal authorization justru 403.
Kenapa Ini Penting untuk Interview
- Menunjukkan kamu paham perbedaan authentication vs authorization — konsep dasar keamanan sistem
- Relevan saat mendesain API dan sistem auth (OAuth, JWT, RBAC)
- Menyangkut keamanan: pesan error yang tepat mencegah kebocoran informasi
- Berhubungan dengan UX: kode yang tepat membuat client tahu harus berbuat apa
Ringkasan
401 = belum terautentikasi — “Siapa kamu?” → login ulang atau refresh token.
403 = sudah terautentikasi, izin kurang — “Kamu tidak boleh.” → minta akses, bukan login ulang.