Lewati ke konten

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.

Middleware gin-contrib/sessions menyediakan manajemen session dengan beberapa backend penyimpanan:

Terminal window
go get github.com/gin-contrib/sessions

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")
}

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")
}

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 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
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.