Mekanisme login dan manajemen sesi

12 Jun 2026 | Oleh: rastono sumardi

Mekanisme login dan manajemen sesi

Mekanisme login dan manajemen sesi adalah fondasi keamanan aplikasi; jika rapuh, seluruh data di dalamnya terancam.

Berikut adalah panduan lengkap dan terpadu mengenai tiga pilar utama: Keamanan Sandi, Multi-Factor Authentication (MFA), dan Manajemen Sesi, lengkap dengan konsep dasar serta contoh implementasinya di Node.js dan PHP.

1. Keamanan Sandi (Password Security)

Konsep Mendalam

Menyimpan kata sandi dalam teks asli (plain text) adalah celah keamanan fatal. Kata sandi harus melalui proses hashing (satu arah), bukan sekadar enkripsi (bisa dibalikkan). Algoritma lama seperti MD5 atau SHA1 sangat rentan diretas menggunakan perangkat keras modern karena dirancang terlalu cepat.

Gunakan algoritma modern seperti Bcrypt atau Argon2, yang memiliki dua keunggulan utama:

  • Salt Otomatis: Menambahkan teks acak ke setiap kata sandi sebelum di-hash untuk menggagalkan serangan Rainbow Tables.

  • Work Factor (Cost): Sengaja memperlambat proses komputasi untuk menahan serangan Brute Force.

Implementasi Node.js (menggunakan bcrypt)

JavaScript
const bcrypt = require('bcrypt');
const saltRounds = 12; // Work factor standar

// 1. Hash sandi saat Register
async function registerUser(plainPassword) {
    const hashedPassword = await bcrypt.hash(plainPassword, saltRounds);
    return hashedPassword; // Simpan ini ke DB
}

// 2. Verifikasi sandi saat Login
async function loginUser(plainPassword, hashedPasswordFromDB) {
    const match = await bcrypt.compare(plainPassword, hashedPasswordFromDB);
    return match; // true jika cocok
}

Implementasi PHP (menggunakan fungsi bawaan)

PHP
<?php
// 1. Hash sandi saat Register
function registerUser($plainPassword) {
    $options = ['cost' => 12]; // Work factor
    // Otomatis menggunakan Bcrypt dan menghasilkan salt
    $hashedPassword = password_hash($plainPassword, PASSWORD_BCRYPT, $options);
    return $hashedPassword; // Simpan ini ke DB
}

// 2. Verifikasi sandi saat Login
function loginUser($plainPassword, $hashedPasswordFromDB) {
    // password_verify otomatis membaca salt dan membandingkan hash
    return password_verify($plainPassword, $hashedPasswordFromDB); // true jika cocok
}
?>

2. Multi-Factor Authentication (MFA)

Konsep Mendalam

MFA mencegah pengambilalihan akun meskipun kata sandi bocor. Standar yang paling umum dan aman adalah TOTP (Time-Based One-Time Password). Server dan aplikasi pihak ketiga (seperti Google Authenticator) berbagi "Kunci Rahasia" unik untuk menghasilkan kode 6 digit yang berubah setiap 30 detik berdasarkan perhitungan waktu.

Implementasi Node.js (menggunakan otplib & qrcode)

JavaScript
const { authenticator } = require('otplib');
const qrcode = require('qrcode');

// 1. Setup MFA (menghasilkan rahasia & QR code)
async function setupMFA(userEmail) {
    const secret = authenticator.generateSecret(); // Simpan ke DB untuk user ini
    const otpauth = authenticator.keyuri(userEmail, 'AplikasiNodeSaya', secret);
    const qrCodeUrl = await qrcode.toDataURL(otpauth);
    return { secret, qrCodeUrl }; // Tampilkan QR ke user
}

// 2. Verifikasi Kode saat Login
function verifyMFA(userCode, userSecretFromDB) {
    return authenticator.check(userCode, userSecretFromDB); // true jika kode valid
}

Implementasi PHP (menggunakan library robthree/twofactorauth)

PHP
<?php
require 'vendor/autoload.php';
use RobThree\Auth\TwoFactorAuth;

$tfa = new TwoFactorAuth('AplikasiPHPSaya');

// 1. Setup MFA (menghasilkan rahasia & QR code)
function setupMFA($tfa, $userEmail) {
    $secret = $tfa->createSecret(); // Simpan ke DB untuk user ini
    $qrCodeUri = $tfa->getQRCodeImageAsDataUri($userEmail, $secret);
    return ['secret' => $secret, 'qr' => $qrCodeUri]; // Tampilkan gambar QR ke user
}

// 2. Verifikasi Kode saat Login
function verifyMFA($tfa, $userCode, $userSecretFromDB) {
    return $tfa->verifyCode($userSecretFromDB, $userCode); // true jika kode valid
}
?>

3. Manajemen Sesi (Session Management)

Konsep Mendalam

Setelah otentikasi berhasil, server memberikan "Session ID" ke browser pengguna (biasanya via Cookie) agar mereka tetap masuk. Melindungi Cookie ini wajib hukumnya untuk mencegah pembajakan sesi (Session Hijacking) dan pencurian sesi (Cross-Site Scripting / XSS).

Bendera (flags) keamanan penting untuk Cookie Sesi:

  • Secure: Hanya dikirim via koneksi HTTPS.

  • HttpOnly: Tidak bisa diakses oleh JavaScript di browser.

  • SameSite: Mencegah pengiriman cookie dari domain pihak ketiga (perlindungan CSRF).

Implementasi Node.js (menggunakan express-session)

JavaScript
const express = require('express');
const session = require('express-session');
const app = express();

// 1. Konfigurasi Keamanan Sesi
app.use(session({
    secret: 'RahasiaPanjangDanAman!2026',
    resave: false,
    saveUninitialized: false,
    cookie: {
        secure: true,       // Wajib true di server production (HTTPS)
        httpOnly: true,     // Perlindungan XSS
        sameSite: 'strict', // Perlindungan CSRF
        maxAge: 3600000     // Kedaluwarsa 1 jam
    }
}));

// 2. Logika Login (Penting: Regenerasi Sesi)
app.post('/login', (req, res) => {
    // ... asumsi login & MFA berhasil ...
    
    // Regenerasi sesi untuk mencegah Session Fixation
    req.session.regenerate((err) => {
        if (err) return res.status(500).send("Gagal");
        req.session.userId = "user_123"; // Set sesi baru
        res.send("Login Berhasil!");
    });
});

Implementasi PHP (Konfigurasi bawaan)

PHP
<?php
// 1. Konfigurasi Keamanan Sesi (Lakukan sebelum session_start)
ini_set('session.use_strict_mode', 1);

session_set_cookie_params([
    'lifetime' => 3600,         // Kedaluwarsa 1 jam
    'path' => '/',
    'domain' => '',
    'secure' => true,           // Wajib true di server production (HTTPS)
    'httponly' => true,         // Perlindungan XSS
    'samesite' => 'Strict'      // Perlindungan CSRF
]);

session_start();

// 2. Logika Login (Penting: Regenerasi Sesi)
function processLoginSuccess($userId) {
    // ... asumsi login & MFA berhasil ...
    
    // Regenerasi sesi dan hapus file sesi lama untuk mencegah Session Fixation
    session_regenerate_id(true);
    
    $_SESSION['user_id'] = $userId; // Set sesi baru
    echo "Login Berhasil!";
}
?>

Ditulis oleh:

rastono sumardi

Kontributor Banggai Kreatif

Bagikan Artikel Ini: