JWT ডিকোড করুন
একটি JSON Web Token-এর হেডার, ক্লেইম ও মেয়াদ দেখুন। টোকেন একটি কার্যকর ক্রেডেনশিয়াল, তাই এখান থেকে কিছুই কোথাও পাঠানো বা সংরক্ষণ করা হয় না, কখনোই না।
- কখনো সংরক্ষণ করা হয় না
- কোনো লাইন নেই, অপেক্ষা নেই
- সাইনআপ নেই, ওয়াটারমার্ক নেই
আপনার টোকেন কখনো এই পেজের বাইরে যায় না। এটি এখানেই ডিকোড হয়, কোনো সার্ভারে অনুরোধ পাঠানো ছাড়াই — এটা জরুরি, কারণ JWT সাধারণত একটি সক্রিয় ক্রেডেনশিয়াল। পেজ লোড হওয়ার পর Wi-Fi বন্ধ করে দিন, তবুও ডিকোড হবে: কিছুই পাঠানো হয় না।
“Bearer ” প্রিফিক্স থাকলে সমস্যা নেই — এটি উপেক্ষা করা হয়।
যেভাবে কাজ করে
টোকেন পেস্ট করুন
“Bearer ” প্রিফিক্সসহ বা ছাড়া। এটি এই পেজেই থাকে; কোনো রিকোয়েস্ট পাঠানো হয় না।
তিনটি অংশ পড়ুন
হেডার, পেলোড ও সিগনেচার — প্রতিটি ডিকোড ও ফরম্যাট করা। টাইমস্ট্যাম্প আসল তারিখে বদলায়, আর কত সময় বাকি তা জানানো হয়।
সতর্কতাগুলো দেখুন
মেয়াদোত্তীর্ণ টোকেন, মেয়াদ না থাকা, “none” অ্যালগরিদম ও অন্যান্য সমস্যা আলাদা করে দেখানো হয়, সেগুলোর অর্থসহ।
কী যাচাই করা হয়, আর কী শুধু পড়া হয়
দুটি তারিখের তুলনা ছাড়া এই পেজের সবকিছুই শুধু প্রতিলিপি। হেডার ও পেলোড Base64URL থেকে ডিকোড করে দেখানো হয়; সিগনেচার কপি করে বের করা হয় আর কখনো ছোঁয়া হয় না, কারণ এখানে কোনো কি নেই আর কোনো ক্রিপ্টোগ্রাফিই চলে না। পেজ যে দুটি বিচার করে, তা আপনার নিজের ডিভাইসের ঘড়ির সঙ্গে পাটিগণিত — মেয়াদের ক্লেইম বনাম এখন, আর not-before ক্লেইম বনাম এখন। ঘড়ির গরমিলের জন্য কোনো ছাড় রাখা হয় না, যেখানে একই টোকেন যাচাই করা সার্ভার সাধারণত এক-দুই মিনিট ছাড় দেয়। যে ল্যাপটপের ঘড়ি পাঁচ মিনিট এগিয়ে, সেটি একটি সচল টোকেনকে মেয়াদোত্তীর্ণ দেখাবে, অথচ টোকেনটি পুরোপুরি ঠিক।
পার্সিংয়ের দুটি খুঁটিনাটি ঠিক করে আপনি আসলে কী দেখবেন। সময়ের ক্লেইমগুলো পড়া হয় শুধু তখনই, যখন সেগুলো JSON সংখ্যা হিসেবে আসে: যে টোকেনের মেয়াদ "1699999999" স্ট্রিং হিসেবে লেখা, তাকে মেয়াদহীন ধরা হয়, আর সে এমন সতর্কতা পায় যে নিজে থেকে তার মেয়াদ কখনো শেষ হয় না — যা সত্যের ঠিক উল্টো। আর পেলোড পার্স করা হয় ব্রাউজারের নিজস্ব JSON পার্সার দিয়ে, আমাদের JSON টুলগুলোর পেছনের ডিজিট-অক্ষত রাখা পার্সার দিয়ে নয়, তাই subject-এ থাকা snowflake ইউজার আইডির মতো ৬৪-বিট সংখ্যার ক্লেইম শেষের কয়েকটি ডিজিট রাউন্ড করে দেখানো হয়। ঠিক এই কারণেই JWT-এর আইডেন্টিফায়ার সাধারণত স্ট্রিং হয়; যখন তা নয়, তখন ক্লেইম টেবিল থেকে না পড়ে কাঁচা পেলোড থেকে পড়ুন।
পাঁচ অংশের টোকেনকে এনক্রিপ্ট করা JWE হিসেবে প্রত্যাখ্যান করা হয়, আর এই সিদ্ধান্ত হেডার পড়ে নয়, শুধু অংশের সংখ্যা দেখে নেওয়া হয় — বাস্তবে এটা ঠিক, তবে জেনে রাখা ভালো যে এটি একটি শর্টকাট। তিন অংশ নয় এমন যেকোনো কিছু সরাসরি প্রত্যাখ্যাত হয়, যেমন হয় সেই পেলোড যা অবজেক্ট নয়, JSON অ্যারে বা খালি স্ট্রিং হিসেবে ডিকোড হয়। সতর্কতা দেখানো হয় “none” অ্যালগরিদমের জন্য আর HS পরিবারের জন্য, যেখানে সাইনিং কি পাবলিক নয়, একটি শেয়ার করা সিক্রেট। RS, ES বা PS দিয়ে সাইন করা টোকেনে কোনো সতর্কতা আসে না, তাই এই পেজের নীরবতা মানে পরিচিত কোনো খারাপ গঠন নেই, অনুমোদন নয়।
অন্য কিছু দরকার হলে
এখানে কিছুই সংরক্ষণ করা হয় না, আর এই পেজ থাকার যৌক্তিকতা কেবল এটুকুই — তবু এটা গড়ে তোলার মতো অভ্যাস নয়। গোপনীয়তার দাবি পড়ে যাচাই করা যায় না: পেজ লোড হওয়ার পর সংযোগ বিচ্ছিন্ন করে দেখুন ডিকোডার কাজ চালিয়ে যায় কি না, পেছনে সার্ভার থাকা কোনো টুল ঠিক এটাই পারে না। আর এমন কোথাও পেস্ট করা কোনো টোকেন যদি এখনো বৈধ থাকে যা আপনি যাচাই করতে পারেন না, সেটি নিয়ে যুক্তি না খুঁজে রোটেট করুন। রোটেট করা এক মিনিটের কাজ। বিকল্প হলো এমন একটি ক্রেডেনশিয়াল নিয়ে নিজের সঙ্গে দীর্ঘ তর্ক, যা এখনো দরজা খুলে দেয়। ট্যাবের বদলে কম্পিউটারে টোকেন পড়তে পেলোড এক লাইনের শেল কমান্ড: ডট দিয়ে আলাদা করা দ্বিতীয় অংশটি cut করুন, base64 -d করুন, আর jq দিয়ে পাইপ করুন।
প্রশ্ন যখন টোকেন কী বলছে তা নয়, বরং টোকেনটি আসল কি না, তখন এই পেজ গঠনগতভাবেই ভুল জায়গা, আর অন্য প্রতিটি অনলাইন ডিকোডারও তাই। ভেরিফিকেশনের জায়গা সেখানেই, যেখানে কি আগে থেকে আছে — আপনার সার্ভারে আপনার ভাষার নিজস্ব JWT লাইব্রেরি, ইস্যুকারীর প্রকাশিত JWKS-এর বিপরীতে যাচাই করা। এটা কয়েক লাইনের কাজ, একমাত্র অর্থবহ উত্তর এটাই, আর যে সাইট আপনার হয়ে এটা করে দিতে চায়, সে আসলে সেই একটিমাত্র সিক্রেট চাইছে যা কখনো কোনো ওয়েবসাইটকে দেওয়া উচিত নয়।
সাধারণ প্রশ্নোত্তর
আমার টোকেন কি কোথাও পাঠানো হয়?
না — আর এই পেজের জন্য এটা কোনো ফিচার নয়, এটাই পুরো উদ্দেশ্য। একটি JWT সাধারণত সচল ক্রেডেনশিয়াল: মেয়াদ শেষ না হওয়া পর্যন্ত যার হাতে এটি থাকে, সে আপনার হয়ে কাজ করতে পারে। এমন অনলাইন ডিকোডারে এটি পেস্ট করা, যা সার্ভারে পাঠায়, মানে একটি কার্যকর চাবি তুলে দেওয়া, আর লগ না রাখার কোনো প্রতিশ্রুতিই তা ফেরাতে পারে না। এই ডিকোডার হলো আপনার সামনের পেজেই থাকা সাধারণ JavaScript। কিছুই সংরক্ষণ করা হয় না, কিছুই লগ করা হয় না, কোনো রিকোয়েস্ট পাঠানো হয় না। পেজ লোড হওয়ার পর Wi-Fi বন্ধ করে দিন, এটি হুবহু একইভাবে কাজ করবে। আমাদের কথায় বিশ্বাস না করে নিজেই গোপনীয়তার দাবিটি যাচাই করার এটাই সবচেয়ে সহজ উপায়।
এটি কি সিগনেচার ভেরিফাই করে?
না, আর আপনার সাইনিং কি ছাড়া কোনো অনলাইন ডিকোডার সৎভাবে তা পারেও না। ডিকোড করা আর ভেরিফাই করা সম্পূর্ণ আলাদা কাজ। ডিকোড করা মানে শুধু টোকেনের Base64 খুলে ফেলা — যে কেউ যেকোনো টোকেনে তা করতে পারে, আর টোকেনটি আসল কি না সে ব্যাপারে এটি কিছুই প্রমাণ করে না। ভেরিফাই করা মানে যে সিক্রেট বা পাবলিক কি দিয়ে সাইন করা হয়েছিল, তা দিয়ে সিগনেচারটি আবার হিসাব করা, আর সেই কি কখনোই কোনো ওয়েবসাইটে পেস্ট করা উচিত নয়। এখানে যা দেখছেন, তা টোকেনের দাবি। সেই দাবি বিশ্বাসযোগ্য কি না, এর উত্তর দিতে পারে শুধু কি-ধারী আপনার সার্ভার।
আমি কাউকে JWT পাঠালে সে কি তা পড়তে পারে?
হ্যাঁ — পুরোটাই, আর এখানেই মানুষ ধরা খায়। JWT সাইন করা, এনক্রিপ্ট করা নয়। হেডার ও পেলোড Base64, যা এমন একটি এনকোডিং যাতে কোনো গোপন কিছু নেই, তাই টোকেনটি যে-ই মাঝপথে ধরুক, ভেতরের প্রতিটি ক্লেইম পড়তে পারবে। সিগনেচার তাদের টোকেন বদলানো থেকে আটকায়; পড়া থেকে আটকাতে কিছুই করে না। JWT পেলোডে কখনো গোপনীয় কিছু রাখবেন না: পাসওয়ার্ড নয়, কার্ড নম্বর নয়, এমন কোনো ব্যক্তিগত তথ্য নয় যা পোস্টকার্ডে লিখতেন না।
“none” অ্যালগরিদম সতর্কতার মানে কী?
মানে টোকেনটি বলছে সে সাইন করা নয়, আর এই পেজ যা জানায় তার মধ্যে এটি সবচেয়ে গুরুতরগুলোর একটি। `alg: none` একটি নথিভুক্ত অথেন্টিকেশন বাইপাস: আক্রমণকারী একটি আসল টোকেন নেয়, পেলোড বদলে লেখে যে সে অ্যাডমিনিস্ট্রেটর, অ্যালগরিদম “none” করে দেয়, সিগনেচার সরিয়ে ফেলে, আর যে লাইব্রেরি হেডারে বিশ্বাস করে সে তা গ্রহণ করে। এখন প্রতিটি নির্ভরযোগ্য JWT লাইব্রেরি ডিফল্টভাবে এটি আটকায়, কিন্তু `alg`-এ বিশ্বাস করা ইমপ্লিমেন্টেশন এখনো আছে। `alg: none` নিয়ে আসা টোকেনকে উল্টোটা প্রমাণ না হওয়া পর্যন্ত আক্রমণ হিসেবেই ধরা উচিত।
মেয়াদ কীভাবে পড়ব?
সেটা আপনার জন্য করে দেওয়া হয়। `exp`, `iat` ও `nbf` হলো Unix টাইমস্ট্যাম্প — ১৯৭০ সাল থেকে সেকেন্ডের সংখ্যা — যা কাঁচা সংখ্যা হিসেবে পড়া যায় না। প্রতিটি আপনার নিজের টাইমজোনে আসল তারিখ হিসেবে দেখানো হয়, কতক্ষণ আগে বা কতক্ষণ পরে তা-সহ, আর মেয়াদোত্তীর্ণ টোকেন হলে আপনাকে হিসাব কষতে না দিয়ে স্পষ্ট করে বলা হয়। যে টোকেনে `exp` একেবারেই নেই, সেটিও চিহ্নিত করা হয়: যে JWT-এর মেয়াদ কখনো শেষ হয় না, তা মেয়াদ দিয়ে বাতিল করা যায় না, আর সাইনিং কি যতদিন বৈধ, ততদিন বৈধ থাকে।
আমার টোকেনে তিনটি নয়, পাঁচটি অংশ
তাহলে এটি JWE — শুধু সাইন করা নয়, এনক্রিপ্ট করা — আর ডিক্রিপশন কি ছাড়া এর ভেতরের কিছু সত্যিই পড়া যায় না। পেজ এর গঠন চিনে ফেলে এবং অর্থহীন কিছু না দেখিয়ে আপনাকে তা জানায়। পাঁচটি অংশ মানে পেলোডটি সত্যিকারের সাইফারটেক্সট; ডিকোড করার কিছু নেই।
স্ট্যান্ডার্ড ক্লেইমগুলো কী?
নিবন্ধিত ক্লেইমগুলো হলো: `iss` কে ইস্যু করেছে, `sub` কার সম্পর্কে (সাধারণত একটি ইউজার আইডি), `aud` কার জন্য, `exp` কখন মেয়াদ শেষ, `nbf` কখনের আগে বৈধ নয়, `iat` কখন ইস্যু হয়েছে, আর `jti` টোকেনের একটি অনন্য আইডি। বাকি সবকিছু সিস্টেমটি যে বানিয়েছে তার নিজস্ব। আউটপুটে প্রতিটি নিবন্ধিত ক্লেইমের পাশে তার অর্থ লেখা থাকে, তাই কোন তিন-অক্ষরের সংক্ষেপ কী বোঝায় তা মনে রাখার দরকার নেই।
জেনে রাখুন: এটি ডিকোড করে; ভেরিফাই করে না। একটি JWT-এর সিগনেচার প্রমাণ করে যে টোকেনটি বদলানো হয়নি, আর তা যাচাই করতে ইস্যুকারীর সিক্রেট বা পাবলিক কি লাগে — যা কখনোই কোনো ওয়েব পেজে পেস্ট করা উচিত নয়। এখানে যা দেখানো হয়, সবই দাবি, প্রমাণ নয় — এভাবেই দেখুন, আর ভেরিফাই করুন আপনার সার্ভারে।
এই টুলটি আপনার ওয়েবসাইটে যোগ করুন
যেকোনো ব্লগ, ক্লাসের পেজ বা হেল্প আর্টিকেলের জন্য ফ্রি। একটি স্নিপেট পেস্ট করলেই আপনার ভিজিটররা আপনার পেজেই এটি ব্যবহার করতে পারবেন।
আরও ডেভেলপার টুলস
Base64 ডিকোড
Base64-কে আবার টেক্সট বা ফাইলে ফেরান
JSON ফরম্যাটার
অপাঠ্য JSON-কে পড়ার উপযোগী করুন
হ্যাশ জেনারেটর
MD5, SHA-1, SHA-256, SHA-384 ও SHA-512
Base64 এনকোড
টেক্সট বা ফাইলকে Base64-এ রূপান্তর করুন
UUID জেনারেটর
সিক্রেটের জন্য v4, ডেটাবেস কি-র জন্য v7
JSON ভ্যালিডেটর
JSON ঠিক কোথায় ভাঙা, তা খুঁজে বের করুন