# Keamanan API GraphQL: izin objek, query, dan batas penggunaan

Sumber diperiksa. Metode: https://kompli.id/metodologi/.

Satu endpoint GraphQL dapat menjalankan banyak permintaan data. Periksa izin setiap objek dan operasi, batasi pekerjaan query, lalu bedakan penolakan yang benar dari respons yang masih membocorkan sebagian data.

URL kanonis: https://kompli.id/panduan/keamanan/keamanan-api-graphql/
Sumber diakses: 2026-10-02
Diperbarui: 2026-10-02
Penulis: Kompli
Sumber diperiksa: 2026-10-02


## Apa yang berbeda pada GraphQL?

**GraphQL tidak menggantikan pemeriksaan izin aplikasi.** Ia menyediakan bahasa query, schema serta aturan pemrosesan. Schema dapat menyatakan suatu field bertipe teks, tetapi belum menentukan apakah pelanggan A berhak membacanya dari laporan B.

*Resolver* adalah fungsi yang mengambil atau mengolah nilai suatu field. Permintaan dapat memakai alias untuk memberi nama hasil berbeda dan fragment untuk memakai ulang pilihan field. Mulai dari [panduan API umum](/panduan/keamanan/keamanan-api-akses-data/) untuk inventaris token, pemakai, data dan batas izin pengujian; halaman ini memperdalam perilaku GraphQL.

## Tetapkan izin pada jalur pengambilan data

Contoh fiktif: akun A hanya boleh membaca laporan A. Pemeriksaan pemilik perlu tetap berlaku ketika objek diakses dari field lain, daftar, relasi atau mutation. Simpan aturan pada lapisan yang dipakai bersama, bukan hanya satu tombol atau resolver luar.

Periksa juga izin field, misalnya ringkasan yang boleh dilihat anggota tetapi catatan internal hanya untuk petugas. Autentikasi yang berhasil belum memberi semua izin itu. Cache dan loader perlu mempertahankan batas akun/tenant; hasil untuk satu pelanggan tidak boleh dipakai oleh pelanggan lain.

## Jalankan contoh dengan parser dan executor nyata

[Unduh source dan hasil lab keamanan aplikasi 1.0](/unduhan/lab-keamanan-aplikasi-v1.zip). Paket memakai **GraphQL.js 17.0.2**; versi bahasa rujukan adalah spesifikasi **September 2025**. Dijalankan **2 Oktober 2026** pada Node **24.21.0**:

```sh
npm ci --ignore-scripts
node graphql-lab.mjs
```

Script menjalankan `parse`, `validate` dan `execute` terhadap schema nyata dengan dua laporan buatan. Identitas A pada konteks uji ditetapkan script; autentikasi HTTP, database dan layanan pelanggan tidak terlibat.

Permintaan berikut menunjukkan alias. `mine` dan `other` hanya mengubah nama hasil, bukan izin:

```graphql
{
  mine: report(id: "A") { body }
  other: report(id: "B") { body }
}
```

| Kasus yang dijalankan | Hasil bad → fixed dan retest |
| --- | --- |
| Laporan sendiri | `REPORT_A_DEMO` tetap tersedia. |
| Laporan B dari akun A | Data B terbuka → field laporan `null`, error `FORBIDDEN`, tanpa penanda B. |
| Alias laporan A dan B | Keduanya terbuka → A tersedia, B ditolak. Respons dapat berisi data dan error sekaligus. |
| Fragment mengambil isi B | Data B terbuka → ditolak oleh aturan objek yang sama. |
| Empat alias membaca A | Empat panggilan resolver → `QUERY_LIMIT` sebelum resolver dipanggil. |
| Resolver gagal secara internal | Detail path lab muncul → pesan umum `INTERNAL_ERROR`. |

Script menyimpan 18 hasil untuk bad, fixed dan retest. Uji penolakan mencari penanda data B dalam keseluruhan respons; jangan hanya memeriksa apakah ada elemen `errors`.

## Batasi pekerjaan, bukan hanya panjang teks query

OWASP membahas batas kedalaman, jumlah hasil, biaya query, waktu dan laju. Nilai batas perlu sesuai fitur dan kapasitas yang diuji; satu query dapat mengambil banyak data meskipun hanya satu permintaan HTTP.

Fixture menghitung node field pada AST, termasuk alias dan definisi fragment, lalu menolak hitungan di atas **enam**. Ini batas ilustrasi untuk schema kecil, **bukan algoritma biaya siap produksi**. Ia belum menghitung pengembangan fragment berulang, bobot relasi, jumlah baris atau biaya mutation. Menyalin angka enam ke produk tanpa pengukuran dapat memblokir pengguna sah atau melewatkan query mahal.

Pada produk, pilih mekanisme sesuai schema dan uji query normal sebagai kontrol positif. Tambahkan batas pagination, timeout dan laju operasi; rencanakan apa yang terjadi jika query berantai atau satu body berisi banyak operasi. Batch HTTP, cache, query cost berbobot dan load test belum dijalankan dalam lab ini.

## Error dan introspection perlu keputusan tersendiri

*Introspection* memungkinkan pemeriksaan schema. Tentukan apakah API ditujukan bagi client internal atau pemakai eksternal, lalu dokumentasikan kebutuhannya. Mematikan introspection saja tidak memperbaiki izin objek.

Pesan error publik tidak perlu mengungkap path, stack trace atau rahasia. Simpan identitas kasus dan diagnosis yang diperlukan pada pencatatan internal dengan akses yang tepat. Lab hanya memperlihatkan penggantian pesan error; konfigurasi logging dan kebijakan introspection produk belum diuji.

## Catat batas sebelum menyatakan hasil selesai

Pada ASVS **5.0.0**, hubungkan pemeriksaan objek dengan `v5.0.0-8.2.2` dan batas query dengan `v5.0.0-4.3.1`. Statusnya adalah **kasus fixture memenuhi harapan**, bukan seluruh persyaratan atau level ASVS lulus.

Isi [matriks hak akses](/template/pengujian-hak-akses-aplikasi/) untuk baca, ubah, hapus dan relasi; simpan bukti di [catatan verifikasi aplikasi](/template/catatan-verifikasi-keamanan-aplikasi/). Mutation, izin field, introspection, autentikasi HTTP, federasi schema, injection dan kondisi beban produk tetap memerlukan pemeriksaan tersendiri.

Penjelasan keamanan diadaptasi dari OWASP dengan perubahan bahasa; bagian itu mengikuti [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/). Rujukan bahasa dan otorisasi berasal dari GraphQL Foundation. Schema, kasus dan hasil lab adalah contoh orisinal Kompli.
## Sumber rujukan

- [OWASP GraphQL Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/GraphQL_Cheat_Sheet.html) — Access control, query limiting, cost/rate limits dan error.
- [GraphQL Specification — September 2025](https://spec.graphql.org/September2025/) — Edisi September 2025: validation, execution, alias dan fragment.
- [GraphQL — Authorization](https://graphql.org/learn/authorization/) — Izin pada lapisan logika bisnis, agar berlaku di semua jalur.
- [OWASP ASVS 5.0.0 — persyaratan resmi dalam JSON](https://github.com/OWASP/ASVS/releases/download/v5.0.0_release/OWASP_Application_Security_Verification_Standard_5.0.0_en.json) — V8.2.2: akses objek; V4.3.1: pembatasan query; contoh bukan kesesuaian seluruh persyaratan.

## Perlu membahas kebutuhan tim Anda?

Ceritakan sistem yang dikelola dan kebutuhan pengamanan tim Anda.

[Konsultasikan kebutuhan Anda](https://kompli.id/konsultasi/?topik=keamanan)

## Bacaan terkait

- [Keamanan API: akses pengguna, tenant, token, dan batas penggunaan](https://kompli.id/panduan/keamanan/keamanan-api-akses-data/)
- [Broken Access Control: akses melewati izin pengguna](https://kompli.id/panduan/owasp/broken-access-control/)
- [OWASP API Security Top 10 2023: risiko dan contoh API](https://kompli.id/panduan/owasp/owasp-api-top-10/)
- [Menyusun rencana verifikasi keamanan aplikasi dengan ASVS](https://kompli.id/panduan/owasp/rencana-verifikasi-asvs/)

