Belajar Node.js - Caching, Session, dan State Server-Side
Episode 16 of 23

Belajar Node.js - Caching, Session, dan State Server-Side

Episode ini membahas pengelolaan state: perbedaan aplikasi stateless dan stateful, session server-side dengan express-session, caching dengan Redis, serta header cache HTTP untuk mempercepat respons berulang.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Server HTTP idealnya stateless — setiap request berdiri sendiri dan tidak bergantung pada request sebelumnya. Kenyataannya, aplikasi butuh mengingat sesuatu: keranjang belanja, status login, data yang sering diminta. Di sinilah state server-side, session, dan caching berperan.

Episode 16 menjelaskan tiga lapis state: perbedaan aplikasi stateless dan stateful, session server-side dengan express-session, caching dengan Redis untuk data yang sering diakses, dan header cache HTTP agar respons berulang tidak perlu diproses ulang.

Stateless vs Stateful

Mengapa Stateless Diinginkan

Aplikasi stateless menempatkan seluruh state di request itu sendiri — biasanya lewat token seperti JWT dari episode 11. Keuntungannya besar: server mana pun bisa melayani request apa pun, sehingga scaling horizontal menjadi sederhana dan restart server tidak menghapus data pengguna.

JSAutentikasi stateless
const payload = jwt.verify(token, process.env.JWT_SECRET);
const pengguna = await cariPengguna(payload.userId);

jwt.verify(token, ...) mengembalikan identitas tanpa perlu menyimpan sesi di server. Request membawa semuanya sendiri. Ini pola favorit untuk API modern.

Kapan State Server-Side Diperlukan

Sebagian state tetap hidup lebih baik di server: session login yang bisa dicabut kapan saja, rate limiter per pengguna, atau antrean pekerjaan. Ketika state disimpan di server, identitas request ditandai dengan ID yang unik — biasanya lewat cookie. Episode 11 dan 16 ini adalah dua ujung dari spektrum: JWT untuk stateless, session untuk stateful.

Session Server-Side dengan express-session

Memasang Middleware Session

express-session menyimpan session di server dan mengirim cookie berisi ID ke browser:

Install express-session
npm install express-session

npm install express-session menambahkan middleware session. Di produksi, pasang store Redis agar session bisa dibagikan antar instance server.

Konfigurasi dan Pemakaian

JSSession dengan express-session
import session from "express-session";
 
app.use(
  session({
    secret: process.env.SESSION_SECRET,
    resave: false,
    saveUninitialized: false,
    cookie: { secure: process.env.NODE_ENV === "production", httpOnly: true },
  }),
);
 
app.post("/login", (req, res) => {
  req.session.userId = 42;
  res.json({ status: "success" });
});
 
app.get("/profil", (req, res) => {
  if (!req.session.userId) {
    return res.status(401).json({ error: "Belum login" });
  }
  res.json({ userId: req.session.userId });
});

req.session.userId = 42 menyimpan data session, dan req.session bertahan antar request melalui cookie. Atribut httpOnly: true mencegah JavaScript browser membaca cookie, dan secure: true memaksa HTTPS di produksi. Session bisa dihapus kapan saja oleh server — keunggulan dibanding JWT yang hanya bisa berakhir lewat waktu.

Caching dengan Redis

Menyimpan Hasil yang Sering Diminta

Redis adalah in-memory database yang sering dipakai sebagai cache. Data yang mahal untuk dihitung atau diambil dari database disimpan sementara, sehingga request berikutnya melompati pemrosesan:

Install Redis client
npm install redis

npm install redis menambahkan klien Redis resmi untuk Node.js. Redis menyimpan pasangan key-value di memori, sehingga baca-tulisnya jauh lebih cepat daripada query database.

Pola Cache-Aside

Pola paling umum adalah cache-aside: cek cache dulu; jika kosong, ambil dari database dan isi cache:

JSCache-aside dengan Redis
import { createClient } from "redis";
 
const redis = createClient({ url: process.env.REDIS_URL });
await redis.connect();
 
async function ambilArtikel(id) {
  const cache = await redis.get("artikel:" + id);
  if (cache) return JSON.parse(cache);
 
  const artikel = await cariArtikelDb(id);
  await redis.set("artikel:" + id, JSON.stringify(artikel), { EX: 300 });
  return artikel;
}

redis.get("artikel:" + id) membaca cache; jika ada, langsung dikembalikan. Jika tidak, data diambil dari database lalu disimpan dengan EX: 300 (kedaluwarsa 300 detik). Perhatikan key dengan prefix artikel: untuk menghindari bentrok antar jenis data.

Header Cache HTTP

Memanfaatkan Cache Browser dan Proxy

Selain cache di aplikasi, HTTP sendiri punya mekanisme cache lewat header. Set respons dengan kontrol cache agar client dan proxy tahu data mana yang bisa disimpan:

JSHeader cache pada respons
app.get("/api/kota", (req, res) => {
  res.setHeader("Cache-Control", "public, max-age=3600");
  res.json(daftarKota);
});

res.setHeader("Cache-Control", "public, max-age=3600") memberi tahu browser dan CDN bahwa respons aman disalin selama satu jam. Untuk data pribadi, gunakan private atau no-store. Memadukan cache-aside di Redis dan header HTTP bisa mengurangi beban database secara drastis.

Kapan Memakai Mana

Panduan Ringkas

  • JWT untuk autentikasi stateless yang dibawa request.
  • Session untuk state yang harus bisa dicabut server.
  • Redis untuk cache data yang sering diakses dan berubah jarang.
  • Header HTTP untuk respons publik yang stabil.

Mulailah stateless, tambahkan session hanya jika benar-benar perlu, dan tambahkan cache setelah mengukur bahwa database menjadi hambatan. Optimasi prematur biasanya membawa kompleksitas tanpa manfaat.

Penutup

Inti yang harus dibawa pulang:

  • Stateless memakai JWT; stateful memakai session di server.
  • express-session menyimpan session dan mengirim cookie ID.
  • Cookie session memakai httpOnly dan secure di produksi.
  • Redis adalah cache in-memory untuk data yang sering diminta.
  • Pola cache-aside memeriksa cache lalu database jika kosong.
  • Header Cache-Control mengatur cache di browser dan CDN.

Di episode 17 selanjutnya kita akan membahas pengelolaan file upload dan streaming media — memproses multipart form dengan multer, membatasi ukuran dan tipe file, streaming file dari disk, serta mendukung range request untuk media. API kalian akan siap melayani file dan media sungguhan.

Belajar Node.js - Caching, Session, dan State Server-Side | Belajar Node.js