Dalam API Laravel, lapisan autentikasi, sesi, dan penanganan secrets rentan terhadap penyalahgunaan jika tidak dikonfigurasi secara hati-hati. Artikel ini menunjukkan langkah konkret untuk mengatur rate limit, validasi input, proteksi upload, penyimpanan secrets yang aman, dan bagaimana menguji tiap lapisan sehingga API tetap dapat diandalkan dan sulit diserang.

Solusi yang dijelaskan fokus pada pendekatan praktis: menambahkan middleware yang sesuai, memperkuat konfigurasi bawaan Laravel, serta menyiapkan monitoring dan testing untuk mendeteksi atau mencegah celah keamanan sejak dini.

1. Menguatkan Autentikasi API

1.1 Rate Limiting khusus Endpoints Auth

Laravel menyediakan fitur throttle. Terapkan rate limit lebih ketat pada endpoint login atau token untuk memperlambat brute force.

// routes/api.php
Route::post('login', [AuthController::class, 'login'])
    ->middleware('throttle:login');

Tambahkan konfigurasi khusus di App\Providers\RouteServiceProvider:

protected function configureRateLimiting()
{
    RateLimiter::for('login', function (Request $request) {
        return Limit::perMinute(10)->by($request->ip());
    });
}

Limit per IP membuat login otomatis menunggu, namun tetap sediakan pesan menyarankan penguncian akun jika muncul kegagalan berulang.

1.2 Middleware Validasi dan Multi-Factor

Jangan hanya mengandalkan guard; tambahkan middleware yang memeriksa header, nonce, atau OTP untuk endpoint sensitif.

class EnsureOtpValid
{
    public function handle(Request $request, Closure $next)
    {
        if (! $request->header('X-OTP') || ! OtpService::verify($request->input('user_id'), $request->header('X-OTP'))) {
            return response()->json(['message' => 'OTP tidak valid'], 422);
        }

        return $next($request);
    }
}

Gunakan middleware ini hanya pada rute yang benar-benar membutuhkan lapisan tambahan; terlalu agresif dapat memperlambat pengalaman pengguna.

2. Memperketat Manajemen Sesi

2.1 Konfigurasi Session dan Cookie

Pastikan config/session.php menggunakan driver yang cocok (misalnya redis), 'secure' => true, dan 'same_site' => 'lax'. Set waktu kedaluwarsa pendek untuk sesi API, misalnya 15 menit idle.

Gunakan cookie khusus jika client berbasis browser; tambahkan header Clear-Site-Data saat logout untuk menghapus cache sisi klien.

2.2 Rotasi Token dan Invalidasi Sesi

Ketika token akses diperbarui, hapus token lama dari store. Manfaatkan event logout biasa:

public function logout(Request $request)
{
    $request->user()->currentAccessToken()->delete();
    event(new Logout($request));

    return response()->json(['message' => 'Keluar berhasil']);
}

Gunakan fitur sanctum atau passport untuk automatically revoke tokens on password change.

3. Pemrosesan Input dan Upload yang Aman

3.1 Validasi Ketat untuk Prevent Abuse

Pastikan semua input API divalidasi menggunakan rules ketat, termasuk panjang maksimal, format, dan tipe data. Hindari nullable tanpa pengecekan eksplisit.

$request->validate([
    'email' => 'required|email|max:255',
    'name' => 'required|string|max:100',
    'file' => 'nullable|file|mimes:pdf,jpg,png|max:2048'
]);

Field seperti callback_url harus dicek terhadap daftar domain terverifikasi untuk menghindari open redirect.

3.2 Proteksi Upload File

Gunakan temporary storage, pindahkan file ke direktori terpisah, dan hindari memproses file secara langsung sebelum validasi MIME dan ekstensi.

Gunakan policy untuk memastikan user hanya dapat mengakses file miliknya:

public function view(User $user, File $file)
{
    return $file->user_id === $user->id;
}

Tambahkan pemeriksaan ukuran dan scan virus jika memungkinkan sebelum menyimpan permanen.

4. Secret Handling dan Rotasi Terencana

4.1 Penyimpanan Secure

Jangan menyimpan secrets langsung dalam repository. Gunakan .env untuk development dan secret manager (AWS, GCP, Vault) di produksi.

Contoh akses environment yang tersandi:

'stripe' => [
    'key' => env('STRIPE_KEY'),
    'secret' => env('STRIPE_SECRET'),
],

Jangan lupa menjalankan php artisan config:cache setelah memperbarui config untuk memastikan values yang diambil konsisten.

4.2 Rotasi Secret dan Credential

Implementasikan jadwal rotasi, misalnya setiap 90 hari. Gunakan service token versi baru dan lakukan fallback jika token lama masih aktif. Periksa log penggunaan untuk memastikan token lama tidak digunakan lagi.

Gunakan interface repository untuk dependency injection agar mudah mengganti secrets saat testing.

5. Monitoring, Logging, dan Pengujian

5.1 Monitoring dan Alert

Log semua kegagalan autentikasi dan upload yang ditolak. Gunakan level warning atau higher untuk event seperti multiple 401 dalam waktu singkat.

Integrasikan dengan tools seperti Sentry atau CloudWatch untuk alert ketika threshold rate limit ditembus.

5.2 Pengujian Setiap Lapisan

Pengujian unit: pastikan middleware mengembalikan response sesuai kondisi. Pengujian integrasi: coba request login berulang untuk memastikan rate limiter aktif.

Gunakan test request untuk upload file berbahaya untuk memastikan validation rules bekerja. Contoh menggunakan HTTP test helper:

$this->postJson('/api/upload', [
    'file' => UploadedFile::fake()->create('script.php'),
])->assertStatus(422);

Untuk secret rotation, buat test yang memuat ulang config dan pastikan service masih dapat membuat request setelah secret diperbarui.

Kesimpulan

Dengan menggabungkan rate limit, validasi ketat, proteksi upload, session-setting yang tepat, serta secret management dan monitoring, API Laravel menjadi lebih tangguh terhadap penyalahgunaan. Selalu sertakan pengujian untuk setiap layer agar perubahan konfigurasi tidak membuka celah baru.