Masalah login yang harus dilakukan dua kali sebelum berhasil masuk ke dashboard adalah kasus yang cukup sering terjadi pada aplikasi berbasis PHP. Secara kasat mata, username dan password sudah benar, tetapi sistem tidak langsung mengarahkan ke halaman tujuan.
Artikel ini membahas penyebab teknisnya dan cara memperbaikinya secara tepat.
π Gejala yang Terjadi
- Login pertama: tidak masuk / tetap di halaman login
- Login kedua: baru berhasil masuk
- Tidak ada error yang jelas
π― Penyebab Utama
1. Session Belum Tersimpan Saat Redirect
PHP menyimpan session di akhir eksekusi script. Jika langsung redirect tanpa memastikan session sudah ditulis, maka request berikutnya belum mengenali login.
Contoh masalah:
<code>$_SESSION['login'] = $user['id'];
header("Location:dashboard.php");
</code>
π Session bisa belum tersimpan saat redirect terjadi.
2. CSRF Token Dihapus (Unset)
Banyak developer melakukan ini:
<code>unset($_SESSION['csrf_token']); </code>
π Ini menyebabkan:
- Request berikutnya tidak memiliki token
- Form lama masih membawa token lama
- Terjadi mismatch
Akibatnya:
- Login pertama gagal
- Login kedua berhasil
3. Tidak Ada exit() Setelah Header Redirect
Tanpa exit, script masih lanjut mengeksekusi HTML di bawahnya.
<code>header("Location:dashboard.php");
// tidak ada exit
</code>
π Bisa menyebabkan:
- Output tambahan terkirim
- Redirect tidak berjalan sempurna
4. Output Sudah Terkirim Sebelum Header
Jika ada output sebelum header(), maka redirect gagal.
Contoh:
<code>echo "test";
header("Location:dashboard.php");
</code>
β Solusi yang Benar
βοΈ 1. Gunakan session_write_close()
Pastikan session benar-benar tersimpan sebelum redirect:
<code>session_write_close();
header("Location:dashboard.php");
exit;
</code>
βοΈ 2. Jangan Hapus CSRF Token, Tapi Rotate
Ganti:
<code>unset($_SESSION['csrf_token']); </code>
Dengan:
<code>$_SESSION['csrf_token'] = bin2hex(random_bytes(32)); </code>
π Lebih aman dan tidak menyebabkan mismatch
βοΈ 3. Selalu Gunakan exit Setelah Redirect
<code>header("Location:dashboard.php");
exit;
</code>
βοΈ 4. Gunakan Fallback JavaScript (Opsional)
Jika redirect PHP masih tidak konsisten:
<code>echo "<script>window.location='dashboard.php';</script>"; exit; </code>
βοΈ 5. Tambahkan Debug headers_sent()
Untuk memastikan tidak ada output sebelum header:
<code>if (headers_sent($file, $line)) {
die("Header sudah dikirim di $file baris $line");
}
</code>
π₯ Contoh Implementasi Stabil
<code>if ($success == 1) {
$_SESSION['login'] = $user['id'];
$_SESSION['username'] = $user['username'];
// Rotate CSRF
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
// Pastikan session tersimpan
session_write_close();
// Redirect
header("Location:dashboard.php");
exit;
}
</code>
π§ Kesimpulan
Masalah login harus 2x biasanya disebabkan oleh:
- Session belum tersimpan saat redirect
- CSRF token dihapus (bukan di-rotate)
- Tidak menggunakan
exitsetelah header - Output sudah terkirim sebelum redirect
π Solusi utamanya adalah memastikan alur login mengikuti standar HTTP dan manajemen session yang benar.
π Tips Tambahan
- Hindari hardcoded password (master password)
- Gunakan HTTPS untuk keamanan session
- Gunakan
SameSitecookie untuk proteksi tambahan
Dengan memperbaiki hal-hal di atas, sistem login akan menjadi lebih stabil, aman, dan tidak membingungkan pengguna.