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

Backend2026-11-08TryQuickToolBox

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

ওয়েবহুক কী?

ওয়েবহুক হলো একটি রিভার্স API: আপনার অ্যাপ্লিকেশন কোনো সার্ভিস থেকে আপডেটের জন্য পোলিং করার বদলে, সার্ভিসটি HTTP POST এর মাধ্যমে আপনার এন্ডপয়েন্টে ইভেন্ট পুশ করে। এটি দক্ষ এবং প্রায় রিয়েল-টাইম। সাধারণ ব্যবহারের মধ্যে রয়েছে পেমেন্ট নোটিফিকেশন, CI/CD ট্রিগার এবং চ্যাট ইন্টিগ্রেশন।

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

সাইনড পেলোড দিয়ে ওয়েবহুক সুরক্ষিত করা

যে কেউ আপনার এন্ডপয়েন্টে HTTP রিকোয়েস্ট পাঠাতে পারে। যাচাই ছাড়া, আক্রমণকারীরা ইভেন্ট জাল করতে পারে, যার ফলে প্রতারণা বা ডেটা বিকৃতি ঘটতে পারে। স্ট্যান্ডার্ড সমাধান হলো একটি শেয়ার্ড সিক্রেট দিয়ে পেলোড সাইন করা।

এইচএমএসি সিগনেচার কীভাবে কাজ করে

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

ফ্লাস্ক ব্যবহার করে পাইথনে একটি ন্যূনতম উদাহরণ:

import hmac
import hashlib
from flask import Flask, request, abort

app = Flask(__name__)
SECRET = b'your_shared_secret'

@app.route('/webhook', methods=['POST'])
def webhook():
    signature = request.headers.get('X-Signature')
    if not signature:
        abort(400, 'Missing signature')
    body = request.get_data()
    expected = hmac.new(SECRET, body, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(expected, signature):
        abort(401, 'Invalid signature')
    # Process the event
    return '', 200

টাইমিং অ্যাটাক প্রতিরোধ করতে সর্বদা ধ্রুবক-সময় তুলনার জন্য hmac.compare_digest ব্যবহার করুন। এছাড়াও, অপ্রয়োজনীয় প্রসেসিং এড়াতে JSON বডি পার্স করার আগে সিগনেচার যাচাই করুন।

সিগনেচারের জন্য সেরা অনুশীলন

রিট্রাই দিয়ে ব্যর্থতা সামলানো

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

প্রোভাইডারদের ব্যবহৃত রিট্রাই কৌশল

বেশিরভাগ প্রোভাইডার এক্সপোনেনশিয়াল ব্যাকঅফের সাথে রিট্রাই করে: যেমন, অবিলম্বে, তারপর ১ মিনিট, ৫ মিনিট, ৩০ মিনিট পরে, ইত্যাদি, সর্বোচ্চ সংখ্যক প্রচেষ্টা পর্যন্ত (প্রায়শই ৫–১০)। কিছু প্রোভাইডার আপনাকে রিট্রাই শিডিউল কনফিগার করার অনুমতি দেয়। সঠিক আচরণ পরিবর্তিত হয়, তাই প্রোভাইডারের ডকুমেন্টেশন পড়ুন।

রিট্রাইয়ের জন্য আপনার এন্ডপয়েন্ট ডিজাইন করা

আপনার এন্ডপয়েন্টের উচিত:

পাইথনে আইডেম্পোটেন্সি চেকের উদাহরণ:

processed_events = set()  # In production, use a database or cache

@app.route('/webhook', methods=['POST'])
def webhook():
    # ... signature verification ...
    event = request.json
    event_id = event['id']
    if event_id in processed_events:
        return '', 200  # Already processed
    # Process event
    processed_events.add(event_id)
    return '', 200

আপনার ওয়েবহুক বাস্তবায়ন পরীক্ষা করা

লাইভ হওয়ার আগে, আপনার এন্ডপয়েন্ট পুঙ্খানুপুঙ্খভাবে পরীক্ষা করুন:

  1. সাইনড রিকোয়েস্ট সিমুলেট করুন: ইউনিট টেস্ট লিখুন যা বৈধ এবং অবৈধ সিগনেচার তৈরি করে।
  2. রিট্রাই পরিস্থিতি পরীক্ষা করুন: ব্যর্থতা সিমুলেট করুন এবং নিশ্চিত করুন যে আপনার এন্ডপয়েন্ট ডুপ্লিকেটগুলি সামলায়।
  3. প্রোভাইডার টুল ব্যবহার করুন: অনেক প্রোভাইডার টেস্ট ইভেন্ট পাঠানোর জন্য একটি CLI বা ড্যাশবোর্ড অফার করে।
  4. মনিটর এবং লগ করুন: ইনকামিং ইভেন্ট লগ করুন (সংবেদনশীল ডেটা ছাড়া) এবং সিগনেচার ব্যর্থতা বা উচ্চ ত্রুটির হারের জন্য সতর্কতা সেট আপ করুন।

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

দিকপোলিংওয়েবহুক
লেটেন্সিব্যবধানের উপর নির্ভর করে (যেমন, মিনিট)প্রায় রিয়েল-টাইম
সার্ভার লোডউচ্চ (ঘন ঘন রিকোয়েস্ট)কম (শুধুমাত্র ইভেন্টে)
জটিলতাবাস্তবায়ন করা সহজসিগনেচার যাচাইকরণ এবং রিট্রাই হ্যান্ডলিং প্রয়োজন
নির্ভরযোগ্যতাআপনি রিট্রাই নিয়ন্ত্রণ করেনপ্রোভাইডার রিট্রাই নিয়ন্ত্রণ করে; আপনাকে ডুপ্লিকেট সামলাতে হবে

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

আমি কীভাবে একটি ওয়েবহুক সিগনেচার যাচাই করব?

শেয়ার্ড সিক্রেট ব্যবহার করে কাঁচা রিকোয়েস্ট বডির HMAC গণনা করুন এবং ধ্রুবক-সময় তুলনা ফাংশন ব্যবহার করে সিগনেচার হেডারের সাথে তুলনা করুন। পেলোড প্রসেস করার আগে সর্বদা যাচাই করুন।

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

আপনি ইভেন্টটি গ্রহণ এবং প্রসেসিংয়ের জন্য কিউ করার সাথে সাথে একটি 2xx স্ট্যাটাস কোড (যেমন, 200 OK) ফেরত দিন। টাইমআউট এড়াতে রিকোয়েস্ট হ্যান্ডলারে দীর্ঘ প্রসেসিং এড়িয়ে চলুন।

আমি কীভাবে ডুপ্লিকেট ওয়েবহুক ডেলিভারি সামলাতে পারি?

প্রসেস করা ইভেন্ট ট্র্যাক করতে ইভেন্ট পেলোড থেকে একটি আইডেম্পোটেন্সি কী (বা একটি অনন্য ইভেন্ট আইডি) ব্যবহার করুন। এই আইডিগুলি একটি ডাটাবেস বা ক্যাশে সংরক্ষণ করুন এবং আইডিটি আগে দেখা হয়ে থাকলে প্রসেসিং এড়িয়ে যান।

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