Session-based Authentication — Auth

Session-based authentication adalah metode tradisional di mana server menyimpan state login user dan mengirim session ID ke browser via cookie. Alur lengkap: 1.

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:

Kekurangan:

Tips keamanan: