İçeriğe geç

Oturum Yönetimi

Oturumlar, birden fazla HTTP isteği boyunca kullanıcıya özgü verileri depolamanıza olanak tanır. HTTP durumsuz olduğundan, oturumlar geri dönen kullanıcıları tanımlamak ve saklanan verilerini almak için çerezler veya diğer mekanizmaları kullanır.

gin-contrib/sessions ara katmanı, birden fazla arka uç depolama alanıyla oturum yönetimi sağlar:

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

En basit yaklaşım, oturum verilerini şifrelenmiş çerezlerde saklar:

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

Üretim uygulamaları için, birden fazla örnek arasında ölçeklenebilirlik sağlamak üzere oturumları Redis’te saklayın:

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

sessions.Options ile oturum davranışını yapılandırın:

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,
})
SeçenekAçıklama
PathÇerez yol kapsamı (varsayılan: /)
MaxAgeSaniye cinsinden ömür. Silmek için -1, tarayıcı oturumu için 0 kullanın
HttpOnlyÇereze JavaScript erişimini engeller
SecureÇerezi yalnızca HTTPS üzerinden gönderir
SameSiteÇapraz site çerez davranışını kontrol eder (Lax, Strict, None)
Arka uçPaketKullanım senaryosu
Cookiesessions/cookieBasit uygulamalar, küçük oturum verisi
Redissessions/redisÜretim, çok örnekli dağıtımlar
Memcachedsessions/memcachedYüksek performanslı önbellekleme katmanı
MongoDBsessions/mongoMongoDB birincil veri deponuz olduğunda
PostgreSQLsessions/postgresPostgreSQL birincil veri deponuz olduğunda
ÖzellikOturumlarJWT
DepolamaSunucu tarafı (Redis, DB)İstemci tarafı (token)
İptalKolay (depodan silme)Zor (engelleme listesi gerektirir)
ÖlçeklenebilirlikPaylaşımlı depo gerektirirDurumsuz
Veri boyutuSınırsız sunucu tarafıToken boyutuyla sınırlı

Kolay iptal gerektiğinde oturumları kullanın (ör., çıkış, kullanıcı yasaklama). Mikro hizmetler arasında durumsuz kimlik doğrulama gerektiğinde JWT kullanın.