Token Expiration এবং Refresh Tokens হল আধুনিক ওয়েব অ্যাপ্লিকেশনগুলিতে নিরাপত্তা বজায় রাখার গুরুত্বপূর্ণ উপাদান। JWT (JSON Web Tokens) সাধারণত নির্দিষ্ট সময়ের জন্য বৈধ থাকে, অর্থাৎ কিছু সময় পর token expiration ঘটে। যখন token মেয়াদোত্তীর্ণ হয়ে যায়, তখন ব্যবহারকারীকে পুনরায় লগইন করতে বলা হয়। তবে Refresh Tokens ব্যবহার করে, আমরা মেয়াদোত্তীর্ণ টোকেনের পরিবর্তে নতুন টোকেন প্রদান করতে পারি, যাতে ইউজার আবার লগইন না করতে হয়।
ExpressJS-এ token expiration এবং refresh tokens ব্যবস্থাপনা সহজে বাস্তবায়ন করা যায়।
১. Token Expiration (টোকেন মেয়াদোত্তীর্ণ হওয়া)
JWT এর মাধ্যমে authentication করা হলে, আপনি টোকেনের মেয়াদ নির্ধারণ করতে পারেন। সাধারণত একটি JWT টোকেন যখন তৈরি করা হয়, তখন তার মেয়াদ নির্ধারণ করা হয়, যেমন: 1 ঘণ্টা, 1 দিন, বা কোনো নির্দিষ্ট সময়ের জন্য। মেয়াদ শেষ হলে, টোকেনটি আর বৈধ থাকে না এবং ইউজারকে পুনরায় authentication করতে বলা হয়।
১.১. JWT Token Expiration সেট করা
JWT টোকেনের expiration সময় নির্ধারণ করতে expiresIn প্যারামিটার ব্যবহার করা হয়।
কোড উদাহরণ:
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const port = 3000;
const secretKey = 'secretKey';
const users = [
{ id: 1, username: 'john', password: 'password123' }
];
// লগইন রাউট - JWT টোকেন তৈরি করা
app.post('/login', (req, res) => {
const { username, password } = req.body;
const user = users.find(u => u.username === username && u.password === password);
if (user) {
// JWT টোকেন তৈরি, এক ঘণ্টার জন্য মেয়াদোত্তীর্ণ হবে
const token = jwt.sign({ userId: user.id }, secretKey, { expiresIn: '1h' });
res.json({ token });
} else {
res.status(401).send('Invalid credentials');
}
});
// প্রোটেক্টেড রাউট - টোকেন যাচাই
app.get('/protected', (req, res) => {
const token = req.headers['authorization'];
if (!token) {
return res.status(403).send('Access denied');
}
// টোকেন যাচাই করা
jwt.verify(token, secretKey, (err, decoded) => {
if (err) {
return res.status(403).send('Token expired or invalid');
}
res.send(`Protected content for user ID: ${decoded.userId}`);
});
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
এখানে:
- টোকেনের মেয়াদ 1 ঘণ্টা (
expiresIn: '1h') হিসেবে নির্ধারণ করা হয়েছে। - যদি টোকেনের মেয়াদ শেষ হয়ে যায়, তবে
jwt.verifyফাংশনerrরিটার্ন করবে এবং "Token expired or invalid" বার্তা প্রদান করবে।
২. Refresh Tokens (রিফ্রেশ টোকেন)
Refresh Tokens হল দীর্ঘ মেয়াদী টোকেন যা মূলত ব্যবহারকারীর দীর্ঘ মেয়াদী authentication এর জন্য ব্যবহৃত হয়। যখন একটি JWT টোকেনের মেয়াদ শেষ হয়ে যায়, তখন ইউজারকে পুনরায় লগইন করতে না বলে, একটি Refresh Token ব্যবহার করে নতুন JWT টোকেন তৈরি করা হয়।
২.১. Refresh Token সিস্টেম
Refresh Token সাধারণত JWT টোকেনের তুলনায় বেশি সময়ের জন্য বৈধ থাকে (যেমন: কয়েক দিন বা মাস)। যখন JWT টোকেনের মেয়াদ শেষ হয়, তখন রিফ্রেশ টোকেন ব্যবহার করে নতুন JWT টোকেন তৈরি করা হয়।
ইনস্টলেশন:
npm install jsonwebtoken
কোড উদাহরণ:
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const port = 3000;
const secretKey = 'secretKey';
const refreshSecretKey = 'refreshSecretKey'; // রিফ্রেশ টোকেনের জন্য আলাদা সিক্রেট
const users = [
{ id: 1, username: 'john', password: 'password123' }
];
// রিফ্রেশ টোকেন ডাটাবেস (যতটুকু দীর্ঘকালীন থাকতে হবে)
const refreshTokens = [];
// লগইন রাউট - JWT এবং Refresh Token তৈরি করা
app.post('/login', (req, res) => {
const { username, password } = req.body;
const user = users.find(u => u.username === username && u.password === password);
if (user) {
// JWT টোকেন তৈরি, 1 ঘণ্টার জন্য মেয়াদোত্তীর্ণ হবে
const accessToken = jwt.sign({ userId: user.id }, secretKey, { expiresIn: '1h' });
// রিফ্রেশ টোকেন তৈরি, 7 দিন মেয়াদী
const refreshToken = jwt.sign({ userId: user.id }, refreshSecretKey, { expiresIn: '7d' });
// রিফ্রেশ টোকেন ডাটাবেসে সংরক্ষণ করা
refreshTokens.push(refreshToken);
res.json({ accessToken, refreshToken });
} else {
res.status(401).send('Invalid credentials');
}
});
// রিফ্রেশ টোকেন দিয়ে নতুন JWT টোকেন তৈরি
app.post('/token', (req, res) => {
const { refreshToken } = req.body;
if (!refreshToken) {
return res.status(401).send('Refresh token required');
}
if (!refreshTokens.includes(refreshToken)) {
return res.status(403).send('Invalid refresh token');
}
// রিফ্রেশ টোকেন যাচাই করা
jwt.verify(refreshToken, refreshSecretKey, (err, decoded) => {
if (err) {
return res.status(403).send('Invalid refresh token');
}
// নতুন অ্যাক্সেস টোকেন তৈরি
const accessToken = jwt.sign({ userId: decoded.userId }, secretKey, { expiresIn: '1h' });
res.json({ accessToken });
});
});
// প্রোটেক্টেড রাউট - JWT টোকেন যাচাই
app.get('/protected', (req, res) => {
const token = req.headers['authorization'];
if (!token) {
return res.status(403).send('Access denied');
}
// টোকেন যাচাই করা
jwt.verify(token, secretKey, (err, decoded) => {
if (err) {
return res.status(403).send('Token expired or invalid');
}
res.send(`Protected content for user ID: ${decoded.userId}`);
});
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
এখানে:
- ইউজার লগইন করলে, আমরা দুটি টোকেন তৈরি করি: Access Token (JWT) এবং Refresh Token।
- Access Token এর মেয়াদ 1 ঘণ্টা, এবং Refresh Token এর মেয়াদ 7 দিন।
- যখন Access Token এর মেয়াদ শেষ হয়ে যায়, তখন Refresh Token ব্যবহার করে নতুন Access Token তৈরি করা হয়।
৩. Refresh Tokens ব্যবস্থাপনার নিরাপত্তা
- Refresh Token সাধারণত দীর্ঘ মেয়াদী হয়, তাই এটি সুরক্ষিতভাবে সংরক্ষণ করা জরুরি। এটি সাধারনত ডাটাবেসে বা Secure HTTPOnly Cookies এ সংরক্ষণ করা হয়।
- Refresh Tokens এর ওপর অতিরিক্ত সুরক্ষা নিশ্চিত করতে, আপনি revocation mechanism তৈরি করতে পারেন, অর্থাৎ যদি ইউজার লগআউট করে বা তার রিফ্রেশ টোকেন বাতিল করা হয়, তবে সেটি আর ব্যবহৃত হতে পারবে না।
সারাংশ
Token Expiration এবং Refresh Tokens ব্যবস্থাপনা একটি গুরুত্বপূর্ণ নিরাপত্তা ব্যবস্থা, যা ExpressJS অ্যাপ্লিকেশনকে নিরাপদ রাখতে সাহায্য করে। যখন JWT টোকেনের মেয়াদ শেষ হয়, তখন Refresh Token ব্যবহার করে নতুন টোকেন তৈরি করা হয়, যাতে ইউজারকে পুনরায় লগইন না করতে হয়। এই ব্যবস্থাটি আধুনিক ওয়েব অ্যাপ্লিকেশনগুলির জন্য নিরাপত্তা বৃদ্ধি করতে গুরুত্বপূর্ণ এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সহায়ক।
Read more