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:
- Lupa
@csrfdi form Blade. Satu baris ini yang paling sering hilang. - Session kedaluwarsa: tab dibiarkan terbuka berjam-jam, token di form sudah basi sementara session sudah di-regenerate (mis. setelah login ulang di tab lain).
- Request AJAX/fetch tanpa header token: JavaScript tidak otomatis mengirim CSRF seperti form biasa.
- 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
- Tambahkan
@csrfdi dalam setiap<form method="POST">di Blade. Cek satu per satu. - Untuk AJAX: pastikan layout punya
<meta name="csrf-token" content="{{ csrf_token() }}">lalu kirim sebagai headerX-CSRF-TOKEN. - Kalau tiba-tiba 419 padahal kemarin bisa: refresh halaman (token baru), atau clear cookie session yang korup.
- Pengecualian yang sah: hanya route webhook/API murni (tanpa session) yang boleh dikecualikan di
bootstrap/app.phpviavalidateCsrfTokens(except: [...]). Jangan kecualikan form user biasa.