Course contentsShow
← Node.js
Lesson 1000 of 1,9809. Authentication and Identity ManagementFree lesson

Managing Long-Lived Remember Me Tokens

Implement a persistent, low-privilege token system for long-term user sessions.

In this lesson, you will learn how to implement a secure, low-privilege "Remember Me" system that keeps users logged in without exposing their actual account credentials.

The Problem with Long-Lived Sessions

If you simply extend the expiry of a standard session cookie, you create a massive security risk: if that cookie is stolen, an attacker gains permanent access to the user's full account. To mitigate this, we use a persistent token pattern, often called a "persistent login cookie."

The "Persistent Token" Pattern

Instead of storing a single session ID, we store a specialized "Remember Me" token in the browser. Crucially, this token is not a session identifier; it is a long-lived, randomly generated string stored in your database that acts as a gatekeeper.

When the user returns and their session has expired, your application checks for this persistent token. If valid, you issue a new, short-lived session.

Implementation Strategy

To keep this low-privilege, we store the token as a hash in our database, similar to how we store passwords. If the database is compromised, the attacker cannot immediately reverse the hashes to hijack sessions.

// Example: Storing a persistent token
const crypto = require('crypto');

async function createRememberMeToken(userId) {
  const token = crypto.randomBytes(64).toString('hex');
  const hashedToken = crypto.createHash('sha256').update(token).digest('hex');
  
  // Store the hash, userId, and an expiry date (e.g., 30 days)
  await db.query('INSERT INTO user_tokens (user_id, token_hash, expires_at) VALUES (?, ?, ?)', 
    [userId, hashedToken, new Date(Date.now() + 30 * 24 * 60 * 60 * 1000)]);
    
  return token; // Send this raw token to the user's browser cookie
}

Why it’s "Low Privilege"

The token acts only as a key to re-authenticate the user, not as the session itself. Because it is hashed in the database, it provides a layer of protection against direct database leaks. Furthermore, you should implement "One-Time Use" semantics: if a token is reused, it implies the token may have been stolen, and you should immediately invalidate all active "Remember Me" tokens for that user to force a manual re-login.

Key Takeaway: A persistent "Remember Me" token should be treated as a hashed, one-time-use credential that exists only to bootstrap a new, short-lived session, never as the permanent session itself.