Mengamankan API Hono: konfigurasi CORS dengan custom origin, security headers otomatis dengan secureHeaders, rate limiting per IP atau endpoint, trusted proxy configuration, dan CSP untuk inline scripts.

Setelah di episode 10 kita memahami static files dan JSX rendering, pada episode ini kita akan membahas keamanan — CORS, security headers, dan rate limiting adalah tiga pilar keamanan dasar untuk setiap API production.
import { cors } from 'hono/cors'
app.use('*', cors({
origin: ['https://example.com', 'https://app.example.com'],
allowMethods: ['GET', 'POST', 'PUT', 'DELETE'],
allowHeaders: ['Content-Type', 'Authorization'],
credentials: true,
}))const corsConfig = process.env.NODE_ENV === 'production'
? { origin: ['https://example.com'] }
: { origin: '*' }
app.use('*', cors(corsConfig))Preflight handling dilakukan otomatis oleh Hono — tidak perlu route OPTIONS terpisah.
import { secureHeaders } from 'hono/secure-headers'
app.use('*', secureHeaders())Menambahkan header keamanan:
app.use('*', secureHeaders({
contentSecurityPolicy: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "'unsafe-inline'"],
styleSrc: ["'self'", "'unsafe-inline'"],
}
}))bun add @hono/rate-limiterimport { rateLimiter } from 'hono/rate-limiter'
app.use('*', rateLimiter({
windowMs: 60000, // 1 menit
limit: 100, // max 100 requests
keyGenerator: (c) => c.req.header('CF-Connecting-IP') ?? 'unknown',
}))app.post('/auth/login', loginHandler, {
rateLimit: { windowMs: 300000, limit: 5 } // 5 attempts per 5 menit
})Jika Hono berjalan di belakang reverse proxy (nginx, Cloudflare), konfigurasi trusted proxy:
app.use('*', (c, next) => {
const forwarded = c.req.header('X-Forwarded-For')
if (forwarded) {
c.set('clientIp', forwarded.split(',')[0].trim())
}
return next()
})Warning
Rate limiting harus dikonfigurasi dengan hati-hati. Untuk Cloudflare Workers, gunakan CF-Connecting-IP sebagai key generator karena Workers berjalan di banyak edge locations.
Pada episode 11 ini, kalian telah memahami tiga pilar keamanan dasar: CORS, security headers, dan rate limiting di Hono.
Inti yang harus dibawa pulang:
cors() middleware dengan custom origin.secureHeaders() untuk header otomatis.@hono/rate-limiter per IP atau per-route.Di episode 12 selanjutnya kita akan memahami JWT dan OAuth authentication — setup JWT verification, custom validation, OAuth social login, dan session management. Sampai jumpa di episode 12!