ওয়েবহুক ব্যাখ্যা: স্বাক্ষরিত পেলোড এবং পুনঃপ্রচেষ্টা

Backend2026-10-09TryQuickToolBox

আপনি সবেমাত্র একটি পেমেন্ট গেটওয়ে ইন্টিগ্রেট করেছেন, এবং এখন পেমেন্ট সফল হলে আপনার ডেটাবেস আপডেট করতে হবে। প্রতি কয়েক সেকেন্ডে API পোলিং করা অপচয় এবং ধীর। ওয়েবহুক ইভেন্টগুলি ঘটার সাথে সাথে আপনার সার্ভারে পুশ করে এটি সমাধান করে। কিন্তু সঠিক নিরাপত্তা এবং নির্ভরযোগ্যতা ছাড়া, ওয়েবহুক বাগ এবং দুর্বলতার উৎস হয়ে উঠতে পারে। এই নিবন্ধটি ব্যাখ্যা করে কীভাবে সঠিকভাবে ওয়েবহুক বাস্তবায়ন করবেন, স্বাক্ষরিত পেলোড এবং পুনঃপ্রচেষ্টার উপর মনোযোগ দিয়ে।

ওয়েবহুক কী?

একটি ওয়েবহুক হল একটি HTTP কলব্যাক: একটি পরিষেবায় একটি ইভেন্ট ঘটে, এবং সেই পরিষেবা আপনার দেওয়া একটি URL-এ একটি HTTP POST অনুরোধ পাঠায়। পেলোডে সাধারণত ইভেন্ট সম্পর্কে JSON ডেটা থাকে। উদাহরণস্বরূপ, যখন একজন গ্রাহক একটি পেমেন্ট সম্পন্ন করেন, স্ট্রাইপ আপনার এন্ডপয়েন্টে একটি charge.succeeded ইভেন্ট পাঠায়।

ওয়েবহুক পুশ-ভিত্তিক, তাই তারা পোলিংয়ের তুলনায় লেটেন্সি এবং সার্ভার লোড কমায়। তবে, তারা চ্যালেঞ্জ নিয়ে আসে: আপনি কীভাবে জানবেন যে অনুরোধটি আসল? ইভেন্টটি ঘটার সময় আপনার সার্ভার ডাউন থাকলে কী হবে?

স্বাক্ষরিত পেলোড কেন গুরুত্বপূর্ণ

যে কেউ আপনার ওয়েবহুক এন্ডপয়েন্টে একটি HTTP POST পাঠাতে পারে। যাচাইকরণ ছাড়া, একজন আক্রমণকারী ইভেন্ট জাল করতে পারে, যা একটি অর্ডারকে পরিশোধিত হিসাবে চিহ্নিত করার মতো অননুমোদিত ক্রিয়াকলাপের দিকে পরিচালিত করে। স্বাক্ষরিত পেলোড একটি ক্রিপ্টোগ্রাফিক স্বাক্ষর অন্তর্ভুক্ত করে এটি সমাধান করে যা কেবল প্রেরক এবং আপনি তৈরি করতে পারেন।

সবচেয়ে সাধারণ পদ্ধতি হল একটি শেয়ার্ড সিক্রেট সহ HMAC (হ্যাশ-ভিত্তিক মেসেজ অথেন্টিকেশন কোড)। প্রেরক সিক্রেট ব্যবহার করে পেলোডের একটি হ্যাশ গণনা করেন এবং এটি একটি হেডারে অন্তর্ভুক্ত করেন। আপনি হ্যাশটি পুনরায় গণনা করেন এবং তুলনা করেন। যদি তারা মেলে, অনুরোধটি প্রামাণিক।

কীভাবে একটি স্বাক্ষরিত পেলোড যাচাই করবেন

এখানে Node.js এবং Express ব্যবহার করে একটি ধাপে ধাপে পদ্ধতি:

  1. কাঁচা অনুরোধ বডিটি একটি স্ট্রিং হিসাবে পুনরুদ্ধার করুন। যাচাইকরণের আগে এটি JSON হিসাবে পার্স করবেন না, কারণ পার্সিং বাইট সিকোয়েন্স পরিবর্তন করতে পারে।
  2. হেডার থেকে স্বাক্ষরটি বের করুন (যেমন, X-Signature)।
  3. আপনার সিক্রেট এবং কাঁচা বডি ব্যবহার করে HMAC গণনা করুন।
  4. টাইমিং আক্রমণ প্রতিরোধ করতে ধ্রুবক-সময় তুলনা ব্যবহার করে গণনা করা স্বাক্ষরের সাথে প্রাপ্ত স্বাক্ষর তুলনা করুন।
const crypto = require('crypto');

function verifySignature(rawBody, signature, secret) {
  const expected = crypto
    .createHmac('sha256', secret)
    .update(rawBody)
    .digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(expected),
    Buffer.from(signature)
  );
}

app.post('/webhook', express.raw({type: 'application/json'}), (req, res) => {
  const signature = req.headers['x-signature'];
  if (!verifySignature(req.body, signature, process.env.WEBHOOK_SECRET)) {
    return res.status(401).send('Invalid signature');
  }
  const event = JSON.parse(req.body);
  // Process event
  res.status(200).send('OK');
});

সর্বদা একটি শক্তিশালী সিক্রেট ব্যবহার করুন এবং পর্যায়ক্রমে এটি রোটেট করুন। ক্লায়েন্ট-সাইড কোডে এটি কখনই প্রকাশ করবেন না।

ব্যাকঅফ সহ পুনঃপ্রচেষ্টা বাস্তবায়ন

ওয়েবহুক ইন্টারনেটের মাধ্যমে বিতরণ করা হয়, তাই ব্যর্থতা ঘটে। আপনার সার্ভার ডাউন থাকতে পারে, বা নেটওয়ার্ক হোঁচট খেতে পারে। একটি শক্তিশালী ওয়েবহুক সিস্টেম ব্যর্থ ডেলিভারিগুলি এক্সপোনেনশিয়াল ব্যাকঅফের সাথে পুনঃপ্রচেষ্টা করে।

সাধারণত, প্রেরক যদি একটি টাইমআউটের মধ্যে (যেমন, ৫ সেকেন্ড) 2xx প্রতিক্রিয়া না পান তবে পুনঃপ্রচেষ্টা করেন। পুনঃপ্রচেষ্টার সময়সূচী হতে পারে: অবিলম্বে, তারপর ১ মিনিট, ৫ মিনিট, ৩০ মিনিট, ২ ঘন্টা পরে, ইত্যাদি, সর্বাধিক প্রচেষ্টার সংখ্যা পর্যন্ত (যেমন, ৫)।

প্রাপক হিসাবে, টাইমআউট এড়াতে আপনাকে দ্রুত প্রতিক্রিয়া জানাতে হবে। একটি 200 OK দিয়ে প্রাপ্তি স্বীকার করুন এবং ইভেন্টটি অ্যাসিঙ্ক্রোনাসভাবে প্রক্রিয়া করুন।

আইডেম্পোটেন্সি পরিচালনা

যেহেতু পুনঃপ্রচেষ্টা ডুপ্লিকেট ডেলিভারি ঘটাতে পারে, আপনার ইভেন্ট প্রসেসিং আইডেম্পোটেন্ট হতে হবে। পেলোডে একটি অনন্য ইভেন্ট আইডি অন্তর্ভুক্ত করুন এবং প্রক্রিয়াজাত আইডিগুলি সংরক্ষণ করুন। প্রক্রিয়া করার আগে, আইডিটি ইতিমধ্যে পরিচালিত হয়েছে কিনা তা পরীক্ষা করুন।

async function processEvent(event) {
  const { id, type, data } = event;
  if (await db.processedEvents.findOne({ id })) {
    return; // Already processed
  }
  await db.processedEvents.insertOne({ id });
  // Handle event based on type
}

সফলভাবে পরিচালনার পরেই ইভেন্টটি প্রক্রিয়াজাত হিসাবে চিহ্নিত করা নিশ্চিত করতে একটি ডেটাবেস ট্রানজ্যাকশন ব্যবহার করুন।

ওয়েবহুক নিরাপত্তার জন্য সেরা অনুশীলন

তুলনা: পোলিং বনাম ওয়েবহুক

দিকপোলিংওয়েবহুক
লেটেন্সিউচ্চ (ব্যবধান-ভিত্তিক)কম (প্রায় রিয়েল-টাইম)
সার্ভার লোডউচ্চ (ধ্রুবক অনুরোধ)কম (শুধুমাত্র ইভেন্টে)
জটিলতাবাস্তবায়ন করা সহজনিরাপত্তা এবং পুনঃপ্রচেষ্টা প্রয়োজন
নির্ভরযোগ্যতাপোলিং ফ্রিকোয়েন্সির উপর নির্ভর করেপুনঃপ্রচেষ্টা লজিকের উপর নির্ভর করে

সাধারণ জিজ্ঞাসা

আমি কীভাবে স্থানীয়ভাবে ওয়েবহুক পরীক্ষা করব?

ngrok এর মতো একটি টুল ব্যবহার করুন আপনার স্থানীয় সার্ভারকে ইন্টারনেটে প্রকাশ করতে। ওয়েবহুক প্রদানকারীকে আপনার ngrok URL-এ ইভেন্ট পাঠাতে কনফিগার করুন।

ওয়েবহুক পাঠানোর সময় আমার সার্ভার ডাউন থাকলে কী হবে?

প্রেরক ব্যাকঅফ সহ পুনঃপ্রচেষ্টা করবেন। নিশ্চিত করুন যে আপনার সার্ভার উচ্চ উপলব্ধ এবং টাইমআউট এড়াতে দ্রুত প্রতিক্রিয়া জানায়।

আমি HMAC এর পরিবর্তে অ্যাসিমেট্রিক স্বাক্ষর ব্যবহার করতে পারি?

হ্যাঁ, কিছু প্রদানকারী RSA বা ECDSA স্বাক্ষর ব্যবহার করেন। আপনি তাদের পাবলিক কী দিয়ে যাচাই করেন। HMAC সহজ কিন্তু একটি শেয়ার্ড সিক্রেট প্রয়োজন।

ওয়েবহুক পেলোড ডিবাগ করার সময়, পঠনযোগ্যতার জন্য JSON ফরম্যাট করা সহায়ক। আমাদের JSON Formatter ব্যবহার করে ওয়েবহুক পেলোডগুলি তাত্ক্ষণিকভাবে সুন্দরভাবে প্রিন্ট এবং যাচাই করুন।