Semua panduan
Tingkat KritisSecret yang Terekspos

API key terekspos di JavaScript sisi klien

Apa pun yang dikirim ke browser — inline script, bundle JS, source map — bisa dibaca siapa saja. Secret key (OpenAI, Stripe secret, AWS, URL database) yang tertanam di kode frontend praktis sudah dipublikasikan.

Apa itu

Build tool menanamkan environment variable saat compile. Kalau kamu mereferensikan sebuah secret di kode klien, secret itu berakhir di bundle JavaScript yang diunduh setiap pengunjung.

Ada pembagian penting: publishable/anon key (Stripe pk_live, konfigurasi web Firebase) memang dirancang untuk publik, tapi secret key (sk_live, service-role key, API key provider) tidak — dan tidak boleh sampai ke browser.

Kenapa penting

Provider key yang bocor memungkinkan siapa pun menghabiskan kuota di akunmu — tagihan LLM, biaya SMS, pengeluaran cloud — atau mengakses data yang diizinkan key tersebut.

Penyerang menyisir bundle JavaScript secara massal untuk mencari pola key. Secret yang ter-commit biasanya disalahgunakan dalam hitungan menit setelah live.

Cara memperbaiki

Simpan secret di server

Panggil API pihak ketiga dari route server atau backend, jangan pernah dari browser. Browser berbicara ke endpoint-mu; endpoint-mu yang memegang key.

// app/api/summarize/route.ts (server-only)
export async function POST(req: Request) {
  const { text } = await req.json();
  const r = await fetch("https://api.openai.com/v1/responses", {
    method: "POST",
    headers: { Authorization: `Bearer ${process.env.OPENAI_API_KEY}` },
    body: JSON.stringify({ model: "gpt-4o-mini", input: text }),
  });
  return Response.json(await r.json());
}
Gunakan prefiks NEXT_PUBLIC_ dengan sengaja

Di Next.js hanya variabel dengan prefiks NEXT_PUBLIC_ yang diekspos ke browser. Jangan pernah menaruh secret di balik prefiks itu — pakai hanya untuk nilai yang aman menjadi publik.

Rotasi key yang bocor

Kalau sebuah secret sudah terkirim ke browser, cabut dan terbitkan ulang. Menghapusnya dari build berikutnya tidak membatalkan salinan yang sudah tersedot.

FAQ

Apakah Stripe publishable key (pk_live) bermasalah di frontend?

Tidak — publishable key memang dimaksudkan untuk publik. Yang berisiko adalah secret key (sk_live), yang harus tetap di sisi server.

Bisakah aku cukup meng-obfuscate key-nya?

Tidak. Obfuscation sepele untuk dibalik. Satu-satunya perbaikan adalah menjauhkan secret dari klien sepenuhnya.

Apakah aplikasimu terpengaruh?

AppSafe memeriksa ini dan puluhan masalah lain dalam satu pemindaian gratis.

Pindai aplikasiku gratis