আপনার অথ প্রোভাইডার থেকে একটি টোকেন পরিদর্শন
Auth0, Firebase, Keycloak, AWS Cognito সবাই লগইনের পর JWT রিটার্ন করে। access_token পেস্ট করে দেখুন আপনার অ্যাপ আসলে কী ক্লেইম পাচ্ছে — ইউজার আইডি কী, কী স্কোপ, কখন মেয়াদ শেষ হয়?
যেকোনো JSON Web Token ডিকোড করে এর হেডার, পেলোড ও সিগনেচার দেখুন — অথবা HS256/384/512 দিয়ে একটি নতুন টোকেন সাইন করুন। HMAC সিগনেচার লোকালি ভেরিফাই হয়। ১০০% আপনার ব্রাউজারে।
যেকোনো JSON Web Token ডিকোড করে এর হেডার, পেলোড ও সিগনেচার দেখুন — অথবা HS256/384/512 দিয়ে একটি নতুন টোকেন সাইন করুন। HMAC সিগনেচার লোকালি ভেরিফাই হয়। ১০০% আপনার ব্রাউজারে।
না। পুরো টুলটি এই পেজের ভেতরে JavaScript। একটি টোকেন পেস্ট করুন, ডিকোড আপনার ব্রাউজারে ঘটে, বাইটগুলি কখনই ট্যাব ছেড়ে যায় না। DevTools → Network খুলে দেখুন — ডিকোড বা ভেরিফাই করার সময় কোনো রিকোয়েস্ট পাঠানো হয় না। এজন্য এটি আসল কাস্টমার বা প্রোডাকশন টোকেন পেস্ট করার জন্য নিরাপদ।
এটি প্রমাণ করে যে টোকেনটি সিক্রেট (HMAC) বা প্রাইভেট কী (RSA/ECDSA) ধারণকারী কেউ সাইন করেছে। এটি পেলোড এনক্রিপ্ট করে না — হেডার ও পেলোড শুধুমাত্র base64url-এনকোডেড JSON, টোকেনধারী যে কেউ সেগুলি পড়তে পারে। সিগনেচার শুধু টেম্পারিং থামায়: পেলোডের একটি বাইট পরিবর্তন করলেই সিগনেচার আর মেলে না।
একটি JWT প্রায়ই ইউজার আইডি, ইমেইল, স্কোপ এবং কখনও কখনও সেশন কুকির সমতুল্য বহন করে — ঠিক সেই ডেটা যা আপনাকে একজন অপরিচিতের সার্ভারে পেস্ট করা উচিত নয়। iKit-এর ডিকোডার আপনার ব্রাউজার ট্যাবে ইতিমধ্যে লোডকৃত JavaScript হিসেবে চলে। DevTools → Network-এ যাচাইযোগ্য: ডিকোড বা ভেরিফাইয়ের সময় কোনো fetch নেই, কোনো XHR নেই, কোনো beacon নেই।
HS256/384/512 টোকেনের জন্য, সিগনেচার লোকালি ভেরিফাই করতে সাইনিং সিক্রেট লিখুন। RS256/ES256 (RSA/ECDSA)-এর জন্য সার্ভার-সাইড লাইব্রেরি ব্যবহার করুন — পাবলিক-কী ভেরিফিকেশনের জন্য PEM ফাইল প্রয়োজন যা আমরা এখানে গ্রহণ করি না।
HS256-এর জন্য প্রকৃত ক্রিপ্টোগ্রাফিক শক্তির জন্য কমপক্ষে ৩২ বাইট (২৫৬ বিট) প্রয়োজন। টেস্টিংয়ের জন্য যেকোনো কিছু কাজ করে, কিন্তু প্রোডাকশনে দীর্ঘ র্যান্ডম সিক্রেট ব্যবহার করা উচিত।
JWT ডিবাগ করার দ্রুততম উপায় — কোনো আপলোড নেই, কোনো সাইনআপ নেই, আপনার ও আপনার টোকেনের মাঝে কোনো তৃতীয় পক্ষ নেই।
একটি JWT পেস্ট করুন, ডিকোডেড হেডার, পেলোড ও সিগনেচার পাশাপাশি দেখুন। স্ট্যান্ডার্ড ক্লেইম (iss, sub, aud, exp, iat) টাইমস্ট্যাম্প ও লেবেল করা থাকে।
HS256/384/512 টোকেনের জন্য, ব্রাউজারের Web Crypto API ব্যবহার করে সিগনেচার ভেরিফাই করতে সিক্রেট লিখুন। সিক্রেট কখনই আপনার ট্যাব ছেড়ে যায় না।
Encode মোডে যান, হেডার ও পেলোড JSON হিসেবে এডিট করুন, অ্যালগরিদম বাছুন, একটি সিক্রেট লিখুন এবং তাৎক্ষণিকভাবে একটি সাইনড টোকেন পান।
JWT পেলোডে ইউজার আইডি, ইমেইল, কখনও কখনও স্কোপ থাকে — কখনই সেগুলি কোনো সার্ভার টুলে পেস্ট করবেন না। iKit-এর ডিকোডার আপনার ব্রাউজারে JavaScript হিসেবে চলে। DevTools → Network-এ যাচাইযোগ্য।
exp, nbf, iat-এর মতো স্ট্যান্ডার্ড ক্লেইম মানুষ-পঠনযোগ্য তারিখ এবং স্পষ্ট EXPIRED / valid ব্যাজ সহ হাইলাইট করা হয় যাতে এক নজরেই বুঝতে পারেন টোকেনটি এখনও ভালো কিনা।
ব্রাউজারের নেটিভ Web Crypto API ও JSON পার্সারের উপর তৈরি — OpenSSL, libjwt, jose-এর মতোই একই অ্যালগরিদম। আচরণ প্রতিটি আধুনিক JWT লাইব্রেরির সাথে মেলে।
একটি JWT হল ডট দ্বারা পৃথক তিনটি base64url-এনকোডেড JSON সেগমেন্ট — ব্যাস এটুকুই।
একটি JWT দেখতে aaa.bbb.ccc-এর মতো। আমরা দুটি লিটারাল ডটে ভাগ করি, এনকোডেড হেডার, পেলোড ও সিগনেচার পাই। যদি ঠিক তিনটি অংশ না পাই, টোকেনটি ত্রুটিপূর্ণ।
হেডার ও পেলোড base64url-এনকোডেড UTF-8 JSON। Base64URL = Base64 যেখানে +//=-এর পরিবর্তে -/_ এবং কোনো প্যাডিং নেই। ক্যারেক্টার ফিরিয়ে এনে আমরা atob করি, তারপর ফলাফল স্ট্রিংকে JSON.parse করি।
হেডার আমাদের অ্যালগরিদম (alg: HS256, RS256, ইত্যাদি) এবং টাইপ জানায়। পেলোডে ক্লেইম থাকে — স্ট্যান্ডার্ডগুলি (iss, sub, aud, exp, iat, nbf, jti) এবং যেকোনো কাস্টম ফিল্ড। আমরা প্রতিটিকে একটি লেবেলযুক্ত সেকশনে দেখাই।
HS256/384/512-এর জন্য, আপনি যে সিক্রেট লিখেছেন তা ব্যবহার করে আমরা header.payload-এর HMAC পুনর্গণনা করি এবং তৃতীয় সেগমেন্টের সিগনেচারের সাথে তুলনা করি। base64url-এনকোডেড HMAC(SHA-256, secret, signing_input)-এর মতো। মিল = সিগনেচার বৈধ।
প্রকৃত পরিস্থিতি যেখানে আপনি একটি JWT ডিকোডারের কাছে পৌঁছাবেন।
Auth0, Firebase, Keycloak, AWS Cognito সবাই লগইনের পর JWT রিটার্ন করে। access_token পেস্ট করে দেখুন আপনার অ্যাপ আসলে কী ক্লেইম পাচ্ছে — ইউজার আইডি কী, কী স্কোপ, কখন মেয়াদ শেষ হয়?
API আপনার রিকোয়েস্ট প্রত্যাখ্যান করছে? টোকেন ডিকোড করে চেক করুন: এর মেয়াদ কি শেষ (exp অতীতে)? অডিয়েন্স ক্লেইম (aud) কি API যা প্রত্যাশা করে? ইস্যুকারী (iss) কি সঠিক টেন্যান্ট?
Stripe, GitHub Apps, Slack JWT হিসেবে সাইন করা ওয়েবহুক পেলোড পাঠায়। একটি গ্রহণ করার পর, এটিকে শেয়ারড সিক্রেটসহ Decode মোডে পেস্ট করে নিশ্চিত করুন রিকোয়েস্টটি আসলেই তাদের কাছ থেকে এসেছে।
একটি ইন্টিগ্রেশন টেস্টের জন্য একটি নতুন সাইনড JWT প্রয়োজন? Encode মোডে যান, পেলোড এডিট করুন (কাস্টম ইউজার আইডি, কাস্টম মেয়াদ), HS256 + আপনার টেস্ট সিক্রেট বাছুন, মিলিসেকেন্ডে একটি টোকেন পান। কোনো ব্যাকএন্ড রাউন্ড-ট্রিপ নেই।
একটি JWT প্রায়ই ইউজার আইডি, ইমেইল, স্কোপ এবং কখনও কখনও সেশন কুকির সমতুল্য বহন করে — ঠিক সেই ডেটা যা আপনাকে একজন অপরিচিতের সার্ভারে পেস্ট করা উচিত নয়। iKit-এর ডিকোডার আপনার ব্রাউজার ট্যাবে ইতিমধ্যে লোডকৃত JavaScript হিসেবে চলে। DevTools → Network-এ যাচাইযোগ্য: ডিকোড বা ভেরিফাইয়ের সময় কোনো fetch নেই, কোনো XHR নেই, কোনো beacon নেই।
iKit ব্লগ থেকে গভীর টিউটোরিয়াল এবং টুল তুলনা।
JWT segments are base64url-encoded JSON — understand the encoding before you debug a token.
JWT signatures are HMAC-SHA hashes — the same family of cryptographic hashes used to verify file integrity.
না। পুরো টুলটি এই পেজের ভেতরে JavaScript। একটি টোকেন পেস্ট করুন, ডিকোড আপনার ব্রাউজারে ঘটে, বাইটগুলি কখনই ট্যাব ছেড়ে যায় না। DevTools → Network খুলে দেখুন — ডিকোড বা ভেরিফাই করার সময় কোনো রিকোয়েস্ট পাঠানো হয় না। এজন্য এটি আসল কাস্টমার বা প্রোডাকশন টোকেন পেস্ট করার জন্য নিরাপদ।
এটি প্রমাণ করে যে টোকেনটি সিক্রেট (HMAC) বা প্রাইভেট কী (RSA/ECDSA) ধারণকারী কেউ সাইন করেছে। এটি পেলোড এনক্রিপ্ট করে না — হেডার ও পেলোড শুধুমাত্র base64url-এনকোডেড JSON, টোকেনধারী যে কেউ সেগুলি পড়তে পারে। সিগনেচার শুধু টেম্পারিং থামায়: পেলোডের একটি বাইট পরিবর্তন করলেই সিগনেচার আর মেলে না।
তিনটি সাধারণ কারণ: (১) ভুল সিক্রেট — JWT সিক্রেট কেস-সেন্সিটিভ এবং যেকোনো হোয়াইটস্পেস অমিল ভেরিফিকেশন ভেঙে দেয়। (২) অ্যালগরিদম মিল না হওয়া — হেডারে HS256 আছে কিন্তু সিক্রেট মূলত HS512-এ ব্যবহার করা হয়েছিল। (৩) সাইন করার পর টোকেন পরিবর্তিত হয়েছে — এক বাইটও সিগনেচার ভেঙে দেয়। হেডারের alg আপনার প্রত্যাশার সাথে মেলে কিনা চেক করুন।
iKit বর্তমানে শুধুমাত্র HMAC ভেরিফিকেশন (HS256/384/512) সাপোর্ট করে। RS256 ও ES256 পাবলিক-কী ক্রিপ্টোগ্রাফি ব্যবহার করে — ভেরিফিকেশনের জন্য PEM ফরম্যাটে ইস্যুকারীর পাবলিক কী প্রয়োজন, যা আরও জটিল UI। আপাতত, ডিকোডিং কাজ করে (হেডার/পেলোড/সিগনেচার অংশ সঠিকভাবে দেখায়), কিন্তু Verify বোতাম আপনাকে জানাবে এটি অসমর্থিত। RSA/ECDSA ভেরিফিকেশন পরিকল্পিত আছে।
একই ধারণা, ভিন্ন ডিফল্ট। iKit-এর ডিকোডার পুরোপুরি আপনার ব্রাউজারে চলে (jwt.io-ও তাই করে, কিন্তু iKit-এর কোড view-source-এ দেখা যায় এবং আমাদের ডোমেইনে কোনো তৃতীয়-পক্ষ ট্র্যাকার নেই)। আমরা exp ক্লেইমের জন্য একটি স্পষ্ট EXPIRED / valid ব্যাজ, স্ট্রাকচার্ড ক্লেইম নোট (iat / nbf / iss / sub / aud / jti পঠনযোগ্য সারি হিসেবে), এবং একটি copy-everything-decoded বোতাম যোগ করেছি যা বাগ রিপোর্টে পেস্ট করার জন্য সম্পূর্ণ স্ট্রাকচার্ড আউটপুট দেয়।