Menjawab kebutuhan proteksi route API SvelteKit

SvelteKit menyediakan API routes yang mudah digunakan, tetapi perlindungan auth dan session harus ditangani secara eksplisit. Artikel ini langsung menunjukkan bagaimana menerapkan verifikasi token, menjaga secrets, memvalidasi input, serta mencegah abuse seperti session hijack, replay attack, atau malicious upload pada route API SvelteKit.

Langkah-langkah berikut menjaga integritas request, menyediakan observability, dan memberi gambaran trade-off yang sering dijumpai saat memperkuat API backend dengan SvelteKit.

Menetapkan auth dan session yang kuat di hooks

Gunakan hooks.server.ts untuk mendeteksi token atau cookie sesi secara konsisten. Jangan memercayai data dari client; lakukan verifikasi JWT atau id sesi terhadap penyimpanan terpisah (Redis, database). Contoh berikut mengilustrasikan cara menyelaraskan autentikasi dan menempatkan objek user dalam event.locals:

import { verifySession } from '$lib/session';
import type { Handle } from '@sveltejs/kit';

export const handle: Handle = async ({ event, resolve }) => {
  const header = event.request.headers.get('authorization');
  const token = header?.startsWith('Bearer ') ? header.slice(7) : event.cookies.get('session');

  if (!token) {
    return new Response(null, { status: 401, statusText: 'Unauthorized' });
  }

  const session = await verifySession(token);
  if (!session) {
    return new Response(null, { status: 401, statusText: 'Invalid session' });
  }

  event.locals.user = session.user;
  return resolve(event);
};

Definisikan verifySession di modul terpisah: baca secret dari process.env.SESSION_SECRET, cek integritas token, dan periksa apakah sesi belum kadaluarsa. Simpan metadata seperti lastUsedAt agar Anda dapat memantau session hijacking.

Jangan lupa menetapkan SameSite dan Secure pada cookie, dan pertimbangkan rotasi secret secara terjadwal. Jika menggunakan JWT, simpan jti pada backend untuk mendukung invalidasi.

Validasi input dan rate limit untuk mencegah abuse

Pemastian data masuk tidak membahayakan

Gunakan validator library (misalnya Zod atau yup) pada setiap handler API. Jangan melakukan parsing JSON tanpa menangani error, karena payload besar bisa menyebabkan crash. Contoh validasi sederhana:

import { z } from 'zod';

const payloadSchema = z.object({
  email: z.string().email(),
  action: z.enum(['create', 'update'])
});

export const POST = async ({ request }) => {
  const payload = await request.json();
  const parsed = payloadSchema.safeParse(payload);
  if (!parsed.success) {
    return new Response(JSON.stringify({ error: parsed.error.format() }), { status: 400 });
  }

  // lanjutkan dengan parsed.data
};

Menolak payload di awal mencegah logika bisnis menjalankan operasi berbahaya.

Rate limit dan deteksi abuse

Sintaks di atas tidak menanggapi flood request. Implementasikan rate limit sederhana: simpan counter per IP dalam cache (Redis) dan tolak ketika ambang tercapai. Skema berikut menggambarkan logika kontrol:

import { redisClient } from '$lib/redis';

const WINDOW = 60;
const LIMIT = 30;

export async function enforceRateLimit(ip: string) {
  const key = `rate:${ip}`;
  const count = await redisClient.incr(key);
  if (count === 1) {
    await redisClient.expire(key, WINDOW);
  }
  if (count > LIMIT) {
    throw new Error('Rate limit exceeded');
  }
}

Panggil enforceRateLimit di tiap route sensitif. Catat ip, user-agent, dan hasil validasi untuk mendeteksi pola yang tidak biasa.

Observability dan respon saat serangan

Menolak request tidak cukup tanpa visibilitas. Rekam log perlintasan yang gagal dengan detail kontekstual, tetapi hindari menulis secret langsung. Format log contoh:

console.warn(JSON.stringify({
  event: 'auth_failure',
  ip: event.getClientAddress(),
  reason: 'invalid_token',
  route: event.url.pathname
}));

Pantau log ini dengan sistem observability (misalnya Grafana Loki, Datadog) agar alert dapat dipicu saat volume kegagalan meningkat. Gunakan tracer untuk mengikuti perjalanan request terutama pada API yang menangani file upload yang bisa disalahgunakan.

Untuk deteksi abuse lebih lanjut, perhatikan metrik seperti:

  • Jumlah token yang ditolak per timeframe.
  • Rasio validasi input yang gagal.
  • Frekuensi upload file melewati batas ukuran.

Integrasikan alert dengan threshold realistis agar tidak terjadi alarm palsu saat traffic naik.

Tips deployment dan secret management

Jangan simpan secret di repository. Pakai variable env terkelola seperti SESSIONS_SECRET, REDIS_URL, dan RATE_LIMIT_SECRET. Saat deploy, validasi bahwa semua variable terisi dan lakukan lint untuk memastikan tipe data sesuai.

Gunakan proses build yang memeriksa tipe route (vite sudah membantu) dan jalankan npm run check untuk menemukan kesalahan compile-time. Saat menjalankan di server (Vercel, Fly.io, atau sendiri) pastikan port HTTP hanya menerima 443 dengan TLS — ini mencegah secret token bocor melalui network plaintext.

Untuk menghindari replay attack, sertakan mekanisme nonce atau timestamp pada token permintaan penting dan verifikasi bahwa nilai tersebut belum digunakan. Kombinasikan dengan CSP dan policy sanitizer saat mengizinkan upload file agar script jahat tidak dieksekusi.

Penutup

Dengan hook SvelteKit, validasi input, rate limit, serta observability yang baik, Anda dapat memperkuat route API terhadap berbagai attack vector seperti session hijack dan abuse. Terus evaluasi metrik keamanan, manfaatkan secret management yang kuat, dan perbaiki logika sesuai pola ancaman nyata di aplikasi Anda.