JWT (JSON Web Token) কী?
JSON Web Token (JWT) হলো RFC 7519-এ সংজ্ঞায়িত একটি সংক্ষিপ্ত, URL-safe টোকেন ফরম্যাট। এটি একটি JSON অবজেক্ট হিসেবে claims এনকোড করে, তারপর সাইন করে — এবং ঐচ্ছিকভাবে এনক্রিপ্ট করে — যাতে প্রাপক নিশ্চিত করতে পারেন যে ডেটায় কোনো পরিবর্তন হয়নি। REST API, single-sign-on সিস্টেম ও মাইক্রোসার্ভিস অথরাইজেশনে stateless প্রমাণীকরণের জন্য JWT হলো এখন ইন্ডাস্ট্রি স্ট্যান্ডার্ড।
RFC 7519 — JSON Web Token (JWT) →
JWT গঠন: Header · Payload · Signature
প্রতিটি JWT হলো তিনটি base64url-এনকোডেড অংশ যা ডট দিয়ে আলাদা করা। header ও payload হলো সাদামাটা JSON — যেকেউ পড়তে পারেন — আর signature হলো একটি ক্রিপ্টোগ্রাফিক মান যা শুধুমাত্র সঠিক key দিয়ে যাচাই করা যায়।
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMTIzIiwibmFtZSI6IkFsaWNlIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNzE3MjAwMDAwLCJleHAiOjE3MTcyMDM2MDB9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
{
"alg": "HS256",
"typ": "JWT"
}{
"sub": "user123",
"name": "Alice",
"role": "admin",
"iat": 1717200000,
"exp": 1717203600
}JWT ডিকোডার কেন ব্যবহার করবেন?
কাঁচা JWT দেখতে এলোমেলো টেক্সটের মতো। এই টুলটি header ও payload কে তাৎক্ষণিকভাবে ফরম্যাটেড JSON হিসেবে প্রদর্শন করে, যাতে আপনি একটি লাইন কোড না লিখেই claims পরীক্ষা করতে, মেয়াদ শেষের সময় দেখতে এবং অ্যালগরিদমের পছন্দ যাচাই করতে পারেন।
স্ট্যান্ডার্ড JWT Claims রেফারেন্স
RFC 7519 সাতটি নিবন্ধিত claim নাম নির্ধারণ করে। এগুলো বাধ্যতামূলক নয়, তবে interoperability-র জন্য এগুলো ব্যবহার দৃঢ়ভাবে প্রস্তাবিত। payload-এ যেকোনো কাস্টম claim যোগ করা যায়।
| Claim | বিবরণ | ধরন |
|---|---|---|
| iss | Issuer — টোকেনটি কে ইস্যু করেছে তা চিহ্নিত করে — যেমন আপনার auth সার্ভারের URL বা অ্যাপ্লিকেশনের নাম। | string |
| sub | Subject — JWT যে principal সম্পর্কে তা চিহ্নিত করে — সাধারণত একটি ব্যবহারকারী ID বা সার্ভিস অ্যাকাউন্ট। | string |
| aud | Audience — উদ্দিষ্ট প্রাপকদের চিহ্নিত করে। গ্রহণকারী পক্ষকে অবশ্যই যাচাই করতে হবে যে এটি তাদের পরিচয়ের সাথে মিলে। | string | string[] |
| exp | Expiration Time — এই Unix timestamp-এর পরে টোকেন গ্রহণযোগ্য নয়। চুরি হওয়া টোকেনের ক্ষতি সীমিত রাখতে এটি সর্বদা নির্ধারণ করুন। | number |
| nbf | Not Before — এই Unix timestamp-এর আগে টোকেন গ্রহণযোগ্য নয়। ভবিষ্যৎ-তারিখের টোকেন নির্ধারণ করতে কার্যকর। | number |
| iat | Issued At — টোকেনটি কখন ইস্যু হয়েছিল সেই Unix timestamp। টোকেনের বয়স গণনা করতে ব্যবহৃত হয়। | number |
| jti | JWT ID — টোকেনের একটি অনন্য পরিচিতি। ব্যবহৃত JTI মান সার্ভার-সাইডে সংরক্ষণ ও যাচাই করে টোকেন বাতিল করা সম্ভব হয়। | string |
JWT সাইনিং অ্যালগরিদম
alg header claim জানায় কোন অ্যালগরিদম দিয়ে টোকেন সাইন করা হয়েছে। এই পছন্দ নিরাপত্তা, কার্যক্ষমতা এবং তৃতীয়-পক্ষের সার্ভিসগুলো private key ছাড়া টোকেন যাচাই করতে পারবে কিনা তা প্রভাবিত করে।
| অ্যালগরিদম | পরিবার | Key-এর ধরন | নোট |
|---|---|---|---|
| HS256 | HMAC | Symmetric | সবচেয়ে প্রচলিত। Shared secret — যার কাছে secret আছে সে সাইন ও যাচাই উভয়ই করতে পারে। |
| HS384 | HMAC | Symmetric | শক্তিশালী HMAC ভেরিয়েন্ট; কার্যক্ষমতায় মাঝারি খরচ। |
| HS512 | HMAC | Symmetric | সবচেয়ে শক্তিশালী HMAC ভেরিয়েন্ট। |
| RS256 | RSA | Asymmetric | সর্বাধিক ব্যবহৃত asymmetric অ্যালগরিদম (Google, Auth0, Okta)। Public key দিয়ে private key ছাড়াই যাচাই করা যায়। |
| RS384 | RSA | Asymmetric | উচ্চতর নিরাপত্তার RS ভেরিয়েন্ট। |
| RS512 | RSA | Asymmetric | সবচেয়ে শক্তিশালী RS ভেরিয়েন্ট। |
| ES256 | ECDSA | Asymmetric | Elliptic curve — RSA-র চেয়ে ছোট signature, মোবাইল ও IoT-এ জনপ্রিয়। |
| PS256 | RSA-PSS | Asymmetric | RSA-PSS: PKCS1v1.5-ভিত্তিক RS256-এর চেয়ে আধুনিক ও নিরাপদ। |
| none | — | — | কোনো signature নেই — অত্যন্ত বিপজ্জনক। প্রোডাকশনে কখনো alg: none সহ টোকেন গ্রহণ করবেন না। |
নিরাপত্তা বিবেচনা
JWT ডিকোড করা সবসময় নিরাপদ। সঠিক signature যাচাই ছাড়া JWT বিশ্বাস করা নিরাপদ নয়। আপনার অ্যাপ্লিকেশনে টোকেন ব্যবহার করার সময় এই নিয়মগুলো মাথায় রাখুন।
- –developer tools বা এই টুলে JWT ডিকোড ও পরীক্ষা করুন
- –টোকেনের আয়ু বোঝার জন্য exp, iat ও nbf ব্যবহার করুন
- –ডিবাগিংয়ের জন্য payload claims লগ করুন (সংবেদনশীল PII বাদ দিন)
- –টোকেন কীভাবে সাইন হয়েছে বুঝতে alg header পড়ুন
- –সার্ভার-সাইডে signature যাচাই ছাড়া payload-এর claims বিশ্বাস করুন
- –alg: none সহ টোকেন গ্রহণ করুন — এর মানে কোনো signature নেই
- –উচ্চ-নিরাপত্তার অ্যাপ্লিকেশনে localStorage-এ access token সংরক্ষণ করুন (httpOnly cookies পছন্দনীয়)
- –সংবেদনশীল অনুমতি বহনকারী টোকেনের জন্য exp অনেক দূর ভবিষ্যতে নির্ধারণ করুন
সাধারণ ব্যবহারের ক্ষেত্র
কোডে JWT ডিকোড করা
header ও payload হলো base64url-এনকোডেড — শুধু এনকোডিং উল্টো করুন। Base64url, + এর পরিবর্তে - এবং / এর পরিবর্তে _ ব্যবহার করে এবং = প্যাডিং বাদ দেয়। শুধু signature-এর জন্য secret key প্রয়োজন।
function decodeJWT(token) {
const [, payload] = token.split('.')
const json = atob(payload.replace(/-/g, '+').replace(/_/g, '/'))
return JSON.parse(json)
}const [, payload] = token.split('.')
const decoded = JSON.parse(
Buffer.from(payload, 'base64url').toString()
)import base64, json
def decode_jwt(token):
payload = token.split('.')[1]
padding = '=' * (-len(payload) % 4)
return json.loads(base64.urlsafe_b64decode(payload + padding))TOKEN="eyJhbGc..." echo $TOKEN | cut -d. -f2 | base64 -d 2>/dev/null | jq .