Session-based authentication adalah metode tradisional di mana server menyimpan state login user dan mengirim session ID ke browser via cookie.
Alur lengkap:
1. POST /login { email, password }
2. Server verifikasi kredensial
3. Server buat session (simpan user data di server)
4. Server kirim cookie: Set-Cookie: session_id=abc123; HttpOnly; Secure
5. Browser otomatis kirim cookie di setiap request
6. Server baca session_id → ambil data user → proses request
7. POST /logout → server hapus session
Implementasi:
const express = require("express");
const session = require("express-session");
const app = express();
app.use(session({
secret: "rahasia-super-aman", // untuk sign session ID
resave: false,
saveUninitialized: false,
cookie: {
httpOnly: true,
secure: true, // hanya HTTPS
sameSite: "strict", // cegah CSRF
maxAge: 24 * 60 * 60 * 1000 // 24 jam
}
}));
// Login
app.post("/login", async (req, res) => {
const { email, password } = req.body;
const user = await authenticate(email, password);
if (!user) {
return res.status(401).json({ error: "Email atau password salah" });
}
// Simpan data di session (disimpan di server)
req.session.userId = user.id;
req.session.role = user.role;
res.json({ message: "Login berhasil" });
});
// Middleware cek auth
function requireAuth(req, res, next) {
if (!req.session.userId) {
return res.status(401).json({ error: "Silakan login dulu" });
}
next();
}
// Route yang butuh auth
app.get("/profile", requireAuth, async (req, res) => {
const user = await db.findUserById(req.session.userId);
res.json(user);
});
// Logout
app.post("/logout", (req, res) => {
req.session.destroy((err) => {
res.clearCookie("connect.sid");
res.json({ message: "Logout berhasil" });
});
});
Di mana menyimpan session data:
| Storage | Kelebihan | Kekurangan |
|---|---|---|
| Memory | Cepat, mudah | Hilang saat restart, tidak scalable |
| Database | Persistent | Lebih lambat |
| Redis | Cepat + persistent | Butuh setup tambahan |
| File | Sederhana | Lambat untuk traffic tinggi |
Kelebihan session-based auth:
- Mudah di-revoke (hapus session di server → user langsung logout)
- Server punya kontrol penuh atas session
- Data sensitif tidak terekspos ke client
- Cookie otomatis dikirim browser (tidak perlu JavaScript khusus)
Kekurangan:
- Server harus menyimpan state (butuh memori/storage)
- Sulit di-scale horizontal (session harus shared antar server)
- CSRF attack bisa terjadi jika cookie tidak dikonfigurasi dengan benar
Tips keamanan:
- Regenerate session ID setelah login (cegah session fixation)
- Set expiry yang wajar (jangan selamanya)
- Gunakan HttpOnly + Secure + SameSite pada cookie
- Simpan session di Redis untuk production (cepat + bisa di-share antar server)