ngodingdulu
Deploy & DevOpsTutorialPemula

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

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:

app.js
const apiKey = 'sk-abc123rahasia'; // ❌ jangan seperti ini

Cara 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:

app.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:

app.py
import os
import 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.

.env
# Jangan di-commit. Salin dari .env.example lalu isi nilainya.
API_KEY=isi-dengan-kunci-aslimu
DATABASE_URL=postgres://user:password@localhost:5432/app

Lalu muat file itu saat aplikasi berjalan.

Node.js (sejak versi 20.6) bisa membacanya tanpa library tambahan:

Terminal window
node --env-file=.env app.js

Atau dari dalam kode, cocok kalau file .env tidak selalu ada (misalnya di server):

app.js
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:

Terminal window
pip install python-dotenv
app.py
import os
from dotenv import load_dotenv
load_dotenv() # baca .env kalau ada; variabel yang sudah diset di sistem tidak ditimpa
api_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:

.gitignore
.env

Cek 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:

.env.example
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:

  1. Cabut dan ganti kuncinya (revoke dan rotate) di dashboard layanan terkait. Ini satu-satunya langkah yang benar-benar menutup kebocoran.
  2. Perbarui nilai di .env dan di pengaturan platform deploy dengan kunci baru.
  3. Hapus kunci dari kode, pakai environment variable, lalu commit.
  4. 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.
  • .env ada 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.

Bagikan:WhatsAppTelegramXFacebook
Ilustrasi input email berisi tanda kutip OR 1=1 yang membuat query rentan membocorkan semua pengguna termasuk admin, dibandingkan query aman dengan placeholder yang mengembalikan nol baris
SecurityTutorial

SQL Injection: Cara Kerja dan Pencegahannya

Cukup satu tanda kutip di kolom login untuk membuka seluruh isi tabel. Lihat sendiri cara kerjanya, lalu tutup celahnya dengan satu kebiasaan sederhana.

9 Maret 20266 mnt

Ilustrasi password kopi-susu-123 dan salt acak masuk ke mesin hashing scrypt atau argon2id, menghasilkan hash yang disimpan di database dan tidak bisa dibalik
SecurityTutorial

Menyimpan Password dengan Benar: Hashing

Kalau database-mu bocor, password pengguna tidak boleh ikut terbaca. Begini cara menyimpannya supaya tetap aman, bahkan dalam skenario terburuk.

23 Februari 20266 mnt

Ilustrasi address bar dengan gembok dan alamat https www.catatanku.id, terhubung ke tabel DNS berisi record A, CNAME, MX, dan TXT yang menunjuk ke server
DeployKonsep

Domain, DNS, dan HTTPS untuk Pemula

Alamat .pages.dev sudah jalan, tapi nama sendiri terasa lain. Begini cara internet menemukan aplikasimu, dan cara memasang domainmu tanpa merusak yang lain.

26 Januari 20266 mnt

Enter bukaEsc tutupHalaman pencarian