Pular para o conteúdo

Cookie

O Gin fornece helpers para definir e ler cookies HTTP na resposta e requisição.

Parâmetros do SetCookie

A assinatura do método c.SetCookie() é:

c.SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)
ParâmetroDescrição
nameO nome (chave) do cookie.
valueO valor do cookie.
maxAgeTempo de vida em segundos. Defina como -1 para deletar o cookie, ou 0 para torná-lo um cookie de sessão (deletado quando o navegador fecha).
pathO caminho de URL para o qual o cookie é válido. Use "/" para torná-lo disponível em todo o site.
domainO domínio ao qual o cookie está associado (ex.: "example.com"). Use "localhost" durante o desenvolvimento.
secureQuando true, o cookie é enviado apenas sobre conexões HTTPS. Defina como true em produção.
httpOnlyQuando true, o cookie é inacessível ao JavaScript do lado do cliente (document.cookie), o que ajuda a prevenir ataques XSS. Defina como true em produção.
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
router.GET("/cookie", func(c *gin.Context) {
cookie, err := c.Cookie("gin_cookie")
if err != nil {
cookie = "NotSet"
c.SetCookie("gin_cookie", "test", 3600, "/", "localhost", false, true)
}
fmt.Printf("Cookie value: %s \n", cookie)
})
router.Run()
}

Teste

Terminal window
# First request -- no cookie sent, server sets one
curl -v http://localhost:8080/cookie
# Look for "Set-Cookie: gin_cookie=test" in the response headers
# Second request -- send the cookie back
curl -v --cookie "gin_cookie=test" http://localhost:8080/cookie
# Server logs: Cookie value: test

Delete um cookie definindo max age como -1.

c.SetCookie("gin_cookie", "test", -1, "/", "localhost", false, true)

O Gin também suporta definir cookies usando um *http.Cookie, dando acesso a campos como Expires, MaxAge, SameSite e Partitioned.

import (
"net/http"
"time"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/set-cookie", func(c *gin.Context) {
c.SetCookieData(&http.Cookie{
Name: "session_id",
Value: "abc123",
Path: "/",
Domain: "localhost",
Expires: time.Now().Add(24 * time.Hour),
MaxAge: 86400,
Secure: true,
HttpOnly: true,
SameSite: http.SameSiteLaxMode,
// Partitioned: true, // Go 1.22+
})
c.String(http.StatusOK, "ok")
})
r.Run(":8080")
}

Veja também