Mengamankan API ElysiaJS: konfigurasi CORS dengan custom origin dan methods, security headers seperti HSTS dan X-Frame-Options, serta rate limiting berdasarkan IP atau endpoint untuk mencegah abuse.

Setelah di episode 10 kita memahami static files dan file upload, pada episode ini kita akan membahas keamanan — lapisan pertahanan yang sering diabaikan oleh developer yang fokus membangun fitur. Security headers, CORS, dan rate limiting adalah tiga pilar keamanan dasar untuk setiap API production.
CORS (Cross-Origin Resource Sharing) mengontrol origin mana yang boleh mengakses API kalian. Tanpa CORS yang benar, browser akan memblokir request dari domain lain — ini adalah fitur keamanan bawaan browser.
bun add @elysiajs/corsimport { Elysia } from 'elysia'
import cors from '@elysiajs/cors'
const app = new Elysia()
.use(cors({
origin: ['https://example.com', 'https://app.example.com'],
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization'],
credentials: true,
}))
.listen(3000)const corsConfig = process.env.NODE_ENV === 'production'
? { origin: ['https://example.com'] }
: { origin: '*' }
app.use(cors(corsConfig))ElysiaJS menyediakan beberapa security headers yang bisa ditambahkan secara manual:
const app = new Elysia()
.onBeforeHandle(({ set }) => {
set.headers['Strict-Transport-Security'] = 'max-age=31536000; includeSubDomains'
set.headers['X-Content-Type-Options'] = 'nosniff'
set.headers['X-Frame-Options'] = 'DENY'
set.headers['X-XSS-Protection'] = '1; mode=block'
set.headers['Referrer-Policy'] = 'strict-origin-when-cross-origin'
})Untuk lebih bersih, buat security headers sebagai plugin:
const securityPlugin = (app: Elysia) =>
app.onBeforeHandle(({ set }) => {
set.headers['Strict-Transport-Security'] = 'max-age=31536000'
set.headers['X-Content-Type-Options'] = 'nosniff'
set.headers['X-Frame-Options'] = 'DENY'
})Rate limiting melindungi API dari abuse — baik yang disengaja (DDoS) maupun tidak (client yang terlalu sering polling). Tanpa rate limiting, satu client bisa membanjiri server dengan request.
bun add @elysiajs/rate-limitimport { Elysia } from 'elysia'
import { rateLimit } from '@elysiajs/rate-limit'
const app = new Elysia()
.use(rateLimit({
max: 100, // max requests per window
duration: 60000, // window 60 detik
}))
.listen(3000)Rate limiting bisa diterapkan per-route untuk endpoint yang lebih sensitif:
.post('/auth/login', loginHandler, {
rateLimit: {
max: 5,
duration: 300000, // 5 menit
}
})Warning
Rate limiting harus dikonfigurasi dengan hati-hati. Terlalu ketat akan memblokir user legit, terlalu longgar tidak efektif. Untuk production, pertimbangkan menggunakan Redis untuk distributed rate limiting jika kalian menjalankan multiple instances.
Pada episode 11 ini, kalian telah memahami tiga pilar keamanan dasar: CORS, security headers, dan rate limiting.
Inti yang harus dibawa pulang:
Di episode 12 selanjutnya kita akan memahami JWT authentication dan session management — setup JWT, cookie-based session, bearer token pattern, dan guard pattern untuk melindungi route. Sampai jumpa di episode 12!