Manajemen Session
Session memungkinkan Anda menyimpan data spesifik pengguna di seluruh permintaan HTTP. Karena HTTP bersifat stateless, session menggunakan cookie atau mekanisme lain untuk mengidentifikasi pengguna yang kembali dan mengambil data tersimpan mereka.
Menggunakan gin-contrib/sessions
Middleware gin-contrib/sessions menyediakan manajemen session dengan beberapa backend penyimpanan:
go get github.com/gin-contrib/sessionsSession berbasis cookie
Pendekatan paling sederhana menyimpan data session dalam cookie terenkripsi:
package main
import ( "net/http"
"github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/cookie" "github.com/gin-gonic/gin")
func main() { r := gin.Default()
// Create cookie-based session store with a secret key store := cookie.NewStore([]byte("your-secret-key")) r.Use(sessions.Sessions("mysession", store))
r.GET("/login", func(c *gin.Context) { session := sessions.Default(c) session.Set("user", "john") session.Save() c.JSON(http.StatusOK, gin.H{"message": "logged in"}) })
r.GET("/profile", func(c *gin.Context) { session := sessions.Default(c) user := session.Get("user") if user == nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "not logged in"}) return } c.JSON(http.StatusOK, gin.H{"user": user}) })
r.GET("/logout", func(c *gin.Context) { session := sessions.Default(c) session.Clear() session.Save() c.JSON(http.StatusOK, gin.H{"message": "logged out"}) })
r.Run(":8080")}Session berbasis Redis
Untuk aplikasi produksi, simpan session di Redis untuk skalabilitas lintas beberapa instance:
package main
import ( "net/http"
"github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/redis" "github.com/gin-gonic/gin")
func main() { r := gin.Default()
// Connect to Redis for session storage store, err := redis.NewStore(10, "tcp", "localhost:6379", "", []byte("secret")) if err != nil { panic(err) } r.Use(sessions.Sessions("mysession", store))
r.GET("/set", func(c *gin.Context) { session := sessions.Default(c) session.Set("count", 1) session.Save() c.JSON(http.StatusOK, gin.H{"count": 1}) })
r.GET("/get", func(c *gin.Context) { session := sessions.Default(c) count := session.Get("count") c.JSON(http.StatusOK, gin.H{"count": count}) })
r.Run(":8080")}Opsi session
Konfigurasikan perilaku session dengan sessions.Options:
session := sessions.Default(c)session.Options(sessions.Options{ Path: "/", MaxAge: 3600, // Session expires in 1 hour (seconds) HttpOnly: true, // Prevent JavaScript access Secure: true, // Only send over HTTPS SameSite: http.SameSiteLaxMode,})| Opsi | Deskripsi |
|---|---|
Path | Cakupan path cookie (default: /) |
MaxAge | Masa hidup dalam detik. Gunakan -1 untuk menghapus, 0 untuk session browser |
HttpOnly | Mencegah akses JavaScript ke cookie |
Secure | Hanya kirim cookie melalui HTTPS |
SameSite | Mengontrol perilaku cookie cross-site (Lax, Strict, None) |
Backend yang tersedia
| Backend | Paket | Kasus penggunaan |
|---|---|---|
| Cookie | sessions/cookie | Aplikasi sederhana, data session kecil |
| Redis | sessions/redis | Produksi, deployment multi-instance |
| Memcached | sessions/memcached | Lapisan caching berperforma tinggi |
| MongoDB | sessions/mongo | Ketika MongoDB adalah datastore utama Anda |
| PostgreSQL | sessions/postgres | Ketika PostgreSQL adalah datastore utama Anda |
Session vs JWT
| Aspek | Session | JWT |
|---|---|---|
| Penyimpanan | Sisi server (Redis, DB) | Sisi klien (token) |
| Pencabutan | Mudah (hapus dari store) | Sulit (memerlukan blocklist) |
| Skalabilitas | Memerlukan store bersama | Stateless |
| Ukuran data | Tidak terbatas di sisi server | Dibatasi oleh ukuran token |
Gunakan session ketika Anda memerlukan pencabutan yang mudah (mis., logout, ban pengguna). Gunakan JWT ketika Anda memerlukan autentikasi stateless lintas microservice.