ওয়েবহুকস ব্যাখ্যা: সাইনড পেলোড এবং রিট্রাই স্ট্র্যাটেজি
আপনি একটি API তৈরি করেছেন যা আপনার ব্যবহারকারীদের এন্ডপয়েন্টে ওয়েবহুক পাঠায়। কিন্তু তারপর ক্লাসিক সমস্যাগুলির সম্মুখীন হন: কীভাবে নিশ্চিত করবেন যে পেলোডের সাথে ছेড়াছেড়ি করা হয়নি? এন্ডপয়েন্ট ডাউন থাকলে কী হবে? ডুপ্লিকেট প্রসেসিং কীভাবে প্রতিরোধ করবেন? এই নিবন্ধে, আমরা সাইনড পেলোড এবং শক্তিশালী রিট্রাই স্ট্র্যাটেজি দিয়ে এই চ্যালেঞ্জগুলির মোকাবেলা করব।
কেন ওয়েবহুকের সিগনেচার প্রয়োজন
ওয়েবহুক হল HTTP কলব্যাক যা অন্যান্য সিস্টেমকে ইভেন্ট সম্পর্কে অবহিত করে। যেহেতু এগুলি পাবলিক ইন্টারনেটের মাধ্যমে পাঠানো হয়, তাই এগুলি ইন্টারসেপশন এবং স্পুফিংয়ের জন্য ঝুঁকিপূর্ণ। সিগনেচার ছাড়া, একজন দূষিত অভিনেতা আপনার ব্যবহারকারীদের কাছে জাল ওয়েবহুক পাঠাতে পারে, যা অনিচ্ছাকৃত ক্রিয়া ট্রিগার করে। একটি শেয়ার্ড সিক্রেট দিয়ে পেলোড সাইন করা সত্যতা এবং অখণ্ডতা নিশ্চিত করে।
সাইনড পেলোড কীভাবে কাজ করে
সবচেয়ে সাধারণ পদ্ধতি হল HMAC (হ্যাশ-ভিত্তিক মেসেজ অথেন্টিকেশন কোড) SHA-256 সহ। প্রেরক এবং প্রাপক একটি শেয়ার্ড সিক্রেট কী শেয়ার করেন। প্রেরক পেলোডের (এবং কখনও কখনও একটি টাইমস্ট্যাম্প) উপর একটি সিগনেচার গণনা করেন এবং এটি একটি হেডারে অন্তর্ভুক্ত করেন। প্রাপক সিগনেচারটি পুনরায় গণনা করেন এবং প্রাপ্তটির সাথে তুলনা করেন।
ধাপে ধাপে: একটি পেলোড সাইন করা
- পেলোড তৈরি করুন: আপনার ইভেন্ট ডেটা JSON-এ সিরিয়ালাইজ করুন। সামঞ্জস্যপূর্ণ ফরম্যাটিং নিশ্চিত করুন (যেমন, অতিরিক্ত হোয়াইটস্পেস নেই) কারণ সিগনেচার সঠিক বাইটের উপর গণনা করা হয়।
- একটি টাইমস্ট্যাম্প যোগ করুন: রিপ্লে আক্রমণ প্রতিরোধ করতে পেলোড বা হেডারে একটি ইউনিক্স টাইমস্ট্যাম্প অন্তর্ভুক্ত করুন। প্রাপক কয়েক মিনিটের বেশি পুরানো অনুরোধ প্রত্যাখ্যান করতে পারেন।
- HMAC গণনা করুন: পেলোড স্ট্রিং (বা টাইমস্ট্যাম্প + পেলোড) এর HMAC-SHA256 জেনারেট করতে আপনার সিক্রেট কী ব্যবহার করুন।
- সিগনেচার সংযুক্ত করুন: এটি
X-Signatureএর মতো একটি হেডারে পাঠান।
এখানে পাইথনে একটি উদাহরণ:
import hmac
import hashlib
import json
import time
secret = b'your_shared_secret'
payload = {"event": "user.created", "data": {"id": 123}}
body = json.dumps(payload, separators=(',', ':'))
timestamp = str(int(time.time()))
signed_content = timestamp + '.' + body
signature = hmac.new(secret, signed_content.encode(), hashlib.sha256).hexdigest()
# Send headers: X-Signature: signature, X-Timestamp: timestamp
সিগনেচার যাচাই করা
প্রাপকের প্রান্তে, আপনাকে অবশ্যই:
- হেডার থেকে টাইমস্ট্যাম্প এবং সিগনেচার বের করতে হবে।
- রিপ্লে আক্রমণ প্রতিরোধ করতে টাইমস্ট্যাম্প খুব পুরানো হলে (যেমন, >5 মিনিট) প্রত্যাখ্যান করতে হবে।
- একই পদ্ধতি ব্যবহার করে সিগনেচার পুনরায় গণনা করতে হবে।
- টাইমিং আক্রমণ এড়াতে একটি ধ্রুবক-সময় ফাংশন ব্যবহার করে তুলনা করতে হবে।
Node.js-এ যাচাইয়ের উদাহরণ:
const crypto = require('crypto');
function verifySignature(req, secret) {
const signature = req.headers['x-signature'];
const timestamp = req.headers['x-timestamp'];
if (!signature || !timestamp) return false;
if (Date.now() / 1000 - timestamp > 300) return false; // 5 min
const body = JSON.stringify(req.body);
const signed = timestamp + '.' + body;
const expected = crypto.createHmac('sha256', secret).update(signed).digest('hex');
return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
}
রিট্রাই স্ট্র্যাটেজি ডিজাইন করা
সিগনেচার থাকা সত্ত্বেও, নেটওয়ার্ক সমস্যা, সার্ভার ত্রুটি বা টাইমআউটের কারণে ওয়েবহুক ব্যর্থ হতে পারে। একটি শক্তিশালী রিট্রাই স্ট্র্যাটেজি প্রাপককে অভিভূত না করে ডেলিভারি নিশ্চিত করে।
মূল বিবেচনা
- আইডেম্পোটেন্সি: প্রাপকদের ডুপ্লিকেট ইভেন্টগুলি সুন্দরভাবে পরিচালনা করা উচিত। ডুপ্লিকেট এড়াতে একটি আইডেম্পোটেন্সি কী (যেমন, ইভেন্ট আইডি) ব্যবহার করুন।
- এক্সপোনেন্সিয়াল ব্যাকঅফ: প্রাপককে পুনরুদ্ধার করার সময় দেওয়ার জন্য ক্রমবর্ধমান বিলম্বের পরে পুনরায় চেষ্টা করুন (যেমন, 1s, 5s, 30s, 5m, 30m)।
- সর্বোচ্চ রিট্রাই: একটি সীমা নির্ধারণ করুন (যেমন, 5টি প্রচেষ্টা) এবং তারপর ওয়েবহুকটিকে ব্যর্থ হিসাবে চিহ্নিত করুন, সম্ভবত ব্যবহারকারীকে সতর্ক করুন।
- টাইমআউট: প্রতিটি প্রচেষ্টার জন্য একটি যুক্তিসঙ্গত টাইমআউট সেট করুন (যেমন, 10 সেকেন্ড)।
রিট্রাই প্রয়োগ করা
বেশিরভাগ ওয়েবহুক প্রেরক রিট্রাই শিডিউল করতে একটি কিউ সিস্টেম (যেমন, Redis, RabbitMQ, বা একটি ডাটাবেস) ব্যবহার করেন। এখানে একটি সরলীকৃত প্রবাহ:
- ইভেন্ট ট্রিগার হলে, পেলোড এবং লক্ষ্য URL সহ একটি ওয়েবহুক জব এনকিউ করুন।
- ওয়ার্কার জবটি তুলে নেয় এবং ডেলিভারি চেষ্টা করে।
- যদি প্রতিক্রিয়া স্ট্যাটাস 2xx হয়, সফল হিসাবে চিহ্নিত করুন।
- যদি না হয়, সর্বোচ্চ প্রচেষ্টা পর্যন্ত এক্সপোনেন্সিয়াল ব্যাকঅফ সহ একটি রিট্রাই শিডিউল করুন।
- সর্বোচ্চ প্রচেষ্টার পরে, ব্যর্থ হিসাবে চিহ্নিত করুন এবং অবহিত করুন।
উদাহরণ রিট্রাই সময়সূচী:
| প্রচেষ্টা | বিলম্ব |
|---|---|
| 1 | তাৎক্ষণিক |
| 2 | 1 মিনিট |
| 3 | 5 মিনিট |
| 4 | 30 মিনিট |
| 5 | 2 ঘন্টা |
ওয়েবহুক সিকিউরিটির জন্য সর্বোত্তম অনুশীলন
- HTTPS ব্যবহার করুন: ইভসড্রপিং প্রতিরোধ করতে সর্বদা TLS-এর মাধ্যমে ওয়েবহুক ডেলিভারি করুন।
- সিক্রেট রোটেট করুন: পর্যায়ক্রমে শেয়ার্ড সিক্রেট রোটেট করুন এবং রোটেশনের সময় একাধিক সক্রিয় সিক্রেট সমর্থন করুন।
- URL যাচাই করুন: নিশ্চিত করুন যে ওয়েবহুক URL HTTPS এবং অভ্যন্তরীণ IP-তে নির্দেশ করছে না (SSRF প্রতিরোধ করতে)।
- লগ এবং মনিটর: ডিবাগিং এবং অডিটিংয়ের জন্য ডেলিভারি প্রচেষ্টা এবং ব্যর্থতার লগ রাখুন।
সচরাচর জিজ্ঞাসা
একটি সাইনড ওয়েবহুক পেলোড কী?
একটি সাইনড পেলোডে একটি ক্রিপ্টোগ্রাফিক সিগনেচার (সাধারণত HMAC) থাকে যা প্রাপককে প্রেরকের সত্যতা এবং পেলোডের সাথে ছेড়াছেড়ি হয়নি তা যাচাই করতে দেয়।
একটি ব্যর্থ ওয়েবহুক কতবার পুনরায় চেষ্টা করা উচিত?
কোনও একক উত্তর নেই, তবে একটি সাধারণ পদ্ধতি হল এক্সপোনেন্সিয়াল ব্যাকঅফ সহ 3–5 বার রিট্রাই। ইভেন্টের গুরুত্ব এবং প্রাপকের ক্ষমতা বিবেচনা করুন।
ওয়েবহুক সিগনেচারের জন্য JWT ব্যবহার করতে পারি?
হ্যাঁ, JWT ব্যবহার করা যায়, তবে এটি আরও জটিল। HMAC সহজ এবং বেশিরভাগ ক্ষেত্রে যথেষ্ট। JWT উপযোগী যদি আপনাকে সিগনেচারের মধ্যে দাবি বা মেয়াদ অন্তর্ভুক্ত করতে হয়।
আপনার ওয়েবহুক পেলোড পরীক্ষা করতে প্রস্তুত? পাঠানোর আগে আপনার JSON পেলোড যাচাই এবং সুন্দরভাবে প্রিন্ট করতে আমাদের JSON ফরম্যাটার ব্যবহার করুন।