Error 419 Page Expired adalah salah satu error paling sering ditemui pengguna Laravel, terutama saat menekan tombol submit form, login, atau mengirim request lewat AJAX. Kabar baiknya: error ini hampir selalu berkaitan dengan CSRF token atau session, dan bisa diperbaiki dengan cepat begitu tahu penyebabnya.
Di artikel ini kita bahas 7 penyebab paling umum error 419 di Laravel beserta solusinya, dari yang paling sering sampai yang jarang terjadi.
Apa Itu Error 419 Page Expired?
HTTP status 419 di Laravel berarti CSRF token mismatch — token keamanan yang dikirim form tidak cocok (atau tidak ada) dengan token yang tersimpan di session. Laravel memakai CSRF token untuk melindungi aplikasi dari serangan Cross-Site Request Forgery, jadi setiap request POST/PUT/PATCH/DELETE wajib menyertakan token yang valid.
1. Lupa Menambahkan @csrf di Form
Ini penyebab nomor satu. Setiap form dengan method selain GET wajib menyertakan directive @csrf.
<form method="POST" action="/simpan">
@csrf
<input type="text" name="judul">
<button type="submit">Simpan</button>
</form>
Tanpa @csrf, Laravel tidak menerima token apa pun sehingga langsung menolak dengan 419.
2. Request AJAX Tanpa Menyertakan CSRF Token
Saat mengirim data lewat fetch atau jQuery/Axios, token harus dikirim lewat header X-CSRF-TOKEN. Pertama, taruh token di tag <meta> pada layout:
<meta name="csrf-token" content="{{ csrf_token() }}">
Lalu kirim di header request. Contoh dengan Axios:
axios.defaults.headers.common['X-CSRF-TOKEN'] =
document.querySelector('meta[name="csrf-token"]').content;
Contoh dengan fetch:
fetch('/simpan', {
method: 'POST',
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
'Content-Type': 'application/json'
},
body: JSON.stringify({ judul: 'Halo' })
});
3. Session Sudah Kadaluarsa (Terlalu Lama Membuka Form)
Kalau halaman dibiarkan terbuka lama lalu di-submit, session bisa keburu kedaluwarsa. Perpanjang masa aktif session di config/session.php atau lewat .env:
# .env (dalam menit) — contoh 2 jam
SESSION_LIFETIME=120
Untuk halaman login yang sering menganggur, ini penyebab yang sangat umum.
4. Konfiguktur SESSION_DOMAIN / APP_URL Salah
Jika cookie session tidak tersimpan dengan benar (misalnya karena akses lewat www dan non-www dianggap domain berbeda), token tidak akan cocok. Pastikan .env konsisten:
APP_URL=https://www.domainanda.com
SESSION_DOMAIN=.domainanda.com
SESSION_SECURE_COOKIE=true
Tanda titik di depan domain (.domainanda.com) membuat cookie berlaku untuk semua subdomain.
5. APP_KEY Kosong atau Berubah
Laravel memakai APP_KEY untuk mengenkripsi session dan cookie. Kalau key kosong atau berganti, semua session lama jadi tidak valid. Generate ulang bila perlu:
php artisan key:generate
Catatan: mengganti APP_KEY akan me-logout semua user yang sedang aktif.
6. Konfigurasi Ter-cache Setelah Diubah
Kalau Anda baru mengubah .env atau file config tetapi error tetap muncul, kemungkinan config lama masih ter-cache. Bersihkan dengan:
php artisan config:clear
php artisan cache:clear
php artisan route:clear
php artisan view:clear
7. Folder storage Tidak Bisa Ditulis (Permission)
Session file disimpan di storage/framework/sessions. Kalau folder ini tidak bisa ditulis server, session gagal tersimpan dan memicu 419. Perbaiki izin folder:
chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache
(Sesuaikan www-data dengan user web server Anda, mis. apache atau nama user cPanel.)
Checklist Cepat
- Sudah ada
@csrfdi semua form POST? - Request AJAX mengirim header
X-CSRF-TOKEN? SESSION_LIFETIMEcukup panjang?APP_URL&SESSION_DOMAINkonsisten?APP_KEYterisi?- Sudah
config:clearsetelah ubah.env? - Folder
storagebisa ditulis?
Kesimpulan
Error 419 Page Expired di Laravel 90% disebabkan oleh CSRF token yang hilang atau session yang bermasalah. Mulailah dari yang paling umum — pastikan @csrf ada di form — lalu turun ke konfigurasi session dan permission. Dengan checklist di atas, error ini biasanya selesai dalam hitungan menit.
Punya kasus 419 yang masih membandel? Tulis di kolom komentar, sertakan potongan kode form atau request AJAX Anda.