গ্রাফকিউএল (GraphQL) একটি অত্যন্ত নমনীয় এবং শক্তিশালী API প্রযুক্তি, যা ক্লায়েন্টদের প্রয়োজনীয় ডেটা অত্যন্ত নির্দিষ্টভাবে চেয়ে নিতে দেয়। তবে, এই ক্ষমতা যদি সঠিকভাবে পরিচালিত না হয়, তাহলে এটি Denial of Service (DoS) আক্রমণ, অতিরিক্ত সার্ভার লোড, বা সিস্টেমের পারফরম্যান্স কমিয়ে দিতে পারে। গ্রাফকিউএল-এর Query Limiting এবং Depth Limiting এই সমস্যাগুলির সমাধান করতে সাহায্য করে।
Query Limiting (কুয়েরি সীমাবদ্ধকরণ)
Query Limiting হল একটি পদ্ধতি যার মাধ্যমে আপনি গ্রাফকিউএল কুয়েরির আকার সীমিত করে সার্ভারের উপর অতিরিক্ত চাপ কমাতে পারেন। এটি সাধারণত কুয়েরির মধ্যে নির্দিষ্ট সংখ্যক ফিল্ড বা ডেটার সর্বোচ্চ সীমা নির্ধারণ করার মাধ্যমে করা হয়, যাতে ক্লায়েন্টরা অত্যধিক ডেটা চেয়ে নিতে না পারে এবং সার্ভারের ওপর অতিরিক্ত লোড না পরে।
Query Limiting-এর প্রয়োজনীয়তা
- সার্ভার লোড নিয়ন্ত্রণ: যদি কোনো কুয়েরিতে অত্যধিক ডেটা বা ফিল্ড চাওয়া হয়, তবে তা সার্ভারের পারফরম্যান্সে বড় প্রভাব ফেলতে পারে। Query Limiting এর মাধ্যমে এই ধরনের অতিরিক্ত লোড রোধ করা সম্ভব।
- ডেটা সুরক্ষা: কিছু ডেটা বা ফিল্ডের সীমাবদ্ধতা ব্যবহারকারী বা সার্ভারের নিরাপত্তার জন্য প্রয়োজনীয় হতে পারে।
- অতিরিক্ত কুয়েরি প্রতিরোধ: Query Limiting কুয়েরি আকারকে সীমাবদ্ধ রাখে, যাতে অ্যাপ্লিকেশন বা সার্ভারের নিরাপত্তা ক্ষতিগ্রস্ত না হয়।
Query Limiting বাস্তবায়ন
আপনি Apollo Server ব্যবহার করে Query Limiting বাস্তবায়ন করতে পারেন। এখানে একটি সাধারণ উদাহরণ:
const { ApolloServer, gql } = require('apollo-server');
const { createRateLimitDirective, limit } = require('graphql-rate-limit-directive');
const typeDefs = gql`
directive @rateLimit(
max: Int!
window: String!
) on FIELD_DEFINITION
type Query {
users: [User] @rateLimit(max: 5, window: "1m")
}
type User {
id: ID
name: String
email: String
}
`;
const resolvers = {
Query: {
users: () => {
// Some logic to return users
return [{ id: 1, name: "John", email: "john@example.com" }];
},
},
};
const server = new ApolloServer({
typeDefs,
resolvers,
schemaDirectives: {
rateLimit: createRateLimitDirective(),
},
});
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}`);
});
এখানে, @rateLimit ডিরেকটিভ ব্যবহার করা হয়েছে, যা users কুয়েরির জন্য সর্বোচ্চ ৫টি রিকোয়েস্ট প্রতি মিনিট সীমাবদ্ধ করে।
Depth Limiting (ডেপথ সীমাবদ্ধকরণ)
Depth Limiting হল একটি পদ্ধতি যার মাধ্যমে আপনি গ্রাফকিউএল কুয়েরির নেস্টিং লেভেল সীমিত করেন। অর্থাৎ, যখন ক্লায়েন্ট একটি কুয়েরি লিখে যা অনেকগুলো স্তরের (nested) ডেটা অনুসন্ধান করে, Depth Limiting এর মাধ্যমে সেই স্তরের গভীরতা সীমিত করা হয়।
Depth Limiting-এর প্রয়োজনীয়তা
- অতিরিক্ত নেস্টেড কুয়েরি প্রতিরোধ: গ্রাফকিউএল ক্লায়েন্টদের একটি কুয়েরি লেখার মাধ্যমে অনেক স্তরের ডেটা চেয়ে নিতে দেয়। যদি কোনো ক্লায়েন্ট গভীর স্তরের (deeply nested) কুয়েরি তৈরি করে, তবে এটি সার্ভারের জন্য অত্যধিক কস্টলি হতে পারে। Depth Limiting-এর মাধ্যমে এ ধরনের অতিরিক্ত কুয়েরি প্রতিরোধ করা যায়।
- সার্ভারের পারফরম্যান্স উন্নত করা: Depth Limiting এর মাধ্যমে, সার্ভার কেবল সীমিত সংখ্যক স্তর বা ডেটার উপর কাজ করতে পারে, যা পারফরম্যান্স উন্নত করতে সাহায্য করে।
- অনুমতি সীমাবদ্ধতা: কিছু ক্ষেত্র বা ডেটা শুধুমাত্র নির্দিষ্ট গভীরতায় পাওয়া যেতে পারে। Depth Limiting এই সীমাবদ্ধতার প্রয়োগ করতে সহায়ক।
Depth Limiting বাস্তবায়ন
Apollo Server-এ Depth Limiting ব্যবহার করতে, graphql-depth-limit প্যাকেজ ব্যবহার করা যেতে পারে। এটি কুয়েরির ডেপথ সীমাবদ্ধ করে।
- প্রথমে graphql-depth-limit ইন্সটল করুন:
npm install graphql-depth-limit
- তারপর Apollo Server তে Depth Limiting যুক্ত করুন:
const { ApolloServer, gql } = require('apollo-server');
const depthLimit = require('graphql-depth-limit');
const typeDefs = gql`
type Query {
user(id: ID!): User
}
type User {
id: ID
name: String
posts: [Post]
}
type Post {
id: ID
title: String
content: String
}
`;
const resolvers = {
Query: {
user: (_, { id }) => {
return { id, name: 'John', posts: [{ id: '1', title: 'Hello', content: 'Post content' }] };
},
},
};
const server = new ApolloServer({
typeDefs,
resolvers,
validationRules: [depthLimit(3)], // Limiting query depth to 3 levels
});
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}`);
});
এখানে, depthLimit(3) ব্যবহার করা হয়েছে, যা কুয়েরির গভীরতা সর্বোচ্চ ৩ স্তর পর্যন্ত সীমাবদ্ধ করে।
Query Limiting এবং Depth Limiting এর মধ্যে পার্থক্য
- Query Limiting মূলত কুয়েরির আকার বা ফলস্বরূপ ফেরত আসা ডেটার পরিমাণ সীমিত করে, যাতে অ্যাপ্লিকেশন বা সার্ভারের উপর অতিরিক্ত চাপ না আসে।
- Depth Limiting কেবল কুয়েরির গভীরতা (nesting level) সীমিত করে, যা ইনফিনিট বা অত্যধিক গভীর কুয়েরি থেকে সার্ভারকে সুরক্ষা দেয়।
সারাংশ
Query Limiting এবং Depth Limiting দুটি গুরুত্বপূর্ণ ফিচার যা গ্রাফকিউএল সার্ভারের পারফরম্যান্স এবং নিরাপত্তা উন্নত করতে সাহায্য করে। Query Limiting কুয়েরির আকার এবং ডেটার পরিমাণ সীমিত করে, এবং Depth Limiting কুয়েরির গভীরতা সীমিত করে, যাতে অতিরিক্ত বা অনির্দিষ্ট কুয়েরি সার্ভারের কার্যকারিতা কমিয়ে না দেয়। এই দুটি ফিচারের মাধ্যমে, আপনি আপনার গ্রাফকিউএল সার্ভারের নিরাপত্তা এবং পারফরম্যান্স নিয়ন্ত্রণ করতে পারেন।
Read more