Cookies y sesiones son mecanismos para conservar información entre peticiones HTTP.
Por defecto, el protocolo HTTP (la web) es “sin estado” (stateless). Esto significa que el servidor tiene amnesia: no recuerda nada de lo que hiciste en la página anterior. Para el servidor, cada clic que haces es como si fueras un usuario nuevo que acaba de llegar.
Para solucionar esto y tener “memoria” entre recargas, usamos Cookies y Sesiones.
Cookies: guardando datos en el navegador
Una Cookie es un pequeño archivo de texto que tu servidor le pide al navegador del usuario que guarde.
- ¿Dónde vive? En el ordenador del usuario (Chrome, Firefox, etc.).
- ¿Para qué sirve? Recordar preferencias no sensibles (ej: “Tema Oscuro”, “Idioma Español”, “Aceptar política de cookies”) o para rastreo (Google Analytics).
- Seguridad: Baja. El usuario puede bloquearlas, borrarlas o modificarlas. Nunca guardes contraseñas aquí.
Cómo se usa:
// Crear una cookie (Nombre, Valor, Expiración)
// time() + 3600 significa "expira en 1 hora"
// ¡IMPORTANTE! setcookie debe ir ANTES de cualquier HTML o echo
setcookie("idioma_preferido", "es", time() + 3600);
// Leer una cookie (si existe)
if (isset($_COOKIE['idioma_preferido'])) {
echo "Tu idioma es: " . $_COOKIE['idioma_preferido'];
} else {
echo "No has elegido idioma.";
}
// Borrar una cookie
// Se hace estableciendo una fecha de expiración en el pasado
setcookie("idioma_preferido", "", time() - 3600);Sesiones ($_SESSION): guardando datos en el servidor
En una sesión, los datos suelen guardarse en el servidor y el navegador conserva un identificador de sesión. Esto evita exponer el contenido directamente, aunque el identificador debe protegerse frente a robo o fijación de sesión.
- ¿Dónde vive? Los datos reales en tu servidor; la llave en el usuario.
- ¿Para qué sirve? Logins de usuarios, carritos de compra, datos administrativos.
- Seguridad: El usuario no modifica directamente los datos, pero debes proteger la cookie con HTTPS,
HttpOnly,SameSitey una configuración adecuada.
Cómo se usa:
Llama a session_start() antes de enviar contenido en cada petición PHP que necesite acceder a la sesión.
// 1. Iniciamos la maquinaria (SIEMPRE al principio del archivo)
session_start();
// 2. Guardar datos (Persisten aunque recargues la página)
$_SESSION['usuario_id'] = 45;
$_SESSION['nombre'] = "Laura";
$_SESSION['rol'] = "Admin";
// 3. Leer datos en otra página (o tras recargar)
if (isset($_SESSION['nombre'])) {
echo "Bienvenida de nuevo, " . $_SESSION['nombre'];
}
// 4. Cerrar sesión (Logout)
// session_destroy(); // Destruye los datos en el servidorDiferencias clave (tabla resumen)
| Característica | Cookies | Sesiones |
|---|---|---|
| Ubicación | Navegador del usuario | Datos en el servidor; identificador en una cookie |
| Confianza | El usuario puede modificarlas | El ID puede robarse; hay que protegerlo |
| Capacidad | Pequeña (habitualmente unos 4 KB por cookie) | Depende del almacenamiento del servidor |
| Expiración | La configura la aplicación | Depende de la cookie y de la limpieza del servidor |
| Uso ideal | Preferencias no sensibles | Login, carrito y estado asociado al usuario |
Ejemplo práctico: login sencillo
Este es el esqueleto lógico de cualquier sistema de autenticación en PHP.
<?php
session_start(); // Paso 1: Encender el sistema de sesiones
// Simulamos datos correctos
$usuarioReal = "admin";
$hashReal = password_hash("clave-de-demostracion", PASSWORD_DEFAULT);
// Si envían el formulario
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$u = $_POST['user'];
$p = $_POST['pass'];
if ($u === $usuarioReal && password_verify($p, $hashReal)) {
// LOGIN CORRECTO: Guardamos la "firma" en la sesión
session_regenerate_id(true);
$_SESSION['logueado'] = true;
$_SESSION['usuario'] = $u;
echo "¡Login correcto! Recarga la página para ver el cambio.";
} else {
echo "Credenciales incorrectas.";
}
}
// Verificamos si ya está logueado
if (isset($_SESSION['logueado']) && $_SESSION['logueado'] === true) {
echo "<h1>Panel de Control de " . htmlspecialchars($_SESSION['usuario'], ENT_QUOTES, 'UTF-8') . "</h1>";
echo "<a href='logout.php'>Cerrar Sesión</a>";
} else {
echo "<h1>Bienvenido, Invitado</h1>";
// Aquí iría el formulario HTML de login...
}
?>