Langsung ke konten
Guide

Agen AI memanggil API Anda: 5 kesalahan autentikasi yang menyebabkan pintu belakang

| 9 min read

80% tim menjalankan agen AI dalam produksi tetapi hanya 22% yang memperlakukan mereka sebagai identitas independen. Lima kesalahan autentikasi yang mengubah API Anda menjadi pintu terbuka.

Digital padlock on circuit board representing API authentication security
Photo by Adi Goldstein on Unsplash

Survei tahun 2026 terhadap 900+ praktisi menemukan bahwa 80,9% tim teknik menjalankan agen AI dalam pengujian atau produksi. Survei yang sama menemukan bahwa hanya 21,9% yang memperlakukan agen-agen tersebut sebagai entitas independen yang mempunyai identitas. Sisanya dibagikan kredensial, lewati jalur audit, dan berikan akses API menyeluruh ke kode yang berjalan tanpa pengawasan.

Kesenjangan itu adalah masalah keamanan. OWASP merilis 10 Aplikasi Agen Teratas pada tahun 2026, dan Penyalahgunaan Alat dan Eskalasi Hak Istimewa berada di puncak daftar dengan 520 insiden yang dilaporkan. Meta mendokumentasikan agen AI jahat yang melewati semua orang pemeriksaan identitas karena memiliki kredensial yang valid dari skenario deputi yang membingungkan. 48,9% organisasi tidak bisa bahkan melihat apa yang dilakukan agen mereka dengan akses API.

Postingan ini membahas lima kesalahan autentikasi yang mengubah API Anda menjadi pintu terbuka bagi agen AI, dan cara menutupnya satu dengan kode yang berfungsi.

Kesalahan 1: membagikan satu kunci API ke semua agen

44% tim menggunakan kunci API statis untuk agen AI. Ketika beberapa agen berbagi satu kunci, Anda kehilangan tiga hal: audit jejak (agen mana yang membuat permintaan ini?), pencabutan granular (mencabut satu agen akan membunuh semuanya), dan pembatasan tarif per agen (satu agen yang melarikan diri menghabiskan kuota untuk setiap agen).

# Three different agents share one API key
# Agent A: summarizes support tickets
# Agent B: processes refunds
# Agent C: exports customer PII

curl -X POST https://api.acme.com/v1/customers/export \\
  -H "Authorization: Bearer sk_live_shared_key_for_all_agents" \\
  -H "Content-Type: application/json" \\
  -d '{"format": "csv", "include_pii": true}'

# Which agent made this request? You can't tell.
# Need to revoke Agent C? You break A and B too.

Cara mengatasinya: mengeluarkan kredensial unik per agen. Setiap kunci dipetakan ke identitas agen tertentu, dengan cakupan yang ditentukan titik akhir, dan batas kecepatannya sendiri. Saat Anda perlu mencabut Agen C, agen A dan B tetap berjalan.

# Each agent gets its own scoped API key
curl -X POST https://api.acme.com/v1/tickets/summary \\
  -H "Authorization: Bearer sk_live_agent_a_tickets_readonly" \\
  -H "X-Agent-ID: agent-ticket-summarizer" \\
  -H "Content-Type: application/json" \\
  -d '{"ticket_id": "TKT-4829"}'

Gunakan X-Agent-ID header di samping kunci API sehingga log Anda selalu mengatribusikan permintaan ke a agen tertentu. Dekode token untuk memverifikasi klaimnya sesuai dengan agen yang melakukan panggilan.

# Inspect what permissions an agent token carries
curl -s -X POST https://api.botoi.com/v1/jwt/decode \\
  -H "Content-Type: application/json" \\
  -d '{"token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZ2VudC1yZWZ1bmQtcHJvY2Vzc29yIiwic2NvcGVzIjpbInJlZnVuZHM6d3JpdGUiLCJvcmRlcnM6cmVhZCJdLCJleHAiOjE3NDk2MDAsMDAwLCJpc3MiOiJhY21lLWF1dGgifQ.signature"}'
{
  "success": true,
  "data": {
    "header": {
      "alg": "RS256",
      "typ": "JWT"
    },
    "payload": {
      "sub": "agent-refund-processor",
      "scopes": ["refunds:write", "orders:read"],
      "exp": 1749600000,
      "iss": "acme-auth"
    }
  }
}

Masalah wakil yang membingungkan: Insiden agen nakal Meta terjadi karena agen tersebut menahan kredensial valid yang memberikan akses di luar cakupan yang dimaksudkan. Agen melewati setiap pemeriksaan identitas. Itu kredensial itu sah. Masalahnya adalah tidak ada seorang pun yang bisa menjangkau tujuan agen tersebut.

Kesalahan 2: memberikan akses API penuh ketika agen membutuhkan satu titik akhir

35% organisasi mengandalkan akun layanan bersama untuk agen AI. Akun layanan dengan akses API penuh berarti agen peringkasan tiket Anda juga dapat memproses pengembalian dana, mengekspor PII pelanggan, dan menghapus catatan. Itu adalah prinsip pelanggaran hak istimewa yang paling sedikit.

Cakupan setiap token agen ke titik akhir minimum dan tindakan yang diperlukan. Agen pemroses pengembalian dana mendapat refunds:write Dan orders:read. Tidak lebih.

// Mint a scoped token for each agent at deploy time
interface AgentTokenClaims {
  sub: string;          // unique agent identity
  scopes: string[];     // minimum required permissions
  exp: number;          // short TTL: 1-24 hours
  iss: string;          // your auth service
  rate_limit: number;   // requests per minute for this agent
}

const agentClaims: AgentTokenClaims = {
  sub: "agent-refund-processor",
  scopes: ["refunds:write", "orders:read"],
  exp: Math.floor(Date.now() / 1000) + 3600, // 1 hour
  iss: "acme-auth",
  rate_limit: 30,
};

Sebelum menerapkan agen, periksa apakah tokennya memiliki cakupan yang benar dan belum kedaluwarsa. Dekode itu token dengan titik akhir Botoi JWT untuk memeriksa klaim dan is_expired bendera.

# Decode the token and check expiry before trusting claims
curl -s -X POST https://api.botoi.com/v1/jwt/decode \\
  -H "Content-Type: application/json" \\
  -d '{
    "token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZ2VudC10aWNrZXQtc3VtbWFyaXplciIsInNjb3BlcyI6WyJ0aWNrZXRzOnJlYWQiXSwiZXhwIjoxNzQ5Njg2NDAwfQ.abc123"
  }'
{
  "success": true,
  "data": {
    "header": {
      "alg": "HS256",
      "typ": "JWT"
    },
    "payload": {
      "sub": "agent-ticket-summarizer",
      "scopes": ["tickets:read"],
      "exp": 1749686400
    },
    "signature": "abc123",
    "is_expired": false,
    "expires_at": "2025-06-11T22:40:00.000Z",
    "expires_in_seconds": 3600
  }
}
Mendekati Kontrol ruang lingkup Pencabutan Jejak audit Mempertaruhkan
Akun layanan bersama Tidak ada Hancurkan semua agen Tidak ada atribusi Tinggi
Kunci API statis per agen Hanya pada tingkat kunci Per-agen Dengan kunci Sedang
Cakupan JWT per agen Titik akhir + tindakan Per-agen + masa berlaku Klaim penuh Rendah
Pertukaran token OBO Diwarisi + dipersempit Per sesi Rantai penuh Terendah

Solusi IAM baru untuk agen AI mendukung pertukaran token Atas Nama (OBO). Agen menerima token berasal dari sesi pengguna asli, secara otomatis disesuaikan dengan izin yang diberikan pengguna. Ini Pendekatan ini menciptakan rantai otorisasi penuh dari pengguna, agen, hingga API.

Kesalahan 3: tidak ada masa berlaku kredensial agen

43% tim menggunakan otentikasi nama pengguna/kata sandi untuk agen AI. Kredensial tersebut tidak kedaluwarsa. API Statis kunci juga tidak kedaluwarsa, kecuali Anda memasukkan masa berlaku ke dalam sistem Anda. Kredensial agen yang hidup selamanya adalah kredensial yang dapat dicuri, dibocorkan dalam log, atau dimasukkan ke dalam repositori dan dieksploitasi beberapa bulan kemudian.

Tetapkan TTL maksimum 1 hingga 24 jam pada token agen. Hasilkan kredensial baru pada setiap penerapan atau pada a jadwal. Gunakan pembuat kata sandi Botoi untuk membuat rahasia entropi tinggi untuk penandatanganan HMAC.

# Generate a high-entropy secret for HMAC signing
curl -s -X POST https://api.botoi.com/v1/password/generate \\
  -H "Content-Type: application/json" \\
  -d '{"length": 64, "uppercase": true, "lowercase": true, "numbers": true, "symbols": false}'
{
  "success": true,
  "data": {
    "password": "kX9mT2vR8nL4wQ6jY3bA5cF7hD1gP0sE9uI2oK4lM6nB8xZ3vC5tR7yW0qJ1aG"
  }
}

Tambahkan penandatanganan permintaan HMAC

Selain autentikasi berbasis token, tandatangani setiap payload permintaan dengan HMAC-SHA256. API Anda memverifikasi tanda tangan sebelumnya memproses permintaan tersebut. Hal ini membuktikan bahwa muatan tidak dirusak dalam perjalanan dan menghubungkan setiap permintaan ke a rahasia agen tertentu.

# Sign a request payload so your API can verify the sender
PAYLOAD='{"agent_id":"agent-refund-processor","action":"refund","order_id":"ORD-7291"}'

curl -s -X POST https://api.botoi.com/v1/hash/hmac \\
  -H "Content-Type: application/json" \\
  -d "{
    \\"text\\": \\"$PAYLOAD\\",
    \\"key\\": \\"kX9mT2vR8nL4wQ6jY3bA5cF7hD1gP0sE9uI2oK4lM6nB8xZ3vC5tR7yW0qJ1aG\\",
    \\"algorithm\\": \\"sha256\\"
  }"
{
  "success": true,
  "data": {
    "hmac": "a3f8c2d1e5b7094f6d2c8a1e3b5f7d9e4c6a8b0d2f4e6c8a0b2d4f6e8c0a2b4",
    "algorithm": "sha256"
  }
}

Server API Anda menghitung ulang HMAC menggunakan salinan rahasia agen yang tersimpan. Jika hashnya cocok, maka permintaan itu asli. Jika tidak, tolak saja.

Otomatiskan rotasi rahasia

Rotasi manual tidak berskala ketika Anda menjalankan lusinan agen. Buat skrip rotasi yang menghasilkan skrip rotasi baru rahasia, menyebarkannya, memverifikasi konektivitas, lalu mencabut yang lama.

import Botoi from "@botoi/sdk";

const botoi = new Botoi({ apiKey: process.env.BOTOI_API_KEY });

async function rotateAgentSecret() {
  // Generate a new 64-character secret
  const { data } = await botoi.password.generate({
    length: 64,
    uppercase: true,
    lowercase: true,
    numbers: true,
    symbols: false,
  });

  console.log("New secret generated. Deploy to agent, then revoke the old one.");

  // Hash the new secret for storage (never store plaintext)
  const hashed = await botoi.hash.sha256({ input: data.password });
  console.log("Hashed for DB:", hashed.data.hash);

  return { secret: data.password, hash: hashed.data.hash };
}

rotateAgentSecret();

Kesalahan 4: melewatkan pencatatan permintaan untuk panggilan mesin-ke-mesin

48,9% organisasi tidak mengetahui lalu lintas mesin-ke-mesin. Mereka mencatat panggilan API manusia tetapi mengecualikan panggilan internal komunikasi layanan-ke-layanan dari tumpukan observabilitasnya. Agen AI termasuk dalam titik buta tersebut.

Ketika agen berperilaku buruk, mengirimkan banyak permintaan, mengakses titik akhir di luar cakupannya, atau mendapatkan dikompromikan, Anda perlu menjawab tiga pertanyaan: agen mana, kapan, dan apa yang disentuhnya? Tanpa permintaan logging, Anda tidak dapat menjawab satupun dari mereka.

// Express middleware: log every agent request
app.use("/v1/*", (req, res, next) => {
  const agentId = req.headers["x-agent-id"] || "unknown";
  const start = Date.now();

  res.on("finish", () => {
    const log = {
      timestamp: new Date().toISOString(),
      agent_id: agentId,
      method: req.method,
      path: req.path,
      status: res.statusCode,
      duration_ms: Date.now() - start,
      ip: req.ip,
      user_agent: req.headers["user-agent"],
    };
    console.log(JSON.stringify(log));
  });

  next();
});

Tangkap identitas agen, titik akhir, metode HTTP, kode status, dan durasi pada setiap permintaan. Kirim terstruktur log ke platform observasi Anda. Tetapkan peringatan untuk anomali: lonjakan tiba-tiba dalam volume permintaan, permintaan untuk titik akhir di luar cakupan agen, atau tingkat kesalahan yang meningkat.

Lacak apa yang dikirimkan oleh agen, bukan apa yang dikatakan agen tersebut. Catat hash payload permintaan (menggunakan /v1/hash) di samping metadata. Ini memberi Anda bukti kerusakan tanpa menyimpan muatan sensitif di sistem log Anda.

Kesalahan 5: memperlakukan autentikasi agen sama dengan autentikasi manusia

Hanya 18% pemimpin keamanan yang yakin sistem IAM mereka dapat mengelola identitas agen. Baut 82% lainnya akses agen ke alur autentikasi manusia yang tidak dirancang untuk penelepon otonom.

Autentikasi manusia mengasumsikan seseorang membaca layar persetujuan OAuth, memasukkan kata sandi, dan merespons permintaan MFA. Agen tidak melakukan semua itu. Mereka memerlukan model autentikasi berbeda dengan tiga properti.

1. Token tercakup dengan izin eksplisit

Setiap token agen menyatakan titik akhir mana yang dapat dipanggil dan tindakan apa yang dapat dilakukan. API menerapkan hal tersebut cakupan pada setiap permintaan. Tidak ada ruang lingkup, tidak ada akses.

2. Batasan tarif per identitas

Pengguna manusia mengirimkan beberapa permintaan per menit. Seorang agen mengirim ratusan atau ribuan. Batas tarif per agen identitas mencegah satu agen membuat agen lain kelaparan dan membatasi radius ledakan jika agen menjadi nakal.

3. Minta atribusi pada setiap lapisan

Setiap permintaan membawa identitas agen dari edge proxy melalui lapisan aplikasi ke database log kueri. Ketika terjadi kesalahan, Anda menelusuri seluruh jalur dari agen ke tindakan.

Audit token agen dengan Botoi SDK

Gabungkan titik akhir JWT dan kata sandi ke dalam satu fungsi audit. Dekode token, periksa masa berlakunya, verifikasi tanda tangan, dan tandai cakupan yang terlalu luas.

import Botoi from "@botoi/sdk";

const botoi = new Botoi({ apiKey: process.env.BOTOI_API_KEY });

async function auditAgentToken(token: string, secret: string) {
  // Step 1: Decode to inspect claims
  const decoded = await botoi.jwt.decode({ token });
  const claims = decoded.data.payload;

  console.log("Agent:", claims.sub);
  console.log("Scopes:", claims.scopes);

  // Step 2: Check expiration
  const now = Math.floor(Date.now() / 1000);
  const hoursLeft = (claims.exp - now) / 3600;

  if (hoursLeft < 0) {
    console.error("Token expired", Math.abs(hoursLeft).toFixed(1), "hours ago");
    return { valid: false, reason: "expired" };
  }

  if (hoursLeft > 24) {
    console.warn("Token lives longer than 24 hours; rotate sooner");
  }

  // Step 3: Verify signature
  const verified = await botoi.jwt.verify({ token, secret, algorithms: ["HS256"] });

  if (!verified.data.valid) {
    console.error("Signature verification failed");
    return { valid: false, reason: "invalid_signature" };
  }

  // Step 4: Check scope breadth
  const dangerousScopes = claims.scopes.filter(
    (s: string) => s === "*" || s === "admin" || s.endsWith(":*")
  );

  if (dangerousScopes.length > 0) {
    console.warn("Overly broad scopes:", dangerousScopes);
  }

  return { valid: true, agent: claims.sub, scopes: claims.scopes, hoursLeft };
}

const result = await auditAgentToken(process.env.AGENT_TOKEN!, process.env.SIGNING_SECRET!);
console.log(result);

Jalankan pemeriksaan ini sebagai langkah pra-penerapan. Jika token kedaluwarsa, memiliki TTL lebih dari 24 jam, gagal ditandatangani verifikasi, atau membawa cakupan wildcard, memblokir penerapan.

Daftar periksa untuk autentikasi API agen AI

Memeriksa Apa yang harus diverifikasi Titik akhir Botoi
Identitas unik per agen Tidak ada dua agen yang berbagi kunci atau token sub mengeklaim /v1/jwt/decode
Cakupan minimum Cakupan token sesuai dengan tujuan agen; tidak ada wildcard /v1/jwt/decode
Kedaluwarsa token TTL di bawah 24 jam; mekanisme penyegaran pada tempatnya /v1/jwt/decode
Minta penandatanganan Payload HMAC cocok di sisi server /v1/hash/hmac
Rotasi rahasia Rahasia dirotasi saat diterapkan atau sesuai jadwal /v1/password/generate
Minta pencatatan Setiap permintaan agen dicatat dengan hash identitas dan payload /v1/hash

Data surveinya jelas: tim menyebarkan agen AI lebih cepat daripada mengamankannya. 80,9% memiliki agen yang berjalan, namun kurang dari 1 dari 5 memberikan identitas mereka sendiri kepada agen tersebut. Setiap kesalahan dalam daftar ini, kunci bersama, cakupan luas, kredensial permanen, lalu lintas senyap, autentikasi berbentuk manusia, adalah pintu belakang yang menunggu deputi berikutnya yang kebingungan kejadian.

Pilih satu kesalahan dari daftar ini. Perbaiki minggu ini. Kemudian lanjutkan ke yang berikutnya.

FAQ

Haruskah agen AI menggunakan kunci API yang sama dengan pengguna manusia?
Tidak. Agen AI memerlukan kredensial khusus dengan izin terbatas, batas tingkat per identitas, dan masa berlaku otomatis. Survei yang dilakukan pada tahun 2026 terhadap 900+ praktisi menemukan bahwa hanya 21,9% tim yang memperlakukan agen sebagai entitas independen yang memiliki identitas, dan 44% masih berbagi kunci API statis di seluruh agen.
Bagaimana cara merotasi kunci API untuk agen AI tanpa waktu henti?
Hasilkan kredensial baru, sebarkan ke agen, verifikasi berfungsi, lalu cabut kunci lama. Gunakan token yang berumur pendek (1-24 jam) dengan penyegaran otomatis sehingga rotasi terjadi tanpa langkah manual. Titik akhir Botoi /v1/password/generate membuat rahasia dengan entropi tinggi, dan /v1/jwt/decode memeriksa token baru sebelum memotongnya.
Apa yang dimaksud dengan 10 Besar OWASP untuk Aplikasi Agen?
Dirilis pada tahun 2026, OWASP Top 10 untuk Aplikasi Agen mencantumkan risiko keamanan paling umum ketika agen AI berinteraksi dengan API dan alat. Penyalahgunaan Alat dan Peningkatan Hak Istimewa berada di puncak daftar dengan 520 insiden yang dilaporkan. Risiko lainnya termasuk kontrol akses yang tidak memadai, hilangnya jalur audit, dan serangan deputi yang membingungkan.
Bagaimana Anda memantau lalu lintas API mesin-ke-mesin dari agen AI?
Catat setiap permintaan dengan identitas agen, stempel waktu, titik akhir, dan hash payload. Gunakan log JSON terstruktur dan kirimkan ke sistem terpusat (Datadog, Grafana, atau CloudWatch). Sebuah studi pada tahun 2026 menemukan bahwa 48,9% organisasi tidak dapat memantau lalu lintas agen AI sama sekali, sehingga mereka tidak dapat melihat agen yang disusupi atau berperilaku buruk.
Apa yang dimaksud dengan serangan deputi yang membingungkan dalam konteks agen AI?
Serangan deputi yang membingungkan terjadi ketika agen AI menggunakan kredensial sahnya untuk melakukan tindakan yang tidak diinginkan oleh operatornya. Agen melewati setiap pemeriksaan identitas karena memegang token yang valid, namun bertindak berdasarkan instruksi dari sumber yang tidak tepercaya. Meta mendokumentasikan pola ini dalam insiden agen jahat di mana agen mengakses sumber daya di luar cakupan yang dimaksudkan.

Mulai membangun dengan botoi

150+ endpoint API untuk pencarian, pemrosesan teks, pembuatan gambar, dan utilitas developer. Paket gratis, tanpa kartu kredit.