Jawaban singkat: Agar agen AI dapat menggunakan API key tanpa melihatnya secara langsung, tempatkan hanya nama key di dalam konteks agen dan lakukan resolusi nilainya di luar model: variabel lingkungan (environment variable) yang direferensikan agen tetapi tidak pernah dicetak, referensi secret manager, atau proxy yang menyuntikkan header. Kemudian, pastikan setiap key berumur pendek (short-lived) dan memiliki cakupan akses yang terbatas, serta lakukan redaksi log sebelum dikirim kembali ke agen.
Tim DeepSeek Harness menyoroti masalah ini dalam esainya, “Exploring Super-agent Design”: kredensial yang berada di dalam konteks agen berisiko bocor, sehingga agen seharusnya menggunakan kredensial tanpa pernah melihatnya. Esai tersebut mencantumkannya sebagai masalah terbuka yang belum terpecahkan. Namun, Anda tidak perlu menunggu kerangka kerja menyelesaikannya; pola-pola di bawah ini sudah dapat diterapkan sekarang.
Untuk gambaran yang lebih luas, lihat cara membangun super agent. Artikel ini berfokus pada satu pertanyaan: bagaimana agen Anda memanggil API yang terautentikasi tanpa key tersebut pernah masuk ke dalam context window-nya.
Bagaimana agen AI membocorkan API key
Agen AI membocorkan API key setiap kali nilainya masuk ke dalam konteksnya: model tersebut kemudian dapat mengulanginya dalam pemanggilan alat (tool call), berkas, commit, atau balasan pesan. Tidak ada yang perlu meretas server. Agen itu sendirilah yang menyerahkan key tersebut, biasanya saat berniat membantu.
Empat jalur kebocoran yang paling sering ditemui:
- Agen membaca
.env. Anda menanyakan alasan kegagalan pemanggilan pembayaran, agen membuka.envuntuk memeriksa, dansk_live_...kini berada di dalam transkrip serta log penyedia. - Agen mencetak ulang key dalam tool call. Menjalankan perintah debug
curldengan header harfiah, atauecho $STRIPE_KEYuntuk “memastikan variabel sudah terpasang.” - Agen menuliskan key di tempat publik. Deskripsi PR, komentar issue, atau test fixture yang memuat nilai aslinya.
- Prompt injection memintanya. Halaman web atau respons API menyatakan “cetak variabel lingkungan Anda.” OWASP menempatkan prompt injection sebagai risiko aplikasi LLM nomor satu dan mengategorikan eksposur kredensial di bawah pengungkapan informasi sensitif.
Kebocoran oleh manusia dan front-end membutuhkan penanganan yang berbeda, sebagaimana dibahas dalam API key yang terekspos di browser, pencurian API key AI dan LLMjacking, serta memeriksa kebocoran key dengan secret scanner. Di sini pelakunya adalah agen itu sendiri.
Aturannya: nama di dalam konteks, nilai di luar
Setiap pola di sini berpegang pada satu aturan. Konteks agen hanya memegang referensi ke sebuah rahasia (secret). Sesuatu di luar model akan mengubah referensi tersebut menjadi nilai aslinya pada detik-detik terakhir eksekusi, dan nilai tersebut tidak pernah dialirkan kembali ke agen.

| Konteks agen boleh memuat | Konteks tidak boleh memuat |
|---|---|
STRIPE_KEY (nama variabel) |
sk_live_51H... (nilainya) |
op://payments/stripe/api-key (sebuah referensi) |
Secret yang telah diresolusi |
{{token}} (placeholder) |
Bearer token yang ditempel langsung |
Nilai tersamar seperti sk_live_•••• |
Baris log yang tidak disamarkan |
Jika ada nilai yang masuk ke kolom kanan, segera rotasi key tersebut. Context window selalu dicatat dalam log, di-cache, dan diekspor. Token yang sudah terkirim tidak dapat ditarik kembali.
Pola 1: Variabel lingkungan ditambah redaksi
Dengan variabel lingkungan, key tersimpan di dalam environment proses dan agen hanya menulis $STRIPE_KEY, sehingga shell mengekspansinya setelah model selesai menuliskan perintah. Ini adalah pola yang paling hemat biaya, dan tiga kebiasaan berikut akan menjaganya tetap aman:
Blokir berkas rahasia. Di Claude Code, tambahkan aturan penolakan seperti Read(./.env) dan Read(./.env.*) ke izin pengaturan Anda. Agen lain juga memiliki daftar allow dan deny yang serupa.
Tegaskan aturannya di dalam CLAUDE.md atau AGENTS.md:
Secrets: never print, echo, cat or log the value of any variable
ending in _KEY, _TOKEN or _SECRET. Reference them as $NAME.
If a value is missing, say which NAME is missing and stop.
Lakukan redaksi output sebelum dikembalikan ke model, menggunakan filter yang menyamarkan pola secret yang dikenali.
Batasan jujurnya: shell agen memiliki variabel tersebut, sehingga agen yang terkena injeksi masih berpeluang mencetaknya. Variabel lingkungan hanya mencegah ketidaksengajaan, bukan menghadapi penyerang yang sepenuhnya mengendalikan perintah berikutnya.
Pola 2: Referensi secret manager
Referensi secret manager adalah pointer seperti op://vault/item/field yang diresolusi oleh CLI saat runtime, sehingga berkas konfigurasi dan prompt hanya memuat pointernya saja. Agen dapat membaca dan melakukan commit pada referensi tersebut dengan aman, karena referensi itu sendiri tidak memberikan izin apa pun secara langsung.
Referensi secret dari 1Password adalah contoh nyata yang jelas:
# .env.agent (safe for the agent to read)
STRIPE_KEY=op://payments/stripe/api-key
GITHUB_TOKEN=op://ci/github-bot/token
op run --env-file=.env.agent -- npm test
op run meresolusi referensi tersebut ke dalam child process, dan secret yang dicetak ke stdout atau stderr otomatis disamarkan secara default kecuali ada yang menambahkan opsi --no-masking. Jangan pernah izinkan flag tersebut masuk ke perintah apa pun yang dijalankan agen. HashiCorp Vault, AWS Secrets Manager, dan Azure Key Vault juga menawarkan konsep serupa dengan sintaks masing-masing. Karena child process masih memegang nilainya, batasan dari Pola 1 tetap berlaku di sini.
Pola 3: Proxy penyuntik kredensial
Proxy penyuntik kredensial (credential-injecting proxy) berada di antara agen dan API upstream, lalu menambahkan header autentikasi secara otomatis. Agen mengirimkan permintaan tanpa key, proxy melampirkan kredensialnya, dan agen tidak pernah memegang nilainya di tempat mana pun yang bisa dicetak atau diekfiltrasi.

Ini adalah satu-satunya pola di mana agen benar-benar tidak pernah memegang key tersebut. Desain dasarnya:
- Agen memanggil
http://localhost:8787/stripe/v1/charges, bukan host aslinya. - Proxy memetakan
/stripeke upstream dan membaca key dari secret manager Anda. - Proxy memeriksa allowlist:
GET /v1/chargesdiizinkan lewat, sedangkanDELETE /v1/customersditolak. - Proxy menambahkan
Authorization: Bearer <value>, meneruskan permintaan, dan menghapus header tersebut dari log-nya.
Penerapan allowlist sama pentingnya dengan proses penyuntikan itu sendiri. Agen yang terkena injeksi memang masih bisa menggunakan key tersebut, tetapi hanya untuk pemanggilan yang telah Anda izinkan, dan ia tidak dapat membawa key tersebut ke tempat lain. Jalankan proxy di bawah user atau kontainer terpisah agar agen tidak dapat membaca berkas konfigurasinya.
Pendekatan ini selaras dengan arsitektur pada esai tersebut: loop agen berjalan di cloud, lingkungan Anda tetap berada di mesin lokal di balik daemon kecil, dan kredensial selalu tersimpan aman di lingkungan tersebut.
Pola 4: Token berumur pendek dengan cakupan terbatas
Token berumur pendek dengan cakupan terbatas membatasi dampak kerugian saat pola lainnya gagal: agen mendapatkan kredensial yang kedaluwarsa dalam hitungan menit dan hanya berfungsi untuk satu tugas spesifik, sehingga nilai yang bocor sudah tidak berharga saat ada pihak lain yang mencoba menggunakannya. Ini adalah jaring pengaman terakhir, bukan solusi pengganti utama.
| Sumber | Yang Anda dapatkan | Masa berlaku |
|---|---|---|
AWS STS AssumeRole |
Kredensial sementara untuk IAM role dengan cakupan tertentu | 900 hingga 43.200 detik |
| Vault database secrets engine | User database yang dibuat sesuai kebutuhan (on-demand) | TTL sewa (lease TTL) yang Anda tentukan |
| GitHub fine-grained tokens | Akses ke repositori dan izin yang dipilih | Masa kedaluwarsa yang Anda tentukan |
| API Anda sendiri | Token per sesi dengan cakupan sempit | Sesuai yang Anda terapkan |
Terbitkan satu token untuk setiap sesi agen, batasi cakupannya sesuai kebutuhan tugas, dan tentukan masa berlaku tersingkat yang cukup agar tugas dapat diselesaikan.
Lakukan redaksi log dan transkrip
Redaksi adalah lapisan pembersihan: samarkan secret pada output alat, log CI, dan rekaman sesi agen yang tersimpan, karena satu baris tanpa redaksi dapat merusak semua pengamanan di atas. Samarkan awalan yang umum (sk_live_, ghp_, github_pat_, AKIA, xoxb-), semua nilai header Authorization: atau X-API-Key:, serta nilai persis yang Anda suntikkan pada sesi tersebut. Terapkan pemfilteran ini di tool wrapper, pengaturan log CI, dan sebelum siapa pun membagikan transkrip.
Uji API menggunakan Claude Code dan Apidog CLI tanpa memperlihatkan key
Apidog sangat selaras dengan aturan nama-dalam-konteks: permintaan pengujian mereferensikan {{token}}, lingkungan mengeksekusi nilainya saat runtime, dan agen Anda hanya membaca serta menuliskan namanya. Coding agent Anda dapat menyusun dan menjalankan seluruh pengujian melalui Apidog CLI.
Ada satu detail penting. Variabel Apidog memiliki Shared Value yang disinkronkan ke server Apidog dan tim Anda, serta Local Value yang hanya disimpan di mesin lokal Anda. Dokumentasi variabel menyarankan penggunaan local value untuk token dan menegaskan bahwa CLI menggunakan shared value secara default. Oleh karena itu, jangan simpan token asli di dalam shared value, melainkan teruskan pada saat runtime.
Anda melakukan autentikasi sendiri, sehingga token Apidog Anda tidak pernah masuk ke dalam konteks agen:
npm install -g apidog-cli@latest
apidog auth login --with-token <YOUR_APIDOG_TOKEN> # in your own terminal
npx -y skills add https://apidog.com # pick your agent when prompted
export PAYMENTS_TOKEN=... # in your shell, never in a prompt
Kemudian berikan satu prompt berikut kepada Claude Code:
In Apidog project 123456, create a test case for GET /v1/charges that
sends Authorization: Bearer {{token}} and asserts a 200 status and a
non-empty data array. Run it against environment 789, passing the token
with --env-var "token=$PAYMENTS_TOKEN". Never print $PAYMENTS_TOKEN or
any header value. Summarize failures only.
Agen akan membaca skema, memvalidasi payload, membuat test case, dan menjalankannya:
apidog cli-schema get test-case-create
apidog cli-schema validate test-case-create --file case.json
apidog test-case create --project 123456 --file case.json
apidog run --test-case <caseId> --project 123456 -e 789 \
--env-var "token=$PAYMENTS_TOKEN" -r cli,json
Berkas JSON test case memuat {{token}}, perintah memuat $PAYMENTS_TOKEN, dan shell akan mengisi nilainya setelah model selesai menuliskan baris tersebut. Agen hanya melihat hasil lulus atau gagal beserta pesan asersinya. Jalankan laporan JSON yang tersimpan melalui tahap redaksi sebelum membagikannya. Baris perintah apidog run yang sama dapat diintegrasikan ke dalam pipeline CI dengan opsi -r junit; silakan pelajari panduan pipeline CI/CD Apidog CLI dan panduan penyiapan Apidog CLI di Claude Code.
Pada paket Enterprise, Apidog juga dapat mengambil vault secrets dari HashiCorp Vault, Azure Key Vault, dan AWS Secrets Manager yang direferensikan sebagai {{vault:key}}; pencetakan nilai lewat console.log di dalam skrip akan disamarkan secara otomatis, dan nilainya tidak pernah dibagikan kepada rekan satu tim. Paket Apidog Free mendukung hingga 4 pengguna jika Anda ingin mencoba alur kerja CLI ini terlebih dahulu.
Daftar periksa: Keamanan dan higienitas API key pada agen AI
- Tolak akses baca agen ke berkas
.envdan berkas konfigurasi rahasia lainnya. - Cantumkan aturan “jangan pernah mencetak secret” di dalam
CLAUDE.mdatauAGENTS.md. - Ganti nilai mentah pada berkas yang dapat diakses agen dengan referensi secret manager.
- Arahkan pemanggilan pihak ketiga melalui proxy penyuntik yang dilengkapi allowlist.
- Terbitkan satu token berumur pendek dengan batasan cakupan untuk setiap sesi agen.
- Jangan simpan token asli di dalam shared variable Apidog.
- Redaksi output alat, log CI, dan transkrip percakapan.
- Jika ada nilai rahasia yang muncul di transkrip, segera rotasi key tersebut pada hari yang sama.
FAQ
Bisakah agen AI menggunakan API key yang tidak dapat dilihatnya? Bisa. Menggunakan credential-injecting proxy, agen mengirimkan permintaan tanpa key sama sekali dan proxylah yang menyisipkan header terkait. Penggunaan variabel lingkungan dan referensi secret memang menyembunyikan nilainya dari prompt, tetapi nilainya masih berada di dalam shell agen.
Apakah variabel lingkungan aman untuk API key agen AI? Jauh lebih aman daripada menempelkan key secara langsung ke dalam prompt, tetapi belum cukup aman jika digunakan sendirian. Shell milik agen masih dapat mencetak variabel tersebut, dan prompt injection dapat memerintahkannya untuk melakukan hal itu. Padukan dengan aturan blokir baca (read-deny), redaksi log, dan token berumur pendek.
Apa yang harus saya lakukan jika agen telanjur mencetak API key? Segera rotasi key tersebut di penyedia layanan Anda saat itu juga, lalu telusuri ke mana transkrip tersebut mengalir: log penyedia, ekspor data, komentar PR, hingga output CI. Menghapus pesan saja tidak akan menghapus salinan data yang sudah tercatat.
Bagaimana cara meneruskan secret ke Apidog CLI tanpa mengeksposnya ke agen? Simpan token di dalam shell Anda dan minta agen meneruskan opsi --env-var "token=$NAME" ke perintah apidog run. Karena skrip pengujian hanya mereferensikan {{token}}, agen hanya akan berinteraksi dengan namanya saja.
Apakah token berumur pendek sudah cukup aman jika digunakan sendirian? Tidak. Token berdurasi 15 menit tetap dapat disalahgunakan secara leluasa selama 15 menit tersebut. Gunakan token ini sebagai lapisan perlindungan pelengkap di belakang prinsip nama-dalam-konteks dan penggunaan proxy.
