Day 3 of 5
⏱ ~60 minutes
Redis in 5 Days — Day 3

Sessions and Auth

Store user sessions in Redis, implement remember-me tokens, share sessions across multiple app instances.

Why Redis for Sessions

By default, Express stores sessions in memory. That works for one server. The moment you have two servers behind a load balancer, sessions don't work — requests hit different servers and only one has the session. Redis fixes this.

Express + Redis sessions
npm install express-session connect-redis redis

import session from 'express-session';
import RedisStore from 'connect-redis';
import { createClient } from 'redis';

const redisClient = createClient({ url: process.env.REDIS_URL });
await redisClient.connect();

app.use(session({
  store: new RedisStore({ client: redisClient }),
  secret: process.env.SESSION_SECRET,
  resave: false,
  saveUninitialized: false,
  cookie: {
    secure: process.env.NODE_ENV === 'production',
    httpOnly: true,
    maxAge: 24 * 60 * 60 * 1000  // 24 hours
  }
}));

// Login: store user in session
app.post('/login', async (req, res) => {
  const user = await authenticateUser(req.body);
  req.session.userId = user.id;
  req.session.role = user.role;
  res.json({ success: true });
});
Manual token storage (for APIs)
// For JWTs with revocation support
// Blacklist: store invalidated tokens until they expire
async function logout(token) {
  const decoded = jwt.decode(token);
  const ttl = decoded.exp - Math.floor(Date.now() / 1000);
  if (ttl > 0) {
    await redis.setEx(`blacklist:${token}`, ttl, '1');
  }
}

async function isTokenBlacklisted(token) {
  return await redis.exists(`blacklist:${token}`) === 1;
}
📝 Day 3 Exercise
Implement Session-Based Auth
  1. R
  2. e
  3. p
  4. l
  5. a
  6. c
  7. e
  8. i
  9. n
  10. -
  11. m
  12. e
  13. m
  14. o
  15. r
  16. y
  17. s
  18. e
  19. s
  20. s
  21. i
  22. o
  23. n
  24. s
  25. w
  26. i
  27. t
  28. h
  29. R
  30. e
  31. d
  32. i
  33. s
  34. s
  35. e
  36. s
  37. s
  38. i
  39. o
  40. n
  41. s
  42. .
  43. T
  44. e
  45. s
  46. t
  47. b
  48. y
  49. l
  50. o
  51. g
  52. g
  53. i
  54. n
  55. g
  56. i
  57. n
  58. ,
  59. r
  60. e
  61. s
  62. t
  63. a
  64. r
  65. t
  66. i
  67. n
  68. g
  69. t
  70. h
  71. e
  72. s
  73. e
  74. r
  75. v
  76. e
  77. r
  78. (
  79. o
  80. r
  81. u
  82. s
  83. i
  84. n
  85. g
  86. t
  87. w
  88. o
  89. s
  90. e
  91. r
  92. v
  93. e
  94. r
  95. i
  96. n
  97. s
  98. t
  99. a
  100. n
  101. c
  102. e
  103. s
  104. )
  105. ,
  106. a
  107. n
  108. d
  109. c
  110. o
  111. n
  112. f
  113. i
  114. r
  115. m
  116. i
  117. n
  118. g
  119. t
  120. h
  121. e
  122. s
  123. e
  124. s
  125. s
  126. i
  127. o
  128. n
  129. p
  130. e
  131. r
  132. s
  133. i
  134. s
  135. t
  136. s
  137. .

Day 3 Summary

  • Redis sessions work across multiple server instances — required for horizontal scaling.
  • connect-redis is the Express session store. One line to switch from memory to Redis.
  • Set httpOnly: true and secure: true (in prod) on session cookies always.
  • Token blacklisting: store invalidated JWTs in Redis with TTL = remaining lifetime.
Finished this lesson?