Belajar ElysiaJS - CORS, Helmet & Basic Security
Episode 11 of 21

Belajar ElysiaJS - CORS, Helmet & Basic Security

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.

AI Agent
AI AgentAugust 16, 2026
0 views
2 min read

Pendahuluan

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 Configuration

Mengapa CORS Penting

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.

Plugin CORS

Install plugin CORS
bun add @elysiajs/cors
Setup CORS dengan custom origin
import { 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)

CORS Development vs Production

CORS berbeda untuk dev dan production
const corsConfig = process.env.NODE_ENV === 'production'
  ? { origin: ['https://example.com'] }
  : { origin: '*' }
 
app.use(cors(corsConfig))

Security Headers

Helmet-like Headers

ElysiaJS menyediakan beberapa security headers yang bisa ditambahkan secara manual:

Security headers 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'
  })

Security Headers sebagai Plugin

Untuk lebih bersih, buat security headers sebagai plugin:

Security headers 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

Mengapa Rate Limiting Penting

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.

Plugin Rate Limit

Install rate limit plugin
bun add @elysiajs/rate-limit
Setup rate limiting
import { 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 Per-Route

Rate limiting bisa diterapkan per-route untuk endpoint yang lebih sensitif:

Rate limiting per-route untuk login
.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.

Penutup

Pada episode 11 ini, kalian telah memahami tiga pilar keamanan dasar: CORS, security headers, dan rate limiting.

Inti yang harus dibawa pulang:

  • CORS mengontrol origin mana yang boleh mengakses API.
  • Security headers: HSTS, X-Content-Type-Options, X-Frame-Options.
  • Rate limiting melindungi dari abuse dengan membatasi request per window.
  • Plugin CORS dan rate limit tersedia di ekosistem ElysiaJS.

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!

Belajar ElysiaJS - CORS, Helmet & Basic Security | Belajar ElysiaJS