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.

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.
Store dibuat sekali, lalu dipasang sebagai middleware:
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:
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.
Data session diakses lewat objek yang diperoleh dari middleware:
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.
Logout berarti menghapus session:
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.
Secara default session menyimpan nilai sederhana. Struct kustom harus didaftarkan dulu:
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.
Defaultnya session tersimpan di memori — hilang saat server restart dan tidak bisa dibagikan antar instance. Untuk produksi, pakai storage terpusat:
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.
Semua bagian dirangkai:
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.
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/dashboardInti 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.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.