Day 29 โ Keamanan Dasar & Optimasi Production โ
Fase: 3 โ Deployment | Minggu: 6 | Hari: Kamis
๐ฏ Tujuan Hari Ini โ
- Melakukan audit keamanan dasar pada aplikasi SIMAS sebelum demo akhir.
- Menjalankan perintah optimasi cache Laravel untuk meningkatkan performa.
- Memahami cara membaca log error Laravel di production.
- Memastikan aplikasi siap untuk presentasi esok hari.
๐ Bagian 1: Keamanan Dasar Aplikasi Laravel โ
Laravel sudah menyediakan banyak perlindungan secara bawaan. Tugasmu hari ini adalah memverifikasi semua perlindungan itu sudah aktif.
1.1 โ Pastikan APP_DEBUG=false di Production โ
Ini sudah kita bahas di Day 26, tapi wajib diverifikasi kembali. Cek di Railway Variables.
1.2 โ Proteksi CSRF (Cross-Site Request Forgery) โ
Laravel otomatis melindungi semua form POST dari serangan CSRF melalui @csrf directive di Blade. Lakukan audit:
# Cari semua form POST di project yang mungkin lupa @csrf
grep -rn --include="*.blade.php" "method=\"POST\"" resources/views/ | grep -v "@csrf"Setiap form dengan method="POST" WAJIB memiliki @csrf.
1.3 โ Validasi Input Wajib Ada di Controller โ
Cek bahwa semua method store() dan update() menggunakan $request->validate(). Jangan pernah menyimpan data mentah dari user langsung ke database.
BAD โ:
Asset::create($request->all()); // BAHAYA! Mass assignment tanpa filterGOOD โ :
$validated = $request->validate([...]);
Asset::create($validated);1.4 โ Proteksi Hapus Data (Destructive Actions) โ
Pastikan tombol "Hapus" menggunakan form POST dengan method spoofing @method('DELETE'), bukan link GET:
{{-- BENAR: Menggunakan form POST --}}
<form action="{{ route('assets.destroy', $asset) }}" method="POST"
onsubmit="return confirm('Yakin ingin menghapus aset ini?')">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm">Hapus</button>
</form>{{-- SALAH: Menggunakan link GET โ bisa dieksploitasi --}}
<a href="/assets/{{ $asset->id }}/delete">Hapus</a>โก Bagian 2: Optimasi Performa Production โ
Laravel menyediakan perintah caching yang membuat aplikasi berjalan jauh lebih cepat di production.
2.1 โ Jalankan Perintah Optimasi โ
# Cache konfigurasi (gabungkan semua config ke satu file)
php artisan config:cache
# Cache route (compile semua route ke satu file)
php artisan route:cache
# Cache view Blade (compile semua view ke PHP)
php artisan view:cache
# Atau jalankan ketiganya sekaligus:
php artisan optimize2.2 โ Kapan Menjalankan Optimize? โ
| Kapan | Perintah |
|---|---|
| Setelah deploy ke production | php artisan optimize |
| Saat development (ubah file) | php artisan optimize:clear |
Ubah .env di production | php artisan config:clear |
WARNING
Jangan jalankan config:cache atau route:cache di environment development! Ketika cache aktif, perubahan pada file config atau route tidak akan langsung terlihat โ kamu harus clear cache dulu. Ini sumber kebingungan yang sering dialami developer baru.
2.3 โ Tambahkan ke Startup Command Railway โ
Update railway.json untuk menjalankan optimize setelah deploy:
{
"deploy": {
"startCommand": "php artisan migrate --force && php artisan storage:link && php artisan optimize && php artisan serve --host=0.0.0.0 --port=$PORT"
}
}๐ Bagian 3: Membaca Log Error Laravel โ
Ketika APP_DEBUG=false, error tidak tampil di browser โ tapi dicatat di log file.
Lokasi Log di Development (Laptop) โ
storage/logs/laravel.logCara Membaca Log di Railway โ
- Buka dashboard Railway โ service aplikasi
- Tab "Logs" โ lihat output realtime
- Gunakan filter untuk mencari error tertentu
Format Log Laravel โ
[2026-04-01 08:30:00] production.ERROR: SQLSTATE[42S02] Table 'simas.loans' doesn't exist
at /var/www/html/vendor/laravel/framework/src/...
{
"exception": "[object] (Illuminate\Database\QueryException ...)"
}Bagian penting yang harus dibaca:
- Level:
ERROR,WARNING,INFO,DEBUG - Pesan: Deskripsi error (biasanya sudah cukup jelas)
- Context: JSON di bawahnya berisi detail tambahan
๐งช Checklist Audit Keamanan & Optimasi โ
Jalankan audit berikut dan beri tanda centang:
| Item Pemeriksaan | Status |
|---|---|
APP_DEBUG=false di environment production | โฌ |
Semua form POST memiliki @csrf | โฌ |
Semua store() dan update() menggunakan validate() | โฌ |
| Tombol hapus menggunakan form POST (bukan link GET) | โฌ |
File .env tidak ter-commit ke GitHub | โฌ |
php artisan optimize berhasil dijalankan | โฌ |
| Tidak ada error di log setelah optimize | โฌ |
๐ฏ Persiapan Final untuk Demo Besok โ
Akhiri hari ini dengan melakukan persiapan demo:
Isi data demo di database production:
- Minimal 3 kategori aset
- Minimal 8 aset (beberapa dengan foto, beberapa tanpa)
- Minimal 5 data peminjaman (campuran pending dan returned)
Test alur demo sekali dari awal ke akhir di URL production.
Siapkan slide presentasi (Google Slides / PowerPoint) dengan poin:
- Pengenalan tim dan aplikasi
- Demo fitur-fitur utama (termasuk upload dan export)
- Challenge yang dihadapi dan cara mengatasinya
- URL aplikasi production yang bisa dikunjungi audience
Tentukan urutan presenter untuk besok.
TIP
Lakukan demo dari URL production, bukan dari localhost. Ini menunjukkan bahwa aplikasimu benar-benar live dan bisa diakses siapapun โ itulah poin yang paling mengesankan di mata mentor.