## Go Backend API Güvenlik Raporu

### 1. Genel Değerlendirme

- **Kapsam**: Kod tabanı üzerinden statik güvenlik analizi ve `go vet ./...` ile temel statik araç kontrolü.
- **Genel Sonuç**: Mimari olarak sağlam bir temel var (JWT, rol tabanlı yetki, rate limit, CORS). En önemli eksik, **refresh token güvenliğinin state-less olması (rotation/revoke yok)** ve **API tarafında token invalidation / logout akışının olmaması**.

### 2. Güçlü Yönler

- **JWT ve Kimlik Doğrulama**
  - HS256 ile imzalama yapılıyor ve `SigningMethodHMAC` kontrolü var → `alg: none` benzeri saldırılara karşı temel koruma mevcut.
  - Access / refresh token ayrımı `TokenType` alanı ile net; `RequireAuth` yalnızca access token kabul ediyor.
  - Email doğrulaması yapılmadan login’e izin verilmiyor.

- **Rol ve Yetkilendirme**
  - Public API tarafında admin işlemleri `RequireAuth` + `RequireAdmin` middleware’leri ile korunuyor.
  - Admin panel altındaki `"/admin"` rotaları global olarak `RequireAuth` + `RequireAdmin` ile kapalı.

- **CORS**
  - DB + Redis destekli whitelist/blacklist ile **default deny** yaklaşımı kullanılıyor.
  - Same-origin istekler her zaman izinli, wildcard `*` yok → klasik açık CORS yanlış konfigürasyonları görülmedi.

- **Rate Limiting**
  - `/api/v1` için global; `/auth/login` ve `/auth/refresh` için isimlendirilmiş rate limit profilleri tanımlı.
  - Redis tabanlı sayaçlar ile limit aşıldığında `429` ve `Retry-After` header’ı dönüyor.

- **Admin Oturumu (Browser)**
  - `admin_session` cookie: `HttpOnly`, `Secure`, `SameSite=Strict` → XSS sonrası cookie çalınması ve CSRF riskleri azaltılmış.
  - Admin login’de parolalar `bcrypt` ile doğrulanıyor.

### 3. Tespit Edilen Riskler ve Öneriler

#### 3.1 Refresh Token Rotation & Revoke Eksikliği (Kritik / Yüksek Öncelik)

- **Durum**:
  - `/api/v1/auth/refresh` endpoint’i yalnızca:
    - JWT imzasını,
    - `TokenType == refresh` olmasını
    kontrol ediyor.
  - Refresh token’lar için DB/Redis tabanlı bir “token store”, revoke listesi veya rotation takibi yok.
- **Risk**:
  - Bir refresh token ele geçirilirse, süresi dolana kadar sınırsız sayıda yeni access token üretmek için yeniden kullanılabilir.
  - Token reuse (aynı refresh token’ın birden fazla kez kullanılması) tespit edilemiyor.
- **Öneri**:
  - Refresh token’lar için tablo veya Redis store tasarla:
    - Her refresh isteğinde:
      - Eski refresh token’ı **geçersiz** kıl (rotation),
      - Yeni bir refresh token üret ve store’a kaydet.
    - Aynı refresh token ikinci kez kullanılırsa:
      - İlgili hesabı veya oturumu geçici olarak kilitle,
      - Gerekirse tüm tokenlarını revoke et (global logout).
  - Mümkünse refresh token’ları **HTTP-only cookie** ile taşı (XSS’e karşı daha dirençli).

#### 3.2 API Logout / Token İptali Eksikliği (Orta–Yüksek)

- **Durum**:
  - Public API’de `/api/v1/auth/logout` benzeri bir endpoint yok.
  - Client tarafında yalnızca local storage / memory’den token silinerek logout yapılıyor; backend tarafında “session state” yok.
- **Risk**:
  - Bir access veya refresh token sızdığında, expire olana kadar backend tarafında bunu geçersiz kılma imkânı yok.
  - Özellikle refresh token için kritik: saldırgan elinde refresh token olduğu sürece yeni access token üretebilir.
- **Öneri**:
  - `/api/v1/auth/logout` endpoint’i ekle:
    - İlgili kullanıcının aktif refresh token kaydını (veya kayıtlardan birini) revoke listesine ekle ya da store’dan sil.
    - İsteğe bağlı olarak access token için kısa süreli bir blacklist kullan (jti/subject bazlı).
  - Admin panel logout şu an cookie temizliyor; bunu backend tarafında da bir “session invalidation” akışı ile desteklemek düşünülebilir.

#### 3.3 Token İçeriğinin Loglanması (Düşük–Orta)

- **Durum**:
  - `GenerateTokenPair` içinde development ortamında hem access hem refresh token string’leri loglanıyor.
  - Refresh akışında `fmt.Println(accessToken, "Access Token Yenilendi !!!")` ile access token stdout’a yazılıyor.
- **Risk**:
  - Production konfigürasyonu yanlış yapılırsa, log dosyalarında tam token değerleri yer alabilir.
- **Öneri**:
  - Production ortamında:
    - Token gövdesini **asla** loglama; yalnızca `userID`, `exp`, `tokenType` gibi meta verileri logla.
  - Development ortamında bile mümkünse:
    - Token’ı maskeleyerek veya kısmi göstererek logla (örneğin sadece ilk 6 + son 4 karakter).

#### 3.4 Admin Login – Captcha / Turnstile Doğrulaması Tamamlanmamış (Orta)

- **Durum**:
  - Admin login formu `cf-turnstile-response` alanını okuyor ancak gerçek Cloudflare Turnstile doğrulaması yapılmıyor.
  - Rate limiting mevcut olsa da insan/makine ayrımı yok.
- **Risk**:
  - Admin hesabı için brute force ve credential stuffing saldırılarına karşı savunma zayıf kalıyor.
- **Öneri**:
  - Cloudflare Turnstile veya benzeri servis için gerçek HTTP doğrulamasını ekle:
    - Turnstile token’ı backend’de doğrulanmadan login’e izin verme.
  - Başarısız giriş denemelerine göre:
    - IP ve hesap bazlı ek limitler veya geçici hesap kilitleme mekanizması eklemeyi değerlendir.

#### 3.5 Redis Yoksa Rate Limit & CORS Enforcement’ın Devre Dışı Kalması (Düşük–Orta)

- **Durum**:
  - Redis bağlantısı yoksa, rate limit ve CORS cache tarafı graceful fail yapıyor ve bazı kontroller uygulanmayabiliyor.
- **Risk**:
  - Production’da Redis yanlış konfigüre edilirse, rate limit fiilen devre dışı kalabilir; CORS kontrolleri de zayıflayabilir.
- **Öneri**:
  - Production ortamında Redis’i **zorunlu bağımlılık** haline getir:
    - Redis’e bağlanılamıyorsa servisi başlatma (fail-fast).
  - Redis bağlantı hatalarını loglarda daha yüksek seviye (error) olarak işaretle.

### 4. `go vet` Çıktısı Özeti

- `go vet ./...` komutu çalıştırıldığında:
  - `scripts/seed.go` içinde aynı pakette birden fazla `main` fonksiyonu olduğu için “main redeclared” uyarısı veriliyor.
- **Not**:
  - Bu, güvenlikten ziyade script yapısına dair yapısal bir uyarı; istenirse ilgili script ayrı bir pakete veya dosya yapısına taşınarak temizlenebilir.

### 5. Önerilen İyileştirme Planı (Önceliklendirilmiş)

1. **Kritik (kısa vadede)**:
   - Refresh token için rotation + revoke mekanizması tasarlayıp uygulamak.
   - Public API için `/api/v1/auth/logout` endpoint’i ekleyip refresh (ve gerekiyorsa access) token’larını server-side olarak da geçersiz kılmak.
   - Production’da token içeriğini loglamayı tamamen kapatmak; development’ta da maskelemek.

2. **Orta vadede**:
   - Admin login için gerçek Turnstile (veya eşdeğer captcha) doğrulamasını devreye almak.
   - Redis’i production ortamında zorunlu hale getirip rate limit/CORS’un Redis olmadan çalışmamasını sağlamak (fail-fast yaklaşımı).

3. **Uzun vadede**:
   - Bu rapora göre hazırlanmış, dış pentest’e verilebilecek detaylı bir test senaryoları dokümanı oluşturmak (mevcut `guvenlik.md` şablonunu projeye özgü endpoint/roller ile doldurmak).

