HTTP 419LaravelCSRFFormHTTP6 mnt baca

Memperbaiki 419 Page Expired di Laravel

Form Laravel melempar 419 Page Expired setiap disubmit. Hampir selalu soal CSRF token.

1 · Gejala & Log Pesan Error

error.log
// browser menampilkan halaman:
419
Page Expired

// di network tab: POST /login → 419
// varian AJAX:
POST http://localhost:8000/api/simpan 419 (unknown status)

2 · Akar Penyebab Masalah

Laravel Menolak Request Tanpa Token CSRF yang Valid

Middleware VerifyCsrfToken memeriksa setiap request POST/PUT/PATCH/DELETE: apakah ia membawa token CSRF yang cocok dengan session user? Kalau tidak cocok (atau tidak ada), Laravel menolak dengan 419.

Penyebab paling umum:

  1. Lupa @csrf di form Blade. Satu baris ini yang paling sering hilang.
  2. Session kedaluwarsa: tab dibiarkan terbuka berjam-jam, token di form sudah basi sementara session sudah di-regenerate (mis. setelah login ulang di tab lain).
  3. Request AJAX/fetch tanpa header token: JavaScript tidak otomatis mengirim CSRF seperti form biasa.
  4. Session tidak tersimpan: konfigurasi session/cache bermasalah sehingga token tidak bisa diverifikasi (lebih jarang, tapi ada).

3 · Solusi & Diff Kode

✕ Sebelum (bermasalah)

before
<!-- ❌ 419: tidak ada token CSRF -->
<form method="POST" action="/simpan">
  <input type="text" name="nama">
  <button type="submit">Simpan</button>
</form>

<script>
// ❌ fetch tanpa token → 419 juga
fetch("/simpan", { method: "POST", body: data });
</script>

✓ Sesudah (diperbaiki)

after
<!-- ✔ tambahkan @csrf di setiap form -->
<form method="POST" action="/simpan">
  @csrf
  <input type="text" name="nama">
  <button type="submit">Simpan</button>
</form>

<script>
// ✔ kirim token lewat header untuk AJAX
const token = document.querySelector('meta[name="csrf-token"]').content;
fetch("/simpan", {
  method: "POST",
  headers: { "X-CSRF-TOKEN": token },
  body: data,
});
</script>

Langkah Perbaikan

  1. Tambahkan @csrf di dalam setiap <form method="POST"> di Blade. Cek satu per satu.
  2. Untuk AJAX: pastikan layout punya <meta name="csrf-token" content="{{ csrf_token() }}"> lalu kirim sebagai header X-CSRF-TOKEN.
  3. Kalau tiba-tiba 419 padahal kemarin bisa: refresh halaman (token baru), atau clear cookie session yang korup.
  4. Pengecualian yang sah: hanya route webhook/API murni (tanpa session) yang boleh dikecualikan di bootstrap/app.php via validateCsrfTokens(except: [...]). Jangan kecualikan form user biasa.