JWT (JSON Web Token) কি?
JWT (JSON Web Token) হল একটি কমপ্যাক্ট এবং URL-safe পদ্ধতি যা দুটি পক্ষের মধ্যে তথ্য নিরাপদভাবে পাঠানোর জন্য ব্যবহৃত হয়। এটি মূলত ব্যবহারকারীর সেশন তথ্য, অথেনটিকেশন, এবং অথোরাইজেশন টোকেন হিসেবে ব্যবহৃত হয়। JWT-তে তিনটি অংশ থাকে:
- Header:
- Header সাধারণত দুটি অংশ নিয়ে গঠিত:
alg: এলগরিদম যেমন HMAC SHA256 বা RSA।typ: টোকেনের প্রকার, সাধারণতJWT।
- Header সাধারণত দুটি অংশ নিয়ে গঠিত:
- Payload:
- Payload অংশে থাকা তথ্য, যেমন ব্যবহারকারীর আইডি, নাম, বা অন্যান্য কাস্টম ডেটা। এটি "claims" নামে পরিচিত। Claims বিভিন্ন ধরনের হতে পারে:
- Registered claims: যেমন
iss(issuer),exp(expiration time),sub(subject),aud(audience)। - Public claims: যা কোন সুনির্দিষ্ট মান দিয়ে যুক্ত হতে পারে, যেমন ব্যবহারকারী আইডি।
- Private claims: কাস্টম ডেটা যা শুধুমাত্র উক্ত অ্যাপ্লিকেশনের মধ্যে ভাগ করা হয়।
- Registered claims: যেমন
- Payload অংশে থাকা তথ্য, যেমন ব্যবহারকারীর আইডি, নাম, বা অন্যান্য কাস্টম ডেটা। এটি "claims" নামে পরিচিত। Claims বিভিন্ন ধরনের হতে পারে:
- Signature:
- Signature অংশটি Header এবং Payload এর মধ্যকার নিরাপত্তা নিশ্চিত করার জন্য ব্যবহার করা হয়। এটি হ্যাশ করা হয় একটি সিক্রেট কীগুলি ব্যবহার করে।
- উদাহরণ হিসেবে, যদি আপনি
HMAC SHA256ব্যবহার করেন, তবে এটিbase64UrlEncode(Header) + "." + base64UrlEncode(Payload)এবং একটি সিক্রেট কীগুলির মাধ্যমে হ্যাশ করা হয়। - এটি যেকোনো পরিবর্তন শনাক্ত করতে সহায়তা করে, কারণ কোনো পরিবর্তন হলে Signature আর মেলেনা।
JWT টোকেনের গঠন:
HEADER.PAYLOAD.SIGNATURE
JWT কিভাবে কাজ করে?
JWT সাধারণত অথেনটিকেশন ও অথোরাইজেশনের জন্য ব্যবহৃত হয়। একবার ব্যবহারকারী লগইন করলে, একটি JWT টোকেন তৈরি করা হয় যা সার্ভার থেকে ক্লায়েন্টে পাঠানো হয়। এই টোকেনটি পরবর্তী রিকোয়েস্টে ব্যবহারকারীকে সঠিকভাবে অথেনটিকেট বা অথোরাইজ করতে ব্যবহৃত হয়।
১. অথেনটিকেশন প্রক্রিয়া:
- ব্যবহারকারী লগইন করে:
- ব্যবহারকারী তার ক্রিডেনশিয়াল (ইউজারনেম/পাসওয়ার্ড) পাঠায় সার্ভারে।
- JWT টোকেন তৈরি:
- সার্ভার ক্রিডেনশিয়াল যাচাইয়ের পর, একটি JWT টোকেন তৈরি করে এবং ব্যবহারকারীকে পাঠায়।
- ব্যবহারকারী টোকেন গ্রহণ করে:
- টোকেনটি ব্যবহারকারী তার ব্রাউজারে (বা অ্যাপ্লিকেশনের স্থানীয় স্টোরেজে) সংরক্ষণ করে।
- ভবিষ্যত রিকোয়েস্টে টোকেন পাঠানো:
- পরবর্তী যেকোনো রিকোয়েস্টে, ব্যবহারকারী ঐ JWT টোকেনটিকে
AuthorizationহেডারেBearerটোকেন হিসেবে পাঠায়।
- পরবর্তী যেকোনো রিকোয়েস্টে, ব্যবহারকারী ঐ JWT টোকেনটিকে
- টোকেন যাচাই:
- সার্ভার টোকেনটি গ্রহণ করে এবং সেটির সিগনেচার যাচাই করে নিশ্চিত করে যে টোকেনটি বৈধ ও অপরিবর্তিত।
২. অথোরাইজেশন প্রক্রিয়া:
- টোকেনের মধ্যে তথ্য:
- JWT-র মধ্যে থাকা Claims (যেমন
sub,role, ইত্যাদি) ব্যবহার করে সার্ভার নিশ্চিত করে যে ব্যবহারকারী নির্দিষ্ট রিসোর্সে অ্যাক্সেস পাবে কিনা।
- JWT-র মধ্যে থাকা Claims (যেমন
- টোকেনের মেয়াদ:
- JWT-তে সাধারণত একটি
exp(expiration) claim থাকে, যা টোকেনের মেয়াদ নির্ধারণ করে। যখন টোকেনের মেয়াদ শেষ হয়ে যায়, তখন ব্যবহারকারীকে আবার লগইন করতে বলা হয়।
- JWT-তে সাধারণত একটি
JWT এর সুবিধা:
- স্ট্যাটলেস (Stateless):
- JWT টোকেন সার্ভারের উপর কোনো স্টোরেজের প্রয়োজন নেই। সার্ভার শুধুমাত্র টোকেন যাচাই করে। এর ফলে সার্ভার স্কেলেবল এবং উন্নত পারফরম্যান্স পায়।
- একই টোকেন ব্যবহার করা যায়:
- একবার ব্যবহারকারীর লগইন টোকেন তৈরি হলে, সেটি বহুবিধ রিকোয়েস্টে ব্যবহার করা যেতে পারে।
- নিরাপত্তা:
- JWT সিগনেচার হ্যাশ করার মাধ্যমে নিরাপদ থাকে। এছাড়া, এটি HTTPS এর মাধ্যমে পাঠানো হলে, টোকেনটি আরো নিরাপদ হয়ে ওঠে।
- কাস্টম ক্লেইম ব্যবহার:
- JWT-তে আপনি কাস্টম তথ্য (যেমন ব্যবহারকারীর ভূমিকা, অনুমতি) অন্তর্ভুক্ত করতে পারেন, যা সার্ভার বা API কে ইজি অথোরাইজেশন করতে সাহায্য করে।
ExpressJS এ JWT ইন্টিগ্রেশন
এখানে ExpressJS-এ JWT ব্যবহারের প্রাথমিক উদাহরণ দেখানো হলো:
১. JWT টোকেন তৈরি এবং ক্লায়েন্টে পাঠানো:
const jwt = require('jsonwebtoken');
const express = require('express');
const app = express();
const PORT = 3000;
app.use(express.json());
const SECRET_KEY = 'your_secret_key';
// লগইন রাউট, যেখানে JWT টোকেন তৈরি করা হয়
app.post('/login', (req, res) => {
const { username, password } = req.body;
// সাধারণত এখানে ডাটাবেস যাচাই করা হয়
if (username === 'user' && password === 'password') {
// টোকেন তৈরি করা
const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });
res.json({ token });
} else {
res.status(401).send('Unauthorized');
}
});
// সুরক্ষিত রাউট, যেখানে JWT যাচাই করা হয়
app.get('/protected', (req, res) => {
const token = req.headers['authorization']?.split(' ')[1]; // "Bearer <token>" থেকে টোকেন আলাদা করা
if (!token) {
return res.status(403).send('Token is required');
}
// JWT টোকেন যাচাই করা
jwt.verify(token, SECRET_KEY, (err, decoded) => {
if (err) {
return res.status(403).send('Invalid token');
}
res.json({ message: 'This is a protected route', user: decoded.username });
});
});
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
এখানে, /login রাউটের মাধ্যমে ব্যবহারকারী লগইন করে এবং একটি JWT টোকেন পায়। পরে, /protected রাউটে, ব্যবহারকারী তার JWT টোকেনের মাধ্যমে অ্যাক্সেস পায়, যা সার্ভার দ্বারা যাচাই করা হয়।
সারাংশ
JWT (JSON Web Token) হল একটি সিকিউর এবং সহজ পদ্ধতি, যা ব্যবহারকারীর অথেনটিকেশন ও অথোরাইজেশন তথ্যকে নিরাপদভাবে এক জায়গা থেকে আরেক জায়গায় প্রেরণ করতে সাহায্য করে। ExpressJS-এ JWT ব্যবহারের মাধ্যমে আপনি স্ট্যাটলেস অথেনটিকেশন প্রক্রিয়া তৈরি করতে পারেন, যেখানে ব্যবহারকারী একবার লগইন করে একটি টোকেন পায়, এবং পরবর্তীতে সেই টোকেনের মাধ্যমে সুরক্ষিত রিসোর্স অ্যাক্সেস করতে পারে।
Read more