---
name: Session
lang: go
domain: infra
version: "1.0.0"
algebraic: product
definition: |
  type Session struct {
      Token     string         `json:"token"`
      UserID    string         `json:"user_id"`
      ExpiresAt int64          `json:"expires_at"`
      CreatedAt int64          `json:"created_at"`
      Metadata  map[string]any `json:"metadata,omitempty"`
  }
description: "Sesion de usuario almacenada en SQLite. Alternativa server-side a JWT para apps con estado. Token es 32 bytes hex opacos generados con crypto/rand."
tags: [session, auth, sqlite, token, infra]
uses_types: []
file_path: "functions/infra/session.go"
---

## Ejemplo

```go
session, _ := SessionCreate(db, "user-123", 24*time.Hour, map[string]any{
    "role":  "admin",
    "email": "alice@example.com",
})
// session.Token es el valor opaco a enviar al cliente
w.Header().Set("X-Session-Token", session.Token)
```

## Notas

Tipo producto — Token identifica la sesion en la tabla SQLite. UserID vincula la sesion al usuario. ExpiresAt y CreatedAt son Unix epoch seconds. Metadata es un mapa libre que se serializa a JSON en la columna metadata de la tabla sessions. A diferencia de JWT, Session requiere una query a la BD para validar en cada request — a cambio permite invalidacion inmediata (DELETE FROM sessions WHERE token = ?).
