GraphQL'in esnekliği harikadır ancak istemcilere veri çekme konusunda sonsuz özgürlük vermek, kötü niyetli kullanıcıların sunucunuzu çökertmesine (Denial of Service) neden olabilir. Güvenli bir GraphQL API'si tasarlamanın yollarını öğrenin.
Sonsuz Döngü (Depth) Problemi
İlişkisel verilerde iç içe geçen sorgular, sunucunun saatlerce yanıt oluşturmaya çalışmasına neden olabilir. "Author -> Posts -> Comments -> Author -> Posts..." şeklindeki bir sorgu sunucunuzu kilitleyebilir. Bunu engellemek için GraphQL sorgularının derinliğine limit koymalısınız.
// (c) CodeMareFi - codemarefi.com.tr
// Express GraphQL'de depth-limit kütüphanesi kullanımı
const depthLimit = require('graphql-depth-limit');
const { graphqlHTTP } = require('express-graphql');
app.use('/graphql', graphqlHTTP({
schema: mySchema,
validationRules: [depthLimit(5)], // Maksimum 5 seviye derinliğe izin ver
graphiql: process.env.NODE_ENV === 'development',
}));
Query Cost (Sorgu Maliyeti) Analizi
Sadece derinliği sınırlamak yetmeyebilir. Bazen kullanıcı binlerce kayıt çeken çok maliyetli bir sorgu yollayabilir. Her bir alana (field) puan vererek toplam "Sorgu Maliyeti" (Query Complexity) hesaplayan middleware'ler kullanmak en kesin çözümdür.
