Environment Variable dan Secrets: Jangan di Kode
API key yang tertulis di kode cepat atau lambat akan bocor: lewat GitHub, screenshot, atau chat dengan AI. Simpan di tempat yang semestinya.
Oleh Afa Hernandes7 menit baca
Daftar isi
- Apa itu secret, dan kenapa harus dipisahkan dari kode
- Langkah 1: Baca secret dari environment variable
- Langkah 2: Simpan nilainya di file .env (untuk pengembangan)
- Langkah 3: Pastikan .env tidak pernah ikut ke repository
- Langkah 4: Isi secret di server lewat pengaturan platform
- Hati-hati: semua yang dikirim ke browser itu publik
- Kalau secret terlanjur bocor
- Checklist secrets
- Error yang sering muncul
- Pertanyaan yang sering diajukan
- Kalau repository-nya privat, bolehkah secret ditulis di kode?
- Bolehkah menempelkan file .env ke chat AI supaya AI bisa membantu?
- Apa bedanya environment variable dan secret di dashboard platform?
- Kesimpulan
Aplikasi modern hampir selalu butuh kunci rahasia: API key untuk layanan AI atau pembayaran, password database, token untuk mengirim email. Cara paling cepat memakainya adalah menuliskannya langsung di kode:
const apiKey = 'sk-abc123rahasia'; // ❌ jangan seperti iniCara itu berjalan, dan justru itu masalahnya. Kode berpindah ke banyak tempat: repository GitHub, screenshot yang kamu kirim ke grup, potongan kode yang kamu tempel ke chat AI, folder yang kamu deploy. Ke mana pun kodenya pergi, kuncinya ikut.
Di tutorial ini kamu akan belajar menyimpan kunci rahasia di environment variable, memakai file .env saat pengembangan, dan apa yang harus dilakukan kalau kunci terlanjur bocor.
Apa itu secret, dan kenapa harus dipisahkan dari kode
Secret adalah nilai yang memberi akses ke sesuatu: API key, password, token, kunci enkripsi. Siapa pun yang memegangnya bisa bertindak atas namamu, misalnya memakai kuota AI-mu sampai tagihannya membengkak, atau membaca isi database-mu.
Prinsipnya sederhana: kode boleh dilihat orang, secret tidak. Karena itu keduanya harus disimpan di tempat berbeda. Kode menyebut nama secret-nya, misalnya API_KEY, sedangkan nilainya disediakan oleh lingkungan tempat kode berjalan. Itulah environment variable: variabel yang diisi oleh sistem, bukan ditulis di kode.
Bonusnya: nilai yang sama bisa berbeda di tiap tempat. Di laptop kamu memakai database percobaan, di server memakai database sungguhan, dan kodenya tidak perlu diubah sama sekali.
Langkah 1: Baca secret dari environment variable
Ganti nilai yang tertulis di kode dengan pembacaan environment variable. Jangan lupa menampilkan pesan yang jelas kalau nilainya belum diisi.
Node.js:
const apiKey = process.env.API_KEY;if (!apiKey) { console.error('API_KEY belum diisi. Salin .env.example menjadi .env lalu isi nilainya.'); process.exit(1);}console.log('API_KEY terbaca, panjangnya', apiKey.length, 'karakter');Python:
import osimport sys
api_key = os.environ.get("API_KEY")if not api_key: sys.exit("API_KEY belum diisi. Salin .env.example menjadi .env lalu isi nilainya.")print("API_KEY terbaca, panjangnya", len(api_key), "karakter")Perhatikan: contoh di atas tidak pernah mencetak nilai kuncinya, hanya panjangnya. Mencetak secret ke log atau layar adalah salah satu cara kebocoran yang paling sering terjadi.
Pemeriksaan “kalau kosong, berhenti dengan pesan jelas” juga penting. Tanpa itu, aplikasi tetap jalan dengan nilai kosong, lalu gagal di tempat lain dengan error yang membingungkan.
Langkah 2: Simpan nilainya di file .env (untuk pengembangan)
Mengetik environment variable di terminal setiap kali menjalankan aplikasi itu merepotkan. Kebiasaan umumnya: simpan di file bernama .env di folder proyek.
# Jangan di-commit. Salin dari .env.example lalu isi nilainya.API_KEY=isi-dengan-kunci-aslimuDATABASE_URL=postgres://user:password@localhost:5432/appLalu muat file itu saat aplikasi berjalan.
Node.js (sejak versi 20.6) bisa membacanya tanpa library tambahan:
node --env-file=.env app.jsAtau dari dalam kode, cocok kalau file .env tidak selalu ada (misalnya di server):
try { process.loadEnvFile(); // baca .env di folder saat ini} catch { // tidak ada file .env: di server, nilainya diisi lewat pengaturan platform}Python memakai library python-dotenv:
pip install python-dotenvimport osfrom dotenv import load_dotenv
load_dotenv() # baca .env kalau ada; variabel yang sudah diset di sistem tidak ditimpaapi_key = os.environ.get("API_KEY")Semua contoh di atas diuji dengan Node 24 dan Python 3.13 (python-dotenv 1.2).
Langkah 3: Pastikan .env tidak pernah ikut ke repository
Ini langkah yang paling penting. Tambahkan .env ke .gitignore:
.envCek dengan git status. File .env tidak boleh muncul di daftar. Belum terbiasa dengan Git? Baca dulu Git dan GitHub untuk kerja tim.
Supaya rekan tim (atau kamu sendiri di laptop lain) tahu variabel apa saja yang dibutuhkan, buat file .env.example yang ikut di-commit. Isinya nama-nama variabel saja, tanpa nilai rahasia:
API_KEY=DATABASE_URL=Orang yang baru meng-clone proyek cukup menyalin .env.example menjadi .env, lalu mengisi nilainya sendiri.
Langkah 4: Isi secret di server lewat pengaturan platform
File .env hanya untuk komputermu. Di server, kamu tidak mengunggah file .env. Isi nilainya di pengaturan proyek pada layanan deploy-mu. Cloudflare, Vercel, Netlify, dan sejenisnya semuanya punya halaman pengaturan environment variables atau secrets. Nama menunya berbeda-beda, tapi konsepnya sama: nama variabel di satu kolom, nilainya di kolom lain, dan nilainya disembunyikan setelah disimpan.
Karena kodenya sudah membaca process.env.API_KEY atau os.environ, tidak ada yang perlu diubah di kode.
Hati-hati: semua yang dikirim ke browser itu publik
Ini jebakan yang paling sering menimpa aplikasi buatan sendiri dan buatan AI. Environment variable hanya rahasia selama dipakai di server. Kalau nilainya dipakai di kode yang berjalan di browser, ia ikut terkirim ke setiap pengunjung, dan siapa pun bisa melihatnya lewat DevTools.
Framework web modern sengaja membedakan keduanya dengan awalan nama. Variabel yang diawali PUBLIC_ (Astro), VITE_ (Vite), atau NEXT_PUBLIC_ (Next.js) memang disengaja untuk dikirim ke browser. Jangan pernah menaruh secret di variabel berawalan seperti itu.
Untuk aplikasi statis seperti pencatat pengeluaran kita, aturannya lebih tegas lagi: tidak ada server sama sekali, jadi jangan pernah menaruh secret di dalamnya. Kalau aplikasimu butuh memanggil API berbayar, panggilannya harus lewat server atau serverless function milikmu, bukan langsung dari browser.
Kalau secret terlanjur bocor
Tanda-tandanya: kunci ter-commit ke GitHub, terlihat di screenshot, atau tertempel di chat. Lakukan ini, berurutan:
- Cabut dan ganti kuncinya (revoke dan rotate) di dashboard layanan terkait. Ini satu-satunya langkah yang benar-benar menutup kebocoran.
- Perbarui nilai di
.envdan di pengaturan platform deploy dengan kunci baru. - Hapus kunci dari kode, pakai environment variable, lalu commit.
- Periksa tagihan dan log pemakaian layanan tersebut, siapa tahu kunci itu sudah dipakai orang lain.
Menghapus commit atau membuat repository jadi privat tidak cukup. Riwayat Git menyimpan versi lama, mungkin sudah ada yang meng-clone atau mem-fork, dan ada bot yang terus memindai GitHub mencari kunci yang bocor. Anggap saja kunci yang pernah terlihat publik sudah jatuh ke tangan orang lain.
Kabar baiknya, GitHub punya push protection. Sejak 2024, fitur ini aktif secara bawaan untuk repository publik dan memblokir push yang berisi pola kunci yang dikenali. Tapi jangan bergantung padanya: fitur ini tidak mengenali semua jenis secret, dan tidak berlaku untuk tempat bocor lain seperti screenshot atau chat.
Checklist secrets
- Tidak ada API key, password, atau token yang tertulis di kode.
- Kode membaca secret dari environment variable, dan berhenti dengan pesan jelas kalau nilainya kosong.
-
.envada di.gitignore, dan.env.example(tanpa nilai) ikut di-commit. - Secret untuk server diisi lewat pengaturan platform, bukan file yang diunggah.
- Tidak ada secret di variabel yang dikirim ke browser (
PUBLIC_,VITE_,NEXT_PUBLIC_). - Secret tidak dicetak ke log, dan tidak ditempel ke chat AI.
- Tahu cara mencabut dan mengganti setiap kunci yang dipakai.
Error yang sering muncul
Aplikasi berhenti dengan pesan “API_KEY belum diisi” padahal file .env sudah ada.
Pastikan file .env dimuat: jalankan dengan node --env-file=.env app.js, atau panggil load_dotenv() di Python. Pastikan juga kamu menjalankan perintah dari folder yang berisi .env, dan nama variabelnya sama persis, termasuk huruf besar-kecilnya.
Di Windows, file tersimpan sebagai .env.txt.
Aktifkan File name extensions di File Explorer, lalu ubah namanya menjadi .env. Atau buat file-nya langsung dari VS Code.
Nilai yang mengandung tanda # terbaca terpotong.
Tanpa tanda kutip, semua yang ada setelah # dianggap komentar dan dibuang. Apit nilainya dengan tanda kutip, misalnya PESAN="halo dunia # bukan komentar". Ini berlaku untuk Node maupun python-dotenv.
Pertanyaan yang sering diajukan
Kalau repository-nya privat, bolehkah secret ditulis di kode?
Tetap jangan. Repository privat bisa berubah jadi publik, bisa diakses rekan atau tool pihak ketiga yang kamu beri izin, dan kodenya tetap ikut ke screenshot, chat, dan laptop orang lain. Kebiasaan yang aman berlaku di semua repository.
Bolehkah menempelkan file .env ke chat AI supaya AI bisa membantu?
Jangan tempel nilainya. Kalau AI butuh konteks, kirim .env.example atau ganti nilainya dengan teks palsu seperti isi-kunci-di-sini. Untuk memperbaiki kode, AI hanya perlu tahu nama variabelnya.
Apa bedanya environment variable dan secret di dashboard platform?
Banyak platform membedakan nilai biasa (terlihat di dashboard, misalnya nama situs) dan secret (dienkripsi dan disembunyikan setelah disimpan). Untuk API key dan password, selalu pilih jenis secret.
Kesimpulan
Secret tidak pernah ditulis di kode. Kode membaca nama variabelnya, .env menyimpan nilainya di laptopmu (dan tidak pernah di-commit), dan platform deploy menyimpan nilainya di server. Kalau sebuah kunci sempat terlihat publik, ganti kuncinya. Menghapus commit saja tidak cukup.
Langkah berikutnya di jalur Deploy & Production: deploy aplikasi pertamamu, lalu memasang domain sendiri. Topik keamanan yang lebih dalam menunggu di jalur Security.



