Cara Mengatasi 419 Page Expired di Laravel
Error 419 Page Expired di Laravel hampir selalu berarti request gagal lolos CSRF atau session tidak cocok. Jawaban singkatnya: cek @csrf, session, domain, dan apakah request AJAX mengirim token.
Masalah ini sangat umum pada form login, logout, register, dan form CRUD. Di local development kadang terasa acak, tetapi di production biasanya berkaitan dengan konfigurasi session, domain, atau request AJAX yang tidak mengirim token.
Jawaban Singkat
Kalau form Blade tiba-tiba berakhir di halaman error 419, urutannya begini:
- Pastikan form
POST,PUT,PATCH, atauDELETEpunya@csrf. - Pastikan session masih aktif dan cookie tersimpan.
- Samakan domain, subdomain, dan protocol
http/https. - Kalau pakai AJAX, kirim header CSRF.
- Setelah mengubah
.env, jalankanphp artisan optimize:clear.
Kapan Error Ini Biasanya Muncul?
- Saat submit form Blade tanpa
@csrf - Saat user terlalu lama diam di halaman lalu baru submit form
- Saat request AJAX tidak mengirim header CSRF
- Saat aplikasi berpindah domain, subdomain, atau protocol
- Saat konfigurasi session berubah, tapi cache config belum dibersihkan
Penyebab Paling Umum
1. Form Tidak Menyertakan CSRF Token
Form di atas akan memicu 419 karena request POST tidak membawa token CSRF.
Perbaikan:
2. Session Expired
Token CSRF Laravel terkait dengan session user. Jika session habis masa berlakunya, token lama ikut tidak valid.
3. Domain atau Protocol Tidak Konsisten
Contohnya:
- aplikasi dibuka dari
http://app.test, tetapi form submit kehttps://app.test - user login di
www.domain.com, lalu submit form didomain.com
4. Request AJAX Tidak Mengirim Token
fetch() atau request frontend kustom harus mengirim X-CSRF-TOKEN atau nilai _token.
5. Konfigurasi Session Salah
Masalah umum:
SESSION_DOMAINtidak cocokSESSION_SECURE_COOKIE=truedipakai di HTTP biasa- session driver tidak tersimpan dengan baik
Langkah Diagnosis
- Pastikan form POST memakai
@csrf. - Cek apakah cookie session benar-benar ada di browser.
- Bandingkan domain dan protocol halaman dengan request submit.
- Untuk AJAX, lihat tab Network dan pastikan header/token ikut terkirim.
- Jika baru mengubah
.env, bersihkan cache konfigurasi Laravel.
Kalau 419 muncul di form Blade biasa, periksa @csrf dulu. Itu penyebab paling umum dan paling cepat diperbaiki.
Langkah Fix
1. Tambahkan @csrf di Semua Form POST, PUT, PATCH, dan DELETE
2. Atur Request AJAX Agar Mengirim Token
Tambahkan meta tag di layout:
Lalu kirim token saat request:
3. Pastikan Session Environment Benar
Contoh nilai yang sering perlu dicek:
Kalau masih memakai HTTP lokal, jangan paksa SESSION_SECURE_COOKIE=true.
4. Bersihkan Cache Setelah Ubah Konfigurasi
Kalau kamu baru mengubah .env, langkah ini sering langsung menyelesaikan masalah.
5. Tangani Form yang Bisa Lama Terbuka
Untuk form admin atau form panjang, beri pesan ke user bahwa session bisa berakhir bila halaman terlalu lama dibiarkan terbuka.
Contoh Sebelum dan Sesudah
Sebelum
Sesudah
Kesalahan yang Sering Terjadi
419 Hanya Terjadi di Production
Biasanya terkait:
SESSION_DOMAINSESSION_SECURE_COOKIE- reverse proxy atau HTTPS termination
- config cache belum dibersihkan
419 Muncul Setelah Login Lama Didiamkan
Ini biasanya session timeout biasa. Solusinya bukan mematikan CSRF, tetapi memperbarui halaman atau login ulang.
419 di AJAX, Tapi Form Biasa Aman
Berarti request JavaScript tidak mengirim token dengan benar.
SESSION_SECURE_COOKIE=true di Local HTTP
Kalau app masih dibuka lewat http://, cookie secure bisa gagal tersimpan dan request berikutnya kehilangan session.
Pencegahan
- Jadikan
@csrfkebiasaan di semua form yang mengubah data. - Pakai layout utama yang selalu menyertakan meta CSRF token.
- Samakan domain dan protocol antara halaman, asset, dan endpoint submit.
- Setelah mengubah
.env, jalankan clear cache Laravel. - Jangan menonaktifkan proteksi CSRF hanya demi "memperbaiki" 419.
Bacaan Terkait
- CSRF Token Mismatch di Laravel: Penyebab dan Solusi
- Validasi & Form Request
- Otentikasi Laravel
- Middleware Laravel
- Env Config
- Panduan Error Laravel
FAQ
Apakah 419 sama dengan 403?
Tidak. Di Laravel, 419 biasanya dipakai untuk masalah CSRF token atau session yang expired, bukan untuk otorisasi.
Apakah aman menonaktifkan CSRF?
Tidak untuk route web biasa. Proteksi CSRF dibuat untuk mencegah request palsu dari situs lain.
Bagaimana dengan webhook dari layanan pihak ketiga?
Webhook biasanya tidak memakai middleware web seperti form browser biasa. Pisahkan endpoint webhook dengan pendekatan yang memang sesuai, jangan menyamakan semua request dengan form user.