Cara Buat Endpoint GraphQL Secure untuk Keluaran
GraphQL semakin populer sebagai standar modern dalam pengembangan API karena fleksibilitasnya. Developer bisa meminta data sesuai kebutuhan, tidak lebih dan tidak kurang. Tapi, di balik fleksibilitas itu ada tantangan besar: keamanan.
Bayangkan sebuah layanan endpoint GraphQL secure keluaran yang menyajikan data real-time. Tanpa mekanisme keamanan yang tepat, endpoint bisa jadi target empuk untuk query berlebihan, data leak, atau bahkan serangan denial of service (DoS). Karena itu, membangun endpoint GraphQL tidak cukup hanya berfungsi—harus juga aman.
Artikel ini akan membahas bagaimana membuat endpoint GraphQL yang secure untuk layanan keluaran, lengkap dengan praktik terbaik yang bisa langsung Anda terapkan.
Kenapa Keamanan GraphQL Penting?
1. Query Terlalu Bebas
Berbeda dengan REST yang endpoint-nya terbatas, GraphQL memungkinkan user menyusun query kompleks sesuka hati. Kalau tidak diawasi, ini bisa jadi pintu masuk abuse.
2. Data Sensitif Rentan Bocor
Schema GraphQL sering kali mengekspos lebih banyak field dari yang seharusnya. Tanpa proteksi, user bisa mengakses informasi internal yang seharusnya privat.
3. Potensi Serangan DoS
Query GraphQL bisa bersarang (nested query) sangat dalam, membuat server harus bekerja ekstra keras. Jika tidak dibatasi, ini bisa melumpuhkan sistem.
4. Kompleksitas Monitoring
Karena query sangat fleksibel, sulit menebak pola trafik normal. Hal ini membuat deteksi anomali jadi tantangan tersendiri.
Checklist Membangun Endpoint GraphQL Secure
1. Batasi Depth Query
Pastikan query tidak bisa bersarang terlalu dalam. Misalnya maksimal hanya 5 level. Ini mencegah serangan deep nesting yang bisa melumpuhkan server.
Contoh dengan library graphql-depth-limit
:
import depthLimit from "graphql-depth-limit"
;const server = new ApolloServer
({
schema, validationRules: [depthLimit(5
)]
});
2. Terapkan Rate Limiting
Gunakan mekanisme rate limit untuk membatasi jumlah request per user/IP. Misalnya 100 query per menit. Ini efektif mencegah spam atau brute-force query.
3. Gunakan Authentication & Authorization
- Authentication → memastikan hanya user terdaftar yang bisa mengakses endpoint.
- Authorization → menentukan siapa yang boleh akses field tertentu.
Contoh: hanya admin yang boleh query riwayat penuh data keluaran, sedangkan user biasa hanya bisa akses data harian.
4. Validasi Input dengan Ketat
Pastikan semua parameter query divalidasi. Jangan percaya input dari user tanpa filter. Gunakan library atau middleware validasi agar field yang diminta sesuai aturan.
5. Nonaktifkan Introspection di Production
Introspection query sangat berguna di development, tapi di production bisa jadi risiko keamanan karena memperlihatkan seluruh schema API.
Matikan introspection di production:
const server = new ApolloServer
({
schema, introspection: process.env.NODE_ENV !== "production"
});
6. Logging & Monitoring Query
Catat query yang masuk agar mudah dianalisis jika ada abuse. Gunakan tools seperti Apollo Studio atau custom logging untuk melacak query yang boros resource.
7. Implementasi Query Complexity Analysis
Hitung “biaya” setiap query (misalnya berdasarkan jumlah field atau nesting). Jika terlalu berat, tolak request.
Contoh dengan graphql-validation-complexity
:
import { createComplexityLimitRule } from 'graphql-validation-complexity'
;const server = new ApolloServer
({
schema, validationRules: [createComplexityLimitRule(1000
)]
});
8. Sanitasi Error Message
Jangan tampilkan pesan error detail ke user, karena bisa memberi petunjuk bagi attacker. Simpan detail error di log internal, tampilkan hanya pesan umum ke user.
9. Gunakan HTTPS & TLS
Pastikan semua komunikasi ke endpoint GraphQL terenkripsi dengan HTTPS. Ini penting untuk mencegah penyadapan data, apalagi untuk data keluaran real-time.
10. Uji dengan Security Testing
Lakukan penetration testing secara berkala. Gunakan tools seperti GraphQL Security Scanners untuk mendeteksi celah yang mungkin terlewat.
Contoh Implementasi Endpoint GraphQL Secure
Misalkan kita membangun layanan GraphQL untuk data keluaran.
Schema GraphQL Sederhana
type Keluaran {
Keluaran
id: ID!
tanggal: String!
hasil: String!
}
type Query {
keluaranTerbaru: keluaranByTanggal(tanggal: String!):
Keluaran}
Server dengan Middleware Keamanan
import { ApolloServer } from "apollo-server"
;import depthLimit from "graphql-depth-limit"
;import { createComplexityLimitRule } from "graphql-validation-complexity"
;const server = new ApolloServer
({
typeDefs,
resolvers, validationRules
: [ depthLimit(5
), createComplexityLimitRule(1000
)
], context: ({ req }
) => { const token = req.headers.authorization || ""
; if (!validateToken(token)) throw new Error("Unauthorized"
); return { user: decodeToken
(token) };
}
});
Dengan setup ini, endpoint hanya bisa diakses user valid, query tidak bisa terlalu kompleks, dan performa lebih terjamin.
Studi Kasus Keamanan di GraphQL
- Kasus 1: Nested Query Abuse
Sebuah layanan GraphQL down karena attacker membuat query bersarang 100 level. Solusi: tambahkan depth limit. - Kasus 2: Data Exposure
Field internalisAdmin
terekspos ke publik. Solusi: implementasi authorization per field. - Kasus 3: Overfetching Data
User biasa bisa request seluruh riwayat keluaran. Solusi: gunakan role-based access dan query complexity analysis.
Tips Lanjutan untuk Endpoint GraphQL Secure
- Terapkan JWT (JSON Web Token) untuk autentikasi lebih ringkas.
- Gunakan API Gateway (Kong, Nginx, atau AWS API Gateway) sebagai lapisan keamanan tambahan.
- Terapkan CORS policy yang ketat agar hanya domain tertentu yang bisa mengakses API.
- Gunakan caching (misalnya Redis) untuk query populer agar server tidak kelebihan beban.