Belajar Fiber - Sessions dan Autentikasi
Episode 19 of 23

Belajar Fiber - Sessions dan Autentikasi

Episode ini membahas session di Fiber v3: membuat session store, menyimpan dan membaca data dengan Get/Set/Save/Destroy, mendaftarkan custom type, penyimpanan terpusat Redis dengan github.com/gofiber/storage, serta alur autentikasi berbasis session.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Tidak semua autentikasi memakai JWT. Aplikasi web klasik — dengan form login dan halaman server-side — biasanya memakai session. Episode 19 membahas session di Fiber v3: membuat store, menyimpan data antar request, custom type, penyimpanan Redis, dan alur autentikasi lengkap.

Session menyimpan state di sisi server dan memberi client sebuah cookie identitas. Ini lebih mudah dicabut (logout langsung efektif) dibanding JWT. Dengan github.com/gofiber/storage, data session bisa dibagikan antar instance — penting saat aplikasi berjalan di banyak server.

Membuat Session Store

Setup Store dan Middleware

Store dibuat sekali, lalu dipasang sebagai middleware:

Session store dasar
import "github.com/gofiber/fiber/v3/middleware/session"
 
store := session.New(session.Config{
    Expiration: 24 * time.Hour,
})
 
app.Use(store.Middleware())

session.New(session.Config{Expiration: 24h}) membuat store dengan masa berlaku 24 jam. store.Middleware() membungkus seluruh request: middleware membaca cookie session (jika ada) dan menyediakan session aktif lewat context. Setiap handler bisa mengakses session tanpa membuatnya sendiri.

Cookie session perlu diatur agar aman:

Cookie session aman
store := session.New(session.Config{
    Expiration:  24 * time.Hour,
    KeyLookup:   "cookie:session_id",
    CookieHTTPOnly: true,
    CookieSecure: true,
    CookieSameSite: "Lax",
})

KeyLookup: "cookie:session_id" menentukan nama cookie. CookieHTTPOnly, CookieSecure, dan CookieSameSite menjaga cookie dari JavaScript dan pemakaian lintas situs. Di development, CookieSecure bisa dimatikan karena HTTPS belum tersedia.

Membaca dan Menulis Session

Get, Set, dan Save

Data session diakses lewat objek yang diperoleh dari middleware:

CRUD session
app.Post("/login", func(c fiber.Ctx) error {
    sess := session.FromContext(c)
    sess.Set("user_id", 42)
    sess.Set("role", "admin")
    return sess.Save()
})
 
app.Get("/me", func(c fiber.Ctx) error {
    sess := session.FromContext(c)
    id := sess.Get("user_id")
    return c.JSON(fiber.Map{"user_id": id})
})

session.FromContext(c) mengambil session dari context (disediakan middleware). sess.Set(key, value) menulis data, sess.Get(key) membacanya, dan sess.Save() menyimpan — wajib dipanggil agar perubahan benar-benar tersimpan ke cookie dan storage.

Menghancurkan Session

Logout berarti menghapus session:

Logout
app.Post("/logout", func(c fiber.Ctx) error {
    sess := session.FromContext(c)
    if err := sess.Destroy(); err != nil {
        return err
    }
    return c.JSON(fiber.Map{"message": "logout berhasil"})
})

sess.Destroy() menghapus data session dan menandai cookie agar dihapus client. Berbeda dengan JWT, logout session langsung berlaku — data sudah tidak ada di server. Pastikan Save/Destroy dipanggil sebelum handler mengembalikan respons.

Custom Types

Mendaftarkan Type ke Store

Secara default session menyimpan nilai sederhana. Struct kustom harus didaftarkan dulu:

Register custom type
type UserProfile struct {
    Name  string
    Email string
}
 
func init() {
    session.RegisterType(UserProfile{})
}
app.Get("/profile", func(c fiber.Ctx) error {
    sess := session.FromContext(c)
    profile := sess.Get("profile").(UserProfile)
    return c.JSON(profile)
})

session.RegisterType(UserProfile{}) memberi tahu encoder bagaimana menangani struct tersebut saat disimpan ke session. Tanpa registrasi, sess.Get("profile") akan gagal mengembalikan struct dengan benar. Daftarkan semua type kustom di init() agar selalu siap sebelum server jalan.

Penyimpanan Terpusat

Redis Storage

Defaultnya session tersimpan di memori — hilang saat server restart dan tidak bisa dibagikan antar instance. Untuk produksi, pakai storage terpusat:

Session dengan Redis
import (
    "github.com/gofiber/storage/redis/v3"
    "github.com/gofiber/fiber/v3/middleware/session"
)
 
storage := redis.New(redis.Config{
    Host:     "localhost",
    Port:     6379,
    Username: "",
    Password: "",
    Database: 0,
})
 
store := session.New(session.Config{
    Storage:    storage,
    Expiration: 24 * time.Hour,
})

session.Config{Storage: storage} mengganti penyimpanan default. Redis membuat session bertahan melintasi restart dan dibagikan antar instance server — syarat untuk load balancing. Storage lain tersedia di github.com/gofiber/storage: Memcache, MySQL, PostgreSQL, SQLite, dan lainnya, dengan konfigurasi yang serupa.

Alur Autentikasi Lengkap

Login, Proteksi, dan Logout

Semua bagian dirangkai:

Alur autentikasi session
app.Post("/login", func(c fiber.Ctx) error {
    var creds Credentials
    if err := c.Bind().JSON(&creds); err != nil {
        return err
    }
    if creds.Username != "budi" || creds.Password != "rahasia123" {
        return fiber.NewError(fiber.StatusUnauthorized, "kredensial salah")
    }
    sess := session.FromContext(c)
    sess.Set("username", creds.Username)
    return sess.Save()
})
 
app.Get("/dashboard", requireAuth, func(c fiber.Ctx) error {
    return c.JSON(fiber.Map{"message": "selamat datang"})
})
 
func requireAuth(c fiber.Ctx) error {
    sess := session.FromContext(c)
    if sess.Get("username") == nil {
        return fiber.NewError(fiber.StatusUnauthorized, "harus login")
    }
    return c.Next()
}

Login menulis username ke session setelah verifikasi. requireAuth — dipasang sebagai middleware route — memeriksa keberadaan data; jika kosong, request ditolak 401. Logout memanggil Destroy. Pola ini sederhana, mudah diaudit, dan aman terhadap logout.

Uji Coba

Tes alur session
curl -i -c cookies.txt -X POST -H "Content-Type: application/json" \
  --data '{"username":"budi","password":"rahasia123"}' http://localhost:3000/login
 
curl -i -b cookies.txt http://localhost:3000/dashboard

Penutup

Inti yang harus dibawa pulang:

  • session.New(session.Config{Expiration, ...}) membuat store; store.Middleware() menyediakan session per request.
  • session.FromContext(c) mengambil session; wajib Save() agar perubahan tersimpan.
  • sess.Get/Set/Destroy membaca, menulis, dan menghapus data session.
  • session.RegisterType(MyStruct{}) mendaftarkan struct kustom untuk penyimpanan.
  • session.Config{Storage: ...} memakai storage terpusat seperti github.com/gofiber/storage/redis/v3.
  • Autentikasi session: tulis data saat login, cek di middleware route, Destroy() saat logout.

Di episode 20 selanjutnya kita membahas rate limiting dan throttling — middleware limiter dengan Redis, sliding window, dan cara melindungi API dari serangan dan penyalahgunaan.

Belajar Fiber - Sessions dan Autentikasi | Belajar Fiber