A5 · Status Kodları: 2xx / 3xx / 4xx /: Status kodları, sunucunun **trafik lambası**dır ama üç renkli değil, dört mahalleli: **2xx** = yeşil (başardım), **3xx** = tabela (başka y
Status kodları, sunucunun **trafik lambası**dır ama üç renkli değil, dört mahalleli: **2xx** = yeşil (başardım), **3xx** = tabela (başka yola git — yönlendirme), **4xx** = "senin hatan" (request yanlış: eksik alan, yanlış yol, yetkisiz), **5xx** = "benim hatam" (sunucu çöktü). Peki neden yüzlerce kod var, "başardı/başaramadı" iki değer yetmez mi? Çünkü bir testerın bir sonraki adımı **koda bağlıdır**: 4xx görürsen test verini/request'ini düzeltirsin (bu senin işin), 5xx görürsen geliştiriciye escalate edersin (bu onların bug'ı) — kodu yanlış okursan yanlış kişiyi suçlarsın. Java'da bunun karşılığı exception türüdür: `IllegalArgumentException` (4xx, çağıran yanlış girdi verdi) ile `NullPointerException`/`SQLException` (5xx, kodun içi patladı) farkı; birini çağıran düzeltir, diğerini kodu yazan. QA açısından en pahalı karışıklık 401 (kimliğin yok) ile 403 (kimliğin var ama yetkin yok) arasındadır: birini diğeri sanmak, bir güvenlik açığını "login bug'ı" diye kapatmana yol açar.
🎬 401 mi 403 mü? Güvenlik Açığını "Login Bug" Sanmak
Tester, geçerli token'ıyla başka bir kullanıcının bug'ını silmeyi deniyor: DELETE /api/v1/bugs/42.
Senaryo A — Token HİÇ yoksa sunucu 401 döner: "seni tanımıyorum". Bu bir kimlik (authentication) sorunudur.
Senaryo B — Token VAR ama bu kaydı silme yetkin yok: sunucu 403 döner. Kimliğin tanınıyor, ama izin reddediliyor (authorization).
Tehlike — 403'ü 401 sanan tester "login çalışmıyor" der ve kapatır. Oysa 403, başkasının verisine erişebildiğin anlamına gelebilir: bir IDOR güvenlik açığı!
Ders — 401 = "kimliğin yok", 403 = "kimliğin var, yetkin yok". İkisini ayırmak, bir güvenlik açığını doğru sınıflandırmanın anahtarıdır.
4xx mı 5xx mi? Bug Kime Düşer?
4xx = request senin tarafında yanlış: eksik alan (400), kimlik yok (401), yetki yok (403), yol yok (404). Önce request'ini/verini düzelt.