Security Bukan Fitur It is a Requirement
Saya pernah melihat startup SaaS yang fokus 100% ke fitur dan melupakan security. Hasilnya? Data leak, customer marah, dan bisnis hancur dalam hitungan minggu. Security harus built-in dari hari pertama, bukan di-add-on kemudian.
Authentication dan Authorization
Jangan pernah roll your own crypto. Gunakan established libraries:
- bcrypt/argon2 untuk password hashing jangan MD5 atau SHA
- JWT dengan expiry pendek 15 menit access + refresh token
- Role-based access control (RBAC) untuk multi-tenant authorization
// Contoh JWT middleware di Go
func AuthMiddleware(c *fiber.Ctx) error {
token := c.Get("Authorization")
if token == "" {
return c.Status(401).JSON(fiber.Map{"error": "unauthorized"})
}
claims, err := validateJWT(strings.TrimPrefix(token, "Bearer "))
if err != nil {
return c.Status(401).JSON(fiber.Map{"error": "invalid token"})
}
c.Locals("userID", claims.UserID)
c.Locals("tenantID", claims.TenantID)
return c.Next()
}
OWASP Top 10: Yang Paling Sering Terlupakan
Dari pengalaman saya audit beberapa aplikasi SaaS, ini yang paling sering dilupakan:
- SQL Injection Selalu pakai parameterized queries. Di GORM method Where sudah aman.
- XSS Sanitize semua user input di frontend. Gunakan library DOMPurify.
- Broken Access Control Selalu cek authorization di backend, bukan hanya di frontend.
- Insecure Direct Object References Jangan pernah expose ID langsung ke user. Gunakan UUID.
Data Encryption dan Compliance
Semua data sensitive harus ter-encrypt, baik at rest maupun in transit. Di production, pastikan:
- HTTPS everywhere no exceptions
- Database encryption for sensitive columns
- Environment variables for secrets jangan hardcode API keys
- Regular backup dan disaster recovery plan
Security bukan one-time thing. Lakukan security review berkala minimal quarterly. Dan kalau Anda handle data user Indonesia, pastikan compliant dengan UU PDP Perlindungan Data Pribadi.
Rate Limiting dan DDoS Protection
SaaS yang tidak punya rate limiting adalah undangan untuk abuse. Saya pernah lihat satu akun free tier mengirim 50K request per jam ke API SaaS saya. Solusinya:
// Rate limiter per user
func RateLimitMiddleware(limiter *rate.Limiter) fiber.Handler {
return func(c *fiber.Ctx) error {
userID := c.Locals("userID").(string)
if !limiter.Allow(userID) {
return c.Status(429).JSON(fiber.Map{
"error": "rate limit exceeded",
"retry_after": limiter.TimeUntil(userID),
})
}
return c.Next()
}
}
Gunakan Redis sebagai backing store untuk rate limiter agar state-nya shared antar instance. Dan jangan lupa untuk set rate limit yang berbeda per tier free tier lebih ketat dari pro tier.
Audit Logging: Jangan Lupakan Ini
Setiap aksi sensitif harus ter-log: login, password change, data export, permission change. Log ini bukan hanya untuk debugging, tapi juga untuk compliance dan forensic analysis jika terjadi security incident.
Saya biasanya log ke database dengan struktur: timestamp, user_id, action, resource, ip_address, dan metadata. Gunakan structured logging seperti zerolog atau zap untuk output yang mudah di-parse oleh log aggregation tools seperti Loki atau ELK stack.