Un sistema de “Recordarme” mal hecho es un agujero de seguridad gigante. No guardes contraseñas ni IDs directos en las cookies.

Solución Rápida (Code Snippet)

Este es el flujo lógico para generar un token seguro y guardarlo.

<?php
// 1. Generar tokens aleatorios
$selector = bin2hex(random_bytes(8));
$token = bin2hex(random_bytes(32)); // El validador
$hashedToken = password_hash($token, PASSWORD_DEFAULT);

// 2. Guardar en la base de datos (selector, hash, id_usuario, expiracion)
$expiry = date('Y-m-d H:i:s', time() + 86400 * 30); // 30 días
$stmt = $pdo->prepare("INSERT INTO user_tokens (selector, token, user_id, expires) VALUES (?, ?, ?, ?)");
$stmt->execute([$selector, $hashedToken, $user_id, $expiry]);

// 3. Crear la cookie (selector:validador)
$cookieValue = $selector . ':' . $token;
setcookie('remember_me', $cookieValue, [
    'expires' => time() + 86400 * 30,
    'path' => '/',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Lax'
]);
?>

Cómo funciona

El método estándar en 2026 es el de Selector/Validador:

  1. Selector: Una cadena pública que usamos para buscar el registro en la base de datos (evita ataques de temporización).
  2. Validador (Token): Una clave secreta que solo el usuario tiene en su cookie. En la DB solo guardamos el hash (igual que una contraseña).
  3. Verificación: Al regresar al sitio, separamos la cookie por el colon (:), buscamos por selector, y verificamos el token con password_verify().

¿Por qué este método?

Si alguien roba tu base de datos, no puede generar cookies falsas porque solo tiene los hashes, no los tokens reales.

Enlaces Internos


Preguntas Frecuentes

El atacante podrá entrar. Por eso es vital usar Secure y HttpOnly para que solo se envíe por HTTPS y no sea accesible por virus JS.

¿Debo borrar el token al cerrar sesión?

Sí. Siempre borra el registro de la base de datos y la cookie del navegador cuando el usuario haga “Logout”.