Keamanan Webhook
Jalur hardening webhook
Mulai dari launch native, lalu gunakan adapter framework jika Anda sudah punya server HTTP sendiri.
Launch native
Biarkan VibeGram mengelola lifecycle server HTTP.
Adapter framework
Mount handler webhook aman di Express, Fastify, Hono, Koa, atau native HTTP.
Body limit
Tolak payload terlalu besar sebelum parsing JSON mencapai handler.
Setup
import express from 'express';
import { Bot, createExpressMiddleware } from 'vibegram';
const bot = new Bot(process.env.BOT_TOKEN!);
const app = express();
const webhook = createExpressMiddleware(bot, {
secretToken: process.env.WEBHOOK_SECRET,
healthPath: '/healthz',
});
app.post('/webhook', express.json({ limit: '1mb' }), webhook);
app.get('/healthz', webhook);
await bot.setWebhook('https://domain-anda.com/webhook', {
secret_token: process.env.WEBHOOK_SECRET,
});
app.listen(3000);Cara Kerja
- Anda mendaftarkan webhook ke Telegram dengan
secret_token. - Telegram mengirim value itu di header
X-Telegram-Bot-Api-Secret-Token. - VibeGram memvalidasi header sebelum memproses update.
- Token yang salah atau hilang mendapat
403 Forbidden. - Body update yang malformed mendapat
400 Bad Request.
Launch Webhook Native
Untuk deployment standalone, bot.launch({ webhook }) bisa membuat HTTP server, mendaftarkan webhook, dan shutdown dengan graceful:
await bot.launch({
webhook: {
url: process.env.WEBHOOK_URL!,
port: Number(process.env.PORT ?? 3000),
path: '/webhook',
secretToken: process.env.WEBHOOK_SECRET,
healthPath: '/healthz',
maxBodySizeBytes: 1_000_000,
},
});healthPath mengembalikan 200 OK tanpa validasi secret token Telegram dan tanpa memproses body update.
Adapter Framework
Semua adapter webhook mendukung bentuk secretToken dan healthPath yang sama:
| Adapter | Import | Catatan |
|---|---|---|
| Express | createExpressMiddleware | Mount body parser hanya di route webhook |
| Fastify | createFastifyPlugin | Gunakan bodyLimit Fastify untuk batas payload |
| Hono | createHonoHandler | Pasangkan dengan limit body runtime/platform |
| Koa | createKoaMiddleware | Gunakan koaBody({ jsonLimit: '1mb' }) |
| Native HTTP | createNativeHandler | Memakai maxBodySizeBytes langsung |
Batas Ukuran Body
Update Telegram biasanya kecil. Jaga limit cukup ketat untuk melindungi parser dan infrastruktur:
| Adapter | Tempat mengatur limit |
|---|---|
Native bot.launch({ webhook }) / createNativeHandler() | maxBodySizeBytes, default 1 MB |
| Express | express.json({ limit: '1mb' }) |
| Fastify | Fastify({ bodyLimit: 1_000_000 }) |
| Hono | Limit body dari runtime/platform |
| Koa | koaBody({ jsonLimit: '1mb' }) |
Jangan mount body parser unlimited secara global sebelum validasi secret webhook.
Mendaftarkan dan Menghapus Webhook
await bot.setWebhook(`${process.env.WEBHOOK_URL}/webhook`, {
secret_token: process.env.WEBHOOK_SECRET,
max_connections: 100,
allowed_updates: ['message', 'callback_query'],
});
const info = await bot.getWebhookInfo();
console.log(info.pending_update_count);
await bot.deleteWebhook({ drop_pending_updates: true });Checklist Deployment
- Terminate TLS di depan endpoint webhook.
- Set
secret_tokenacak dan simpan di environment variable. - Terima
POSTsaja di route webhook. - Mount JSON parser hanya di route webhook dengan size limit.
- Expose health endpoint ringan untuk platform probe.
- Jangan log bot token, webhook secret, atau raw request header.
Tanpa Secret Token
app.post('/webhook', bot.webhookCallback());WARNING
Tanpa secret token, client mana pun yang mengetahui URL webhook bisa mengirim update palsu. Selalu gunakan secret token di produksi.