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

Backend2026-11-04TryQuickToolBox

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

ওয়েবহুক কী?

একটি ওয়েবহুক হল একটি ব্যবহারকারী-সংজ্ঞায়িত HTTP কলব্যাক। যখন উৎস সিস্টেমে একটি ইভেন্ট ঘটে (যেমন, একটি পেমেন্ট সম্পন্ন হয়), তখন এটি আপনার প্রদত্ত URL-এ একটি HTTP POST অনুরোধ পাঠায়। পোলিংয়ের বিপরীতে, যেখানে আপনি বারবার আপডেটের জন্য জিজ্ঞাসা করেন, ওয়েবহুক প্রায় রিয়েল-টাইমে ডেটা আপনার কাছে পুশ করে। এগুলি ইভেন্ট বিজ্ঞপ্তির জন্য ব্যাপকভাবে ব্যবহৃত হয়, যেমন CI/CD ট্রিগার, চ্যাট বার্তা, বা পেমেন্ট স্ট্যাটাস পরিবর্তন।

কেন স্বাক্ষর দিয়ে ওয়েবহুক সুরক্ষিত করবেন?

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

সাইনড পেলোড কীভাবে কাজ করে

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

সঠিক অ্যালগরিদম নির্বাচন

HMAC-SHA256 হল ডি ফ্যাক্টো স্ট্যান্ডার্ড। এটি দ্রুত, সুরক্ষিত এবং সমস্ত প্রধান ভাষায় উপলব্ধ। MD5 বা SHA1 এড়িয়ে চলুন, যা দুর্বল হিসাবে বিবেচিত হয়।

ধাপে ধাপে: একটি সাইনড পেলোড যাচাই করা

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

এখানে Express ব্যবহার করে Node.js-এ একটি উদাহরণ:

const crypto = require('crypto');
const express = require('express');
const app = express();

// Use raw body parser for webhook route
app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
  const signature = req.headers['x-signature'];
  const secret = process.env.WEBHOOK_SECRET;

  const hmac = crypto.createHmac('sha256', secret);
  const digest = hmac.update(req.body).digest('hex');

  if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(digest))) {
    return res.status(401).send('Invalid signature');
  }

  // Process the event
  const event = JSON.parse(req.body);
  // ... handle event

  res.status(200).send('OK');
});

সাধারণ ভুল: যাচাইয়ের আগে একটি JSON বডি পার্সার ব্যবহার করা। Express-এর express.json() বডি পার্স করে, তাই কাঁচা বাইটগুলি হারিয়ে যায়। ওয়েবহুক রুটের জন্য সর্বদা express.raw() ব্যবহার করুন বা কাঁচা বডি আলাদাভাবে ক্যাপচার করুন।

একটি পুনঃপ্রচেষ্টা কৌশল ডিজাইন করা

স্বাক্ষর থাকা সত্ত্বেও, ওয়েবহুক ব্যর্থ হতে পারে: আপনার সার্ভার ডাউন থাকতে পারে, বা অনুরোধ সময়সীমা অতিক্রম করতে পারে। একটি নির্ভরযোগ্য প্রেরক ব্যর্থ ডেলিভারি পুনরায় চেষ্টা করে। প্রাপক হিসাবে, আপনারও পুনঃপ্রচেষ্টাগুলি সুন্দরভাবে পরিচালনা করা উচিত।

প্রেরক-পক্ষের পুনঃপ্রচেষ্টা

যদি আপনি প্রেরক তৈরি করেন, তবে জিটার সহ এক্সপোনেনশিয়াল ব্যাকঅফ প্রয়োগ করুন। উদাহরণস্বরূপ, 1 মিনিট পরে পুনরায় চেষ্টা করুন, তারপর 5 মিনিট, তারপর 30 মিনিট, সর্বোচ্চ সংখ্যক প্রচেষ্টা পর্যন্ত (যেমন, 5)। পেলোডে একটি অনন্য ইভেন্ট আইডি অন্তর্ভুক্ত করুন যাতে প্রাপক ডুপ্লিকেট সরাতে পারে।

প্রাপক-পক্ষের আইডেম্পোটেন্সি

যেহেতু পুনঃপ্রচেষ্টাগুলি ডুপ্লিকেট ডেলিভারি ঘটাতে পারে, আপনার এন্ডপয়েন্টটি আইডেম্পোটেন্ট হতে হবে। প্রসেস করা ইভেন্টগুলি ট্র্যাক করতে ইভেন্ট আইডি ব্যবহার করুন। এটি একটি অনন্য সীমাবদ্ধতা সহ ডেটাবেসে সংরক্ষণ করুন, বা TTL সহ Redis-এর মতো ক্যাশে ব্যবহার করুন। যদি ইভেন্ট আইডি আগে দেখা হয়ে থাকে, তবে পুনরায় প্রসেস না করে অবিলম্বে একটি 200 OK ফেরত দিন।

ডেটাবেস অনন্য সূচক ব্যবহার করে উদাহরণ:

async function handleWebhook(event) {
  try {
    await db.query('INSERT INTO processed_events (event_id) VALUES ($1)', [event.id]);
  } catch (err) {
    if (err.code === '23505') { // unique violation
      return; // already processed
    }
    throw err;
  }
  // process event
}

ওয়েবহুক এন্ডপয়েন্টের জন্য সর্বোত্তম অনুশীলন

তুলনা: সাইনড বনাম আনসাইনড ওয়েবহুক

দিক সাইনড ওয়েবহুক আনসাইনড ওয়েবহুক
নিরাপত্তা উচ্চ – প্রেরক এবং অখণ্ডতা যাচাই করে নিম্ন – যে কেউ অনুরোধ জাল করতে পারে
বাস্তবায়ন জটিলতা মাঝারি – HMAC এবং গোপন ব্যবস্থাপনা প্রয়োজন নিম্ন – শুধু POST গ্রহণ করুন
ব্যবহারের ক্ষেত্র পেমেন্ট, সংবেদনশীল ডেটা অ-সমালোচনামূলক বিজ্ঞপ্তি

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

পাইথনে ওয়েবহুক স্বাক্ষর কীভাবে যাচাই করবেন?

SHA256 সহ hmac মডিউল ব্যবহার করুন। ধ্রুবক-সময়ের তুলনার জন্য hmac.compare_digest ব্যবহার করে গণনা করা ডাইজেস্টটি হেডারের সাথে তুলনা করুন।

যদি আমার ওয়েবহুক এন্ডপয়েন্ট একটি ডুপ্লিকেট ইভেন্ট পায় তবে আমার কী করা উচিত?

প্রসেস করা আইডিগুলির স্টোরের বিরুদ্ধে ইভেন্ট আইডি পরীক্ষা করুন। যদি এটি ডুপ্লিকেট হয়, তবে একটি 200 OK ফেরত দিন এবং প্রসেসিং এড়িয়ে যান। এটি আইডেম্পোটেন্সি নিশ্চিত করে।

একটি ওয়েবহুক প্রেরক কতবার পুনঃপ্রচেষ্টা করা উচিত?

কোনও নির্দিষ্ট সংখ্যা নেই, তবে এক্সপোনেনশিয়াল ব্যাকঅফ সহ 3–5 বার পুনঃপ্রচেষ্টা (যেমন, 1মিনিট, 5মিনিট, 30মিনিট) সাধারণ। এর পরে, ডেলিভারিটি ব্যর্থ হিসাবে চিহ্নিত করুন এবং সতর্কতা দিন।

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