Authentication vs Authorization — Auth

Dua konsep yang sering tertukar tapi sangat berbeda: Authentication (AuthN) dan Authorization (AuthZ). Authentication — "Siapa kamu?" Proses memverifikasi ident

Dua konsep yang sering tertukar tapi sangat berbeda: Authentication (AuthN) dan Authorization (AuthZ).

Authentication — "Siapa kamu?" Proses memverifikasi identitas pengguna. Apakah kamu benar-benar orang yang kamu klaim?

Contoh authentication:

Authorization — "Boleh apa?" Setelah identitas terverifikasi, proses menentukan apa saja yang boleh dilakukan pengguna.

Contoh authorization:

Analogi: Bayangkan masuk ke gedung kantor:

Alur lengkap:

User mengirim kredensial (email + password)
        ↓
Server memverifikasi identitas (Authentication)
        ↓
Server mengeluarkan token/session
        ↓
User mengirim token di setiap request
        ↓
Server memeriksa apa yang boleh dilakukan user (Authorization)
        ↓
Server mengembalikan data atau menolak (403 Forbidden)

Implementasi dasar:

// Authentication — verifikasi identitas
async function authenticate(email, password) {
  const user = await db.findUserByEmail(email);
  if (!user) return null; // user tidak ditemukan

  const valid = await bcrypt.compare(password, user.passwordHash);
  if (!valid) return null; // password salah

  return user; // identitas terverifikasi!
}

// Authorization — cek izin
function authorize(user, action, resource) {
  const permissions = {
    admin: ["create", "read", "update", "delete"],
    editor: ["create", "read", "update"],
    viewer: ["read"]
  };

  const allowed = permissions[user.role] || [];
  return allowed.includes(action);
}

// Penggunaan:
const user = await authenticate("[email protected]", "password123");
if (!user) return res.status(401).json({ error: "Login gagal" });

if (!authorize(user, "delete", "article")) {
  return res.status(403).json({ error: "Tidak punya izin" });
}

Status code yang tepat:

Memahami perbedaan ini penting karena strategi penanganannya berbeda: 401 → minta user login ulang, 403 → tampilkan pesan "akses ditolak".

💡 Bug klasik: banyak app return 403 padahal user belum login. Atau return 401 padahal user udah login tapi gak punya akses. Salah status code = client gagal handle (gak tau mau redirect ke login page atau show "access denied"). Wajib bedain.

🎭 Analogi sehari-hari

Authentication (AuthN) = satpam cek KTP di pintu masuk gedung. "Beneran kamu Budi?" Authorization (AuthZ) = kartu akses di lift. KTP kamu valid (AuthN passed), tapi kartu akses kamu cuma boleh sampai lantai 3 (AuthZ check). Dua proses berbeda, dua kegagalan berbeda: gak punya KTP (401) vs KTP valid tapi gak boleh ke lantai 10 (403).

⚠️ Jebakan yang sering ditemui

TL;DR: Auth = 2 hal berbeda. Authentication = "siapa kamu?" (login, OTP, biometric). Authorization = "boleh apa?" (role, permission). HTTP status: 401 = belum auth, 403 = auth OK tapi gak boleh. Kategori ini bahas: hashing, session vs JWT, OAuth, MFA, CSRF, dll. Wajib di setiap app dengan user.

Yang akan kamu pelajari