ওয়েবহুকস ব্যাখ্যা: সাইনড পেলোড এবং রিট্রাই
আপনি একটি API তৈরি করেছেন এবং এখন ইভেন্ট ঘটলে অন্যান্য সার্ভিসকে জানাতে চান। আপনি একটি ওয়েবহুক এন্ডপয়েন্ট সেট আপ করেছেন, কিন্তু শীঘ্রই আবিষ্কার করলেন যে যে কেউ জাল পেলোড পাঠাতে পারে, এবং আপনার সার্ভার ডাউন থাকলে ইভেন্টগুলো চিরতরে হারিয়ে যায়। এটি একটি সাধারণ সমস্যা: ওয়েবহুকস ধারণাগতভাবে সহজ কিন্তু নিরাপত্তা এবং নির্ভরযোগ্যতার জন্য সতর্ক নকশা প্রয়োজন।
এই গাইডে, আমরা ওয়েবহুকসের মূল বিষয়গুলো নিয়ে আলোচনা করব: পেলোডে হস্তক্ষেপ প্রতিরোধ করতে কীভাবে সাইন করবেন, প্রাপকের প্রান্তে সিগনেচার যাচাই করবেন, এবং ব্যর্থতা সামলাতে এক্সপোনেনশিয়াল ব্যাকঅফ সহ রিট্রাই লজিক প্রয়োগ করবেন। আমরা ডুপ্লিকেট প্রসেসিং এড়াতে আইডেম্পোটেন্সিও কভার করব। শেষে, আপনার একটি শক্তিশালী ওয়েবহুক সিস্টেম থাকবে যা আপনি বিশ্বাস করতে পারেন।
ওয়েবহুকস কী?
ওয়েবহুকস হলো ব্যবহারকারী-সংজ্ঞায়িত HTTP কলব্যাক। যখন উৎস সিস্টেমে একটি ইভেন্ট ঘটে (যেমন, একটি পেমেন্ট প্রসেস হয়), তখন এটি আপনার নির্দিষ্ট করা একটি URL-এ ইভেন্টের বিবরণ সহ একটি HTTP POST অনুরোধ পাঠায়। এটি পোলিং ছাড়াই সার্ভিসগুলোর মধ্যে রিয়েল-টাইম যোগাযোগের সুযোগ দেয়।
তবে, ওয়েবহুকস দুটি চ্যালেঞ্জ নিয়ে আসে:
- নিরাপত্তা: প্রাপক কীভাবে জানবে যে অনুরোধটি সত্যিই প্রেরকের কাছ থেকে এসেছে?
- নির্ভরযোগ্যতা: প্রাপক সাময়িকভাবে অনুপলব্ধ থাকলে কী হবে? কীভাবে নিশ্চিত করব যে ইভেন্টটি শেষ পর্যন্ত পৌঁছাবে?
সাইনড পেলোড দিয়ে ওয়েবহুকস সুরক্ষিত করা
জাল অনুরোধ প্রতিরোধ করতে, প্রেরককে একটি শেয়ার্ড সিক্রেট ব্যবহার করে পেলোড সাইন করতে হবে। প্রাপক তখন প্রেরককে প্রমাণীকরণের জন্য সিগনেচার যাচাই করতে পারে। সবচেয়ে সাধারণ পদ্ধতি হলো SHA-256 সহ HMAC (হ্যাশ-ভিত্তিক মেসেজ অথেন্টিকেশন কোড)।
HMAC সাইনিং কীভাবে কাজ করে
- প্রেরক এবং প্রাপক একটি শেয়ার্ড সিক্রেট কী শেয়ার করে (আদর্শভাবে একটি দীর্ঘ, র্যান্ডম স্ট্রিং)।
- প্রতিটি ওয়েবহুকের জন্য, প্রেরক সিক্রেট ব্যবহার করে অনুরোধ বডির একটি HMAC গণনা করে এবং এটি একটি হেডারে (যেমন,
X-Signature) অন্তর্ভুক্ত করে। - প্রাপক প্রাপ্ত বডিতে একই HMAC গণনা করে এবং এটি হেডারের মানের সাথে তুলনা করে। যদি তারা মিলে যায়, অনুরোধটি প্রামাণিক।
JSON সিরিয়ালাইজেশনের পার্থক্যের কারণে অসঙ্গতি এড়াতে কাঁচা অনুরোধ বডিতে সাইন করা অত্যন্ত গুরুত্বপূর্ণ, পার্স করা সংস্করণে নয়।
উদাহরণ: Node.js-এ একটি পেলোড সাইন করা
const crypto = require('crypto');
function signPayload(payload, secret) {
return crypto.createHmac('sha256', secret).update(payload).digest('hex');
}
// প্রেরকের দিকে:
const payload = JSON.stringify({ event: 'payment.success', amount: 100 });
const signature = signPayload(payload, 'your-secret-key');
// হেডারে সিগনেচার অন্তর্ভুক্ত করুন: X-Signature: signature
প্রাপকের প্রান্তে সিগনেচার যাচাই করা
প্রাপকের প্রান্তে, পেলোড প্রসেস করার আগে আপনাকে সিগনেচার যাচাই করতে হবে। টাইমিং আক্রমণ প্রতিরোধ করতে ধ্রুবক-সময় তুলনা ব্যবহার করুন।
const crypto = require('crypto');
function verifySignature(payload, signature, secret) {
const expected = crypto.createHmac('sha256', secret).update(payload).digest('hex');
return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
}
// আপনার ওয়েবহুক এন্ডপয়েন্টে:
app.post('/webhook', (req, res) => {
const signature = req.headers['x-signature'];
const payload = req.rawBody; // কাঁচা বডি স্ট্রিং হিসেবে
if (!verifySignature(payload, signature, 'your-secret-key')) {
return res.status(401).send('Invalid signature');
}
// ইভেন্ট প্রসেস করুন
res.status(200).send('OK');
});
দ্রষ্টব্য: ম্যান-ইন-দ্য-মিডল আক্রমণ প্রতিরোধ করতে সর্বদা HTTPS ব্যবহার করুন। এছাড়াও, রিপ্লে আক্রমণ প্রতিরোধ করতে সাইনড পেলোডে একটি টাইমস্ট্যাম্প অন্তর্ভুক্ত করার কথা বিবেচনা করুন।
এক্সপোনেনশিয়াল ব্যাকঅফ সহ রিট্রাই প্রয়োগ করা
একটি নির্ভরযোগ্য প্রাপক থাকা সত্ত্বেও, নেটওয়ার্ক সমস্যা বা সাময়িক বিভ্রাট ওয়েবহুক ডেলিভারি ব্যর্থ করতে পারে। একটি শক্তিশালী প্রেরক ব্যর্থ ডেলিভারি রিট্রাই করা উচিত। তবে, সাধারণ রিট্রাই প্রাপককে অভিভূত করতে পারে বা ডুপ্লিকেট প্রসেসিং ঘটাতে পারে। সমাধান: জিটার এবং সর্বোচ্চ রিট্রাই সীমা সহ এক্সপোনেনশিয়াল ব্যাকঅফ।
রিট্রাই কৌশল
- ব্যর্থতায় রিট্রাই: প্রাপক নন-2xx স্ট্যাটাস কোড ফেরত দিলে বা টাইমআউট হলে রিট্রাই করুন।
- এক্সপোনেনশিয়াল ব্যাকঅফ: রিট্রাইয়ের মধ্যে বিলম্ব এক্সপোনেনশিয়ালভাবে বাড়ান (যেমন, ১ সেকেন্ড, ২ সেকেন্ড, ৪ সেকেন্ড, ৮ সেকেন্ড...)।
- জিটার: থান্ডারিং হার্ড সমস্যা এড়াতে বিলম্বে র্যান্ডম বৈচিত্র্য যোগ করুন।
- সর্বোচ্চ প্রচেষ্টা: একটি সীমা নির্ধারণ করুন (যেমন, ৫টি রিট্রাই) এবং তারপর ওয়েবহুকটি ব্যর্থ হিসেবে চিহ্নিত করুন (সম্ভবত একজন অ্যাডমিনকে সতর্ক করুন)।
উদাহরণ: Node.js-এ রিট্রাই লজিক
async function deliverWebhook(url, payload, secret, maxRetries = 5) {
const signature = signPayload(payload, secret);
let attempt = 0;
while (attempt < maxRetries) {
try {
const response = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-Signature': signature },
body: payload,
});
if (response.ok) return;
throw new Error(`HTTP ${response.status}`);
} catch (error) {
attempt++;
if (attempt >= maxRetries) throw error;
const delay = Math.min(1000 * 2 ** attempt + Math.random() * 1000, 30000);
await new Promise(resolve => setTimeout(resolve, delay));
}
}
}
এই ফাংশনটি এক্সপোনেনশিয়াল ব্যাকঅফ এবং জিটার সহ সর্বোচ্চ ৫ বার রিট্রাই করে, বিলম্ব ৩০ সেকেন্ডে সীমাবদ্ধ রাখে। আপনার প্রয়োজন অনুযায়ী প্যারামিটার সামঞ্জস্য করুন।
আইডেম্পোটেন্স নিশ্চিত করা
রিট্রাই ডুপ্লিকেট ডেলিভারি ঘটাতে পারে, তাই আপনার ওয়েবহুক হ্যান্ডলার অবশ্যই আইডেম্পোটেন্ট হতে হবে। পেলোডে একটি অনন্য ইভেন্ট আইডি অন্তর্ভুক্ত করুন এবং প্রাপক প্রসেস করা আইডিগুলি ট্র্যাক করে দ্বিগুণ প্রসেসিং এড়াতে পারে।
// প্রাপকের দিকে:
const processedEvents = new Set();
app.post('/webhook', (req, res) => {
const { id } = req.body;
if (processedEvents.has(id)) {
return res.status(200).send('Already processed');
}
// ইভেন্ট প্রসেস করুন
processedEvents.add(id);
res.status(200).send('OK');
});
প্রোডাকশনে, রিস্টার্ট জুড়ে প্রসেস করা আইডি ট্র্যাক করতে একটি স্থায়ী স্টোর (যেমন, Redis বা ডেটাবেস) ব্যবহার করুন।
তুলনা: সাইনড বনাম আনসাইনড ওয়েবহুকস
| দিক | আনসাইনড | সাইনড (HMAC) |
|---|---|---|
| নিরাপত্তা | যে কেউ অনুরোধ জাল করতে পারে | শুধুমাত্র সিক্রেটের ধারক বৈধ সিগনেচার তৈরি করতে পারে |
| অখণ্ডতা | পেলোডে হস্তক্ষেপ করা যায় | হস্তক্ষেপ সিগনেচারকে অবৈধ করে |
| জটিলতা | কম | মাঝারি (কী ম্যানেজমেন্ট, যাচাইকরণ) |
| ব্যবহারের ক্ষেত্র | অভ্যন্তরীণ, বিশ্বস্ত নেটওয়ার্ক | যেকোনো পাবলিক ওয়েবহুক |
সচরাচর জিজ্ঞাসা
ওয়েবহুক সিগনেচার কী?
একটি ওয়েবহুক সিগনেচার হলো পেলোডের একটি ক্রিপ্টোগ্রাফিক হ্যাশ (সাধারণত HMAC), যা একটি শেয়ার্ড সিক্রেট দিয়ে তৈরি। এটি প্রাপককে যাচাই করতে দেয় যে অনুরোধটি প্রত্যাশিত প্রেরকের কাছ থেকে এসেছে এবং পেলোড পরিবর্তন করা হয়নি।
একটি ব্যর্থ ওয়েবহুক কতবার রিট্রাই করা উচিত?
কোনো নির্দিষ্ট সংখ্যা নেই, তবে সাধারণ অনুশীলন হলো এক্সপোনেনশিয়াল ব্যাকঅফ সহ ৩ থেকে ৫ বার রিট্রাই। এর পরে, ডেলিভারি ব্যর্থ হিসেবে চিহ্নিত করুন এবং আপনার দলকে সতর্ক করুন। ইভেন্টের গুরুত্ব বিবেচনা করুন: পেমেন্ট বিজ্ঞপ্তিগুলি অ-সমালোচনামূলক আপডেটের চেয়ে বেশি রিট্রাইয়ের প্রয়োজন হতে পারে।
HTTPS ছাড়া ওয়েবহুক ব্যবহার করা যায়?
প্রোডাকশনে সাধারণ HTTP-এর মাধ্যমে ওয়েবহুক কখনই ব্যবহার করা উচিত নয়। HTTPS ট্রানজিটে পেলোড এনক্রিপ্ট করে, ইভসড্রপিং এবং ম্যান-ইন-দ্য-মিডল আক্রমণ প্রতিরোধ করে। সিগনেচার থাকা সত্ত্বেও, HTTP সংবেদনশীল ডেটা প্রকাশ করে।
আপনার ওয়েবহুক পেলোড পরীক্ষা করতে প্রস্তুত? পাঠানোর বা ডিবাগ করার আগে JSON পেলোড সুন্দরভাবে প্রিন্ট এবং যাচাই করতে আমাদের JSON ফরম্যাটার ব্যবহার করুন।