Sesiones y Cookies

Intermedio
PHP
PHP
Actualizado: 29/08/2025

Sesiones

Las sesiones en PHP constituyen un mecanismo fundamental para mantener información específica del usuario durante su navegación por una aplicación web. A diferencia de las variables tradicionales que se pierden al finalizar la ejecución del script, las sesiones permiten conservar datos entre múltiples peticiones HTTP del mismo usuario.

Concepto y funcionamiento

Una sesión representa una conversación temporal entre el servidor y un cliente específico. Cuando un usuario accede por primera vez a una aplicación PHP que utiliza sesiones, el servidor genera un identificador único llamado session ID y lo envía al navegador, típicamente mediante una cookie especial.

El navegador almacena este identificador y lo envía automáticamente en cada petición posterior al mismo dominio. El servidor utiliza este ID para recuperar los datos almacenados previamente para ese usuario específico.

<?php
// Iniciar una nueva sesión o continuar la existente
session_start();

// El ID de sesión se genera automáticamente
echo "ID de sesión: " . session_id();
?>

Inicialización de sesiones

La función session_start() debe llamarse antes de enviar cualquier salida al navegador, incluyendo espacios en blanco o etiquetas HTML. Esta función verifica si existe una sesión activa para el usuario y, en caso contrario, crea una nueva.

<?php
// CORRECTO: session_start() al inicio del archivo
session_start();

// Verificar si la sesión se inició correctamente
if (session_status() === PHP_SESSION_ACTIVE) {
    echo "Sesión iniciada correctamente";
}
?>

Práctica recomendada: Incluir session_start() en un archivo de configuración que se cargue en todas las páginas que requieran sesiones.

<?php
// config.php
session_start();

// Configuración adicional de la aplicación
define('APP_NAME', 'Mi Aplicación');
?>

Almacenamiento y recuperación de datos

La superglobal **$_SESSION** funciona como un array asociativo donde podemos almacenar cualquier tipo de dato que PHP pueda serializar. Los datos se mantienen disponibles hasta que la sesión expire o sea destruida explícitamente.

<?php
session_start();

// Almacenar información del usuario
$_SESSION['usuario_id'] = 1234;
$_SESSION['nombre'] = 'Ana García';
$_SESSION['email'] = 'ana@ejemplo.com';
$_SESSION['rol'] = 'administrador';

// Almacenar arrays y objetos
$_SESSION['configuraciones'] = [
    'tema' => 'oscuro',
    'idioma' => 'es',
    'notificaciones' => true
];
?>

Para recuperar los datos almacenados en páginas posteriores:

<?php
session_start();

// Verificar si existen datos en la sesión
if (isset($_SESSION['nombre'])) {
    echo "Bienvenido, " . $_SESSION['nombre'];
} else {
    echo "Por favor, inicia sesión";
}

// Mostrar configuraciones del usuario
if (isset($_SESSION['configuraciones'])) {
    $config = $_SESSION['configuraciones'];
    echo "Tema: " . $config['tema'];
    echo "Idioma: " . $config['idioma'];
}
?>

Verificación y validación de sesiones

Es fundamental validar la existencia de datos de sesión antes de utilizarlos para evitar errores y garantizar la seguridad de la aplicación.

<?php
session_start();

// Función auxiliar para verificar autenticación
function usuarioAutenticado() {
    return isset($_SESSION['usuario_id']) && !empty($_SESSION['usuario_id']);
}

// Verificar múltiples condiciones
function validarSesion() {
    if (!usuarioAutenticado()) {
        return false;
    }
    
    // Verificar tiempo de actividad (opcional)
    if (isset($_SESSION['ultimo_acceso'])) {
        $tiempoInactivo = time() - $_SESSION['ultimo_acceso'];
        if ($tiempoInactivo > 1800) { // 30 minutos
            return false;
        }
    }
    
    return true;
}

// Uso práctico
if (validarSesion()) {
    $_SESSION['ultimo_acceso'] = time();
    echo "Acceso autorizado";
} else {
    header('Location: login.php');
    exit;
}
?>

Modificación y eliminación de datos

Los datos de sesión pueden modificarse en cualquier momento durante la ejecución del script, y los cambios se reflejan inmediatamente.

<?php
session_start();

// Modificar datos existentes
$_SESSION['nombre'] = 'Ana García Rodríguez';
$_SESSION['configuraciones']['tema'] = 'claro';

// Agregar nuevos elementos
$_SESSION['carrito'] = [];
$_SESSION['carrito'][] = ['producto' => 'Laptop', 'precio' => 899.99];
$_SESSION['carrito'][] = ['producto' => 'Mouse', 'precio' => 25.50];

// Eliminar elementos específicos
unset($_SESSION['configuraciones']['notificaciones']);

// Contar elementos en el carrito
$totalProductos = count($_SESSION['carrito']);
echo "Productos en carrito: " . $totalProductos;
?>

Destrucción de sesiones

Para finalizar una sesión completamente, es necesario realizar varios pasos que garanticen la eliminación completa de los datos tanto del servidor como del cliente.

<?php
session_start();

// Función completa para cerrar sesión
function cerrarSesion() {
    // Eliminar todas las variables de sesión
    $_SESSION = [];
    
    // Eliminar la cookie de sesión si existe
    if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
            $params["path"], $params["domain"],
            $params["secure"], $params["httponly"]
        );
    }
    
    // Destruir la sesión en el servidor
    session_destroy();
}

// Implementación en página de logout
if (isset($_POST['cerrar_sesion'])) {
    cerrarSesion();
    header('Location: index.php');
    exit;
}
?>

Configuración y seguridad básica

PHP ofrece diversas opciones de configuración para sesiones que mejoran la seguridad y el rendimiento de la aplicación.

<?php
// Configuración antes de session_start()
ini_set('session.cookie_httponly', 1); // Previene acceso via JavaScript
ini_set('session.use_only_cookies', 1); // Solo usar cookies para session ID
ini_set('session.cookie_secure', 1);    // Solo HTTPS (en producción)

// Configurar tiempo de vida de la sesión
ini_set('session.gc_maxlifetime', 3600); // 1 hora

// Regenerar ID de sesión periódicamente
session_start();

// Regenerar ID cada 5 minutos para mayor seguridad
if (!isset($_SESSION['creada'])) {
    $_SESSION['creada'] = time();
} else if (time() - $_SESSION['creada'] > 300) {
    session_regenerate_id(true);
    $_SESSION['creada'] = time();
}
?>

Cookies

Las cookies en PHP representan un mecanismo de almacenamiento que permite guardar pequeñas cantidades de información directamente en el navegador del usuario. A diferencia de las sesiones que almacenan datos en el servidor, las cookies se almacenan físicamente en el dispositivo del cliente y se envían automáticamente con cada petición HTTP al dominio que las creó.

Concepto y características fundamentales

Una cookie es un archivo de texto pequeño que contiene pares clave-valor junto con metadatos que controlan su comportamiento. Estas características hacen que las cookies sean ideales para almacenar preferencias del usuario, configuraciones básicas y datos que necesitan persistir entre sesiones.

Las cookies tienen limitaciones importantes: cada cookie puede almacenar máximo 4KB de datos, y los navegadores suelen limitar a 50 cookies por dominio. Además, son visibles para el usuario y pueden ser modificadas o eliminadas desde el navegador.

<?php
// Crear una cookie básica
setcookie('nombre_usuario', 'María', time() + 3600);

// La cookie estará disponible en la siguiente carga de página
// No en la misma petición donde se crea
?>

Creación y configuración de cookies

La función setcookie() debe ejecutarse antes de cualquier salida HTML, similar a session_start(). Esta función acepta múltiples parámetros que controlan el comportamiento de la cookie.

<?php
// Sintaxis completa de setcookie()
setcookie(
    'preferencias_usuario',           // nombre
    json_encode(['tema' => 'oscuro']), // valor
    time() + (86400 * 30),            // expiración (30 días)
    '/',                              // path (toda la web)
    '',                               // domain (dominio actual)
    false,                            // secure (solo HTTPS)
    true                              // httponly (no accesible via JavaScript)
);

// Verificar que la cookie se estableció correctamente
if (headers_sent()) {
    echo "Error: No se pueden establecer cookies después de enviar headers";
} else {
    echo "Cookie establecida correctamente";
}
?>

Recuperación y manipulación de datos

Las cookies se acceden mediante la superglobal **$_COOKIE** y están disponibles inmediatamente después de la primera petición en la que fueron creadas. Es importante validar siempre la existencia de las cookies antes de usarlas.

<?php
// Verificar y recuperar cookies
if (isset($_COOKIE['preferencias_usuario'])) {
    $preferencias = json_decode($_COOKIE['preferencias_usuario'], true);
    $tema = $preferencias['tema'] ?? 'claro';
    echo "Tema seleccionado: " . $tema;
} else {
    echo "No hay preferencias guardadas";
}

// Función auxiliar para leer cookies de forma segura
function obtenerCookie($nombre, $valorPorDefecto = null) {
    return $_COOKIE[$nombre] ?? $valorPorDefecto;
}

// Uso de la función auxiliar
$idioma = obtenerCookie('idioma', 'es');
$mostrarTutorial = obtenerCookie('tutorial_completado', 'false') === 'true';
?>

Cookies para recordar preferencias

Un uso práctico de las cookies es almacenar configuraciones que el usuario prefiere mantener entre visitas, como temas visuales o configuraciones de la interfaz.

<?php
// Procesar formulario de configuraciones
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $tema = $_POST['tema'] ?? 'claro';
    $idioma = $_POST['idioma'] ?? 'es';
    $mostrarNotificaciones = isset($_POST['notificaciones']) ? 'true' : 'false';
    
    // Establecer cookies con expiración de 1 año
    $expiracion = time() + (365 * 24 * 60 * 60);
    
    setcookie('tema_usuario', $tema, $expiracion, '/');
    setcookie('idioma_usuario', $idioma, $expiracion, '/');
    setcookie('notificaciones_activas', $mostrarNotificaciones, $expiracion, '/');
    
    $mensaje = "Preferencias guardadas correctamente";
}

// Aplicar configuraciones guardadas
$temaActual = obtenerCookie('tema_usuario', 'claro');
$idiomaActual = obtenerCookie('idioma_usuario', 'es');
$notificacionesActivas = obtenerCookie('notificaciones_activas', 'false') === 'true';
?>

<!DOCTYPE html>
<html>
<head>
    <title>Configuración</title>
    <link rel="stylesheet" href="estilos-<?= $temaActual ?>.css">
</head>
<body>
    <?php if (isset($mensaje)): ?>
        <p style="color: green;"><?= $mensaje ?></p>
    <?php endif; ?>
    
    <form method="POST">
        <label>
            Tema:
            <select name="tema">
                <option value="claro" <?= $temaActual === 'claro' ? 'selected' : '' ?>>Claro</option>
                <option value="oscuro" <?= $temaActual === 'oscuro' ? 'selected' : '' ?>>Oscuro</option>
            </select>
        </label>
        
        <label>
            Idioma:
            <select name="idioma">
                <option value="es" <?= $idiomaActual === 'es' ? 'selected' : '' ?>>Español</option>
                <option value="en" <?= $idiomaActual === 'en' ? 'selected' : '' ?>>English</option>
            </select>
        </label>
        
        <label>
            <input type="checkbox" name="notificaciones" <?= $notificacionesActivas ? 'checked' : '' ?>>
            Recibir notificaciones
        </label>
        
        <button type="submit">Guardar Configuración</button>
    </form>
</body>
</html>

Implementación de "Recordar usuario"

Las cookies son fundamentales para implementar la funcionalidad "Recordarme" en formularios de login, permitiendo que el usuario no tenga que introducir sus credenciales en cada visita.

<?php
// Procesar login con opción "recordar"
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $usuario = $_POST['usuario'] ?? '';
    $password = $_POST['password'] ?? '';
    $recordar = isset($_POST['recordar']);
    
    // Validar credenciales (ejemplo simplificado)
    if ($usuario === 'admin' && $password === 'secreto123') {
        // Iniciar sesión normal
        session_start();
        $_SESSION['usuario'] = $usuario;
        
        // Si marcó "recordar", crear cookie
        if ($recordar) {
            $token = bin2hex(random_bytes(32)); // Token seguro
            setcookie('token_recordar', $token, time() + (30 * 24 * 60 * 60), '/', '', false, true);
            
            // En aplicación real, guardar token en base de datos asociado al usuario
            // file_put_contents('tokens.txt', $usuario . ':' . $token . "\n", FILE_APPEND);
        }
        
        header('Location: dashboard.php');
        exit;
    }
}

// Verificar token de "recordar" al cargar la página
if (!isset($_SESSION['usuario']) && isset($_COOKIE['token_recordar'])) {
    $token = $_COOKIE['token_recordar'];
    
    // En aplicación real, verificar token en base de datos
    // Por ahora, ejemplo simplificado
    if (strlen($token) === 64) { // Token válido
        session_start();
        $_SESSION['usuario'] = 'admin'; // Usuario asociado al token
        header('Location: dashboard.php');
        exit;
    }
}
?>

Eliminación de cookies

Para eliminar una cookie, es necesario establecer una fecha de expiración en el pasado. PHP no puede eliminar directamente las cookies del navegador del usuario.

<?php
// Función para eliminar cookies
function eliminarCookie($nombre, $path = '/', $domain = '') {
    setcookie($nombre, '', time() - 3600, $path, $domain);
    
    // También eliminar del array $_COOKIE para la petición actual
    if (isset($_COOKIE[$nombre])) {
        unset($_COOKIE[$nombre]);
    }
}

// Implementar "Cerrar sesión completa"
if (isset($_POST['cerrar_sesion_completa'])) {
    // Destruir sesión
    session_start();
    session_destroy();
    
    // Eliminar cookies relacionadas
    eliminarCookie('token_recordar');
    eliminarCookie('tema_usuario');
    eliminarCookie('preferencias_usuario');
    
    echo "Sesión cerrada y cookies eliminadas";
}

// Limpiar cookies específicas
if (isset($_POST['resetear_preferencias'])) {
    eliminarCookie('tema_usuario');
    eliminarCookie('idioma_usuario');
    eliminarCookie('notificaciones_activas');
    
    header('Location: configuracion.php');
    exit;
}
?>

Configuración avanzada y seguridad

Las cookies modernas incluyen atributos de seguridad importantes que protegen la información del usuario y previenen ataques comunes.

<?php
// Configuración segura de cookies
function crearCookieSegura($nombre, $valor, $diasExpiracion = 30) {
    $opciones = [
        'expires' => time() + ($diasExpiracion * 24 * 60 * 60),
        'path' => '/',
        'domain' => '', // Dominio actual
        'secure' => isset($_SERVER['HTTPS']), // Solo HTTPS si disponible
        'httponly' => true, // No accesible via JavaScript
        'samesite' => 'Strict' // Protección CSRF
    ];
    
    return setcookie($nombre, $valor, $opciones);
}

// Usar la función segura
if (crearCookieSegura('configuracion_segura', json_encode(['version' => '1.0']))) {
    echo "Cookie segura establecida";
} else {
    echo "Error al establecer cookie";
}
?>

Diferencias prácticas entre cookies y sesiones

Comprender cuándo usar cookies versus sesiones es crucial para el desarrollo web efectivo:

<?php
session_start();

// SESIONES: Para datos sensibles y temporales
$_SESSION['usuario_id'] = 1234;           // ID del usuario autenticado
$_SESSION['carrito'] = ['prod1', 'prod2']; // Carrito de compras
$_SESSION['ultimo_acceso'] = time();       // Control de actividad

// COOKIES: Para preferencias y datos no sensibles
setcookie('vista_preferida', 'lista', time() + (365 * 24 * 60 * 60));
setcookie('ciudad_usuario', 'Madrid', time() + (30 * 24 * 60 * 60));
setcookie('cookies_aceptadas', 'true', time() + (365 * 24 * 60 * 60));

// Combinar ambas tecnologías
if (isset($_COOKIE['tema_usuario'])) {
    $_SESSION['tema_actual'] = $_COOKIE['tema_usuario'];
} else {
    $_SESSION['tema_actual'] = 'claro'; // Valor por defecto
}
?>

Fuentes y referencias

Documentación oficial y recursos externos para profundizar en PHP

Documentación oficial de PHP
Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, PHP es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de PHP

Explora más contenido relacionado con PHP y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

  • Comprender el concepto y funcionamiento de las sesiones en PHP.
  • Aprender a iniciar, modificar, validar y destruir sesiones.
  • Entender cómo crear, configurar, recuperar y eliminar cookies.
  • Diferenciar usos prácticos entre sesiones y cookies.
  • Implementar ejemplos básicos de autenticación y gestión de preferencias con sesiones y cookies.