Memastikan Auth Go Fiber Lebih Tahan Banting

Langkah pertama adalah memahami ancaman yang dituju: credential stuffing, session fixation, dan abuse pada endpoint login atau upload. Artikel ini langsung memberikan strategi teknis seperti rotasi secret, rate limit, validasi input, sesi kuat, deteksi abuse, dan observability sehingga tim bisa segera memperkuat stack Go Fiber tanpa berputar pada konsep umum.

1. Menyusun Rotasi Secret dan Penyimpanan Aman

Sekret seperti HMAC key, JWT signing key, atau CSRF token harus disimpan di vault (Vault, AWS Secrets Manager, dsb.) dan direncanakan rotasinya. Pola yang efektif adalah menyimpan versi aktif dan versi fallback, serta memperbaruinya lewat deploy pipeline.

Contoh sederhana: simpan secret di config dengan struktur versi:

type SecretPool struct {
    Current string
    Previous string
}

func (s *SecretPool) Validate(token string) bool {
    return token == s.Current || token == s.Previous
}

Rotasi dilakukan dengan mengganti Current baru, dan menggeser nilai lama ke Previous. Penggunaan middleware checking token signing harus mengakomodasi dua versi sehingga rotasi tidak memblokir pengguna. Selalu gunakan rotation cron atau pipeline deployment sehingga secret konsisten di semua pod.

Jangan menyimpan secret di environment variabel tanpa enkripsi, terutama di container image build. Tunggu secret yang belum kadaluarsa terdampak serangan dengan menambahkan lifecycle policy.

2. Validasi Input Auth dan Upload

Validasi ketat menangkal injection, enumerasi, dan abuse upload. Untuk field login:

  • Batasi panjang username/password sebelum hashing.
  • Gunakan whitelist karakter sesuai kebijakan identitas.
  • Gunakan bcrypt/argon2 untuk password hashing dengan parameter yang bisa disesuaikan.

Upload harus melalui middleware yang mengecek tipe MIME, ukuran, dan menulis ke storage tersegregasi. Sertakan Content Security Policy pada response upload.

Fiber middleware contoh validasi payload JSON:

func validateAuth(c *fiber.Ctx) error {
    type login struct {
        Email string `json:"email"`
        Pass  string `json:"password"`
    }
    var payload login
    if err := c.BodyParser(&payload); err != nil {
        return fiber.ErrBadRequest
    }
    if len(payload.Pass) < 12 || !strings.Contains(payload.Email, "@") {
        return fiber.ErrBadRequest
    }
    return c.Next()
}

Gunakan BodyLimit untuk upload agar Fiber otomatis memblokir payload terlalu besar. Logging error validasi membantu debugging dan mendeteksi pola abuse.

3. Kelola Session yang Tahan Serangan

Prefer stateless JWT disertai mekanisme revocation list, atau session store seperti Redis dengan strict TTL.

Tips penting:

  • Pasang SameSite=strict dan Secure untuk cookie.
  • Gunakan session ID baru saat login ulang (prevent fixation).
  • Rotasi session ID secara periodik dan hapus session lama kalau tidak digunakan.

Contoh middleware regenerasi:

func sessionMiddleware(store *redis.Client) fiber.Handler {
    return func(c *fiber.Ctx) error {
        sess, err := session.New().Get(c)
        if err != nil {
            return err
        }
        if sess.Fresh() {
            sess.Regenerate()
        }
        return c.Next()
    }
}

Menggunakan Redis TTL memastikan session mati cepat setelah idle, sehingga credential stuffing ke session lama gagal.

4. Rate Limit dan Deteksi Abuse

Rate limit melindungi login/otp endpoint. Fiber menyarankan middleware berbasis token bucket.

Contoh integrasi simple:

func rateLimiter() fiber.Handler {
    limiter := limiter.New(limiter.Config{
        Max:        5,
        Expiration: 30 * time.Second,
        KeyGenerator: func(c *fiber.Ctx) string {
            return c.IP()
        },
    })
    return limiter
}

Untuk deteksi abuse seperti credential stuffing atau password spraying:

  • Bandingkan failure rate per-IP dan per-account dalam window tertentu.
  • Tandai threshold; jika tercapai, blokir sementara dan kirim notifikasi tim.
  • Manfaatkan cache untuk menyimpan timestamp login terakhir, dan cek pattern tidak biasa.

Abuse detection perlu integrasi dengan Observability bagian bawah agar tim bisa melihat grafik dan metrik ini.

5. Observability dan Responsif terhadap Anomali

Metrik utama:

  • Jumlah login gagal per endpoint.
  • Fail rate dan latensi session store.
  • Kenaikan sudden traffic di login/upload.

Gunakan exporter seperti Prometheus dengan middleware:

func metricsMiddleware() fiber.Handler {
    return func(c *fiber.Ctx) error {
        start := time.Now()
        err := c.Next()
        status := c.Response().StatusCode()
        requestDuration.WithLabelValues(c.Path(), fmt.Sprint(status)).Observe(time.Since(start).Seconds())
        return err
    }
}

Log structured (JSON) untuk audit trace request login. Pastikan tidak log password, hanya event seperti "login_failed" beserta user/email dan IP.

Gunakan alerting (PagerDuty/Slack) untuk integrasi observability yang siap mengambil tindakan. Tim harus dapat melihat pola abuse (contoh: 300 login gagal dari satu IP/menit). Berikan playbook mitigasi, seperti menambahkan blocklist IP secara manual atau memperketat rate limit.

6. Checklist Mitigasi Kasus Umum

  1. Credential Stuffing: Terapkan rate limit, challenge tambahan (captcha), dan deteksi pola kegagalan berulang.
  2. Session Fixation: Regenerasi session ID dan set cookie flags streng.
  3. Upload Abuse: Validasi MIME/size, scan virus, simpan di namespace terpisah.
  4. Secret Leak: Gunakan vault, audit akses, dan rotasi setiap 90 hari atau lebih sering jika breach.

Debugging tips: Aktifkan logging pada middleware sebelum dan sesudah rate limit untuk melihat siapa yang diblokir. Jika rotasi secret menyebabkan gagal auth, periksa versi active/previous di deployment dan refresh cache di worker.

Penutup

Dengan menerapkan rotasi secret, validasi ketat, sesi kuat, rate limit, deteksi abuse, dan observability, sistem autentikasi Go Fiber bakal lebih resilien terhadap serangan nyata. Terapkan langkah-langkah secara bertahap dan gunakan metrik untuk mengukur efektivitasnya.