রহিম কি করিমের account-এ
ঢুকতে পারবে?
Login করলেই কি সব দেখা যায়? নাকি system জানে
কে কোথায় যেতে পারবে — এবং কেন?
JWT Token
Redis Cache
Permission System
RBAC
১০ লাখ User
পুরো Auth System বুঝব ৩০ মিনিটে
SLIDE 01
পুরো Auth System এক নজরে
Login থেকে Permission — সব কিছু এক পথে
Browser
→
API Gateway
→
Auth Middleware
→
Redis Cache
→
Route Handler
Authentication
- তুমি কে? — পরিচয় যাচাই
- Email + Password → JWT Token
- Token থেকে User বের করা
Authorization
- তুমি কী করতে পারবে? — অধিকার যাচাই
- Role: Admin / Teacher / Student
- Permission: read / write / delete
Redis Cache
- প্রতি request-এ DB query নয়
- Token → User data RAM-এ রাখা
- ১০ লাখ user handle করার রহস্য
Scale
- Stateless JWT — server-এ session নেই
- Multiple server-এও কাজ করে
- Redis distributed cache
SLIDE 02
Authentication — তুমি কে?
পরিচয় যাচাই করার পুরো পদ্ধতি
❌
সমস্যা: প্রতিবার DB-তে password check করলে ১০ লাখ user-এর request সামলানো যাবে না — server
মরে যাবে
JWT Token কী?
- একটা ডিজিটাল পরিচয়পত্র
- তিন ভাগ: Header . Payload . Signature
- Payload-এ থাকে: userId, role, expiry
- Server verify করে — DB query নেই
Token Lifecycle
- Access Token: ১৫ মিনিট (ছোট, fast)
- Refresh Token: ৩০ দিন (DB-তে থাকে)
- Access expire → Refresh দিয়ে নতুন নাও
// Login করলে
const token = jwt.sign(
{ userId: রহিম.id, role: 'student' },
SECRET_KEY,
{ expiresIn: '15m' }
);
// প্রতি request-এ verify
const decoded = jwt.verify(
token, SECRET_KEY
);
// decoded = { userId: 'rahim-123',
// role: 'student', exp: 1234567 }
✅
JWT verify করতে শুধু SECRET_KEY দরকার — DB-তে যেতে হয় না। তাই ১০ লাখ request সামলানো
সম্ভব।
SLIDE 03
Authorization — কে কী করতে পারবে?
RBAC: Role-Based Access Control
Role Hierarchy
| Role |
ক্ষমতা |
| SuperAdmin |
সব কিছু |
| Admin |
User manage, Course manage |
| Teacher |
নিজের Course manage |
| Student |
শুধু পড়তে পারবে |
⚠️
রহিম (Student) যদি teacher-এর route-এ ঢোকার চেষ্টা করে — ৪০৩ Forbidden। Role check ব্যর্থ।
// Permission Middleware
function requireRole(...roles) {
return (req, res, next) => {
const { role } = req.user;
if (!roles.includes(role)) {
return res.status(403).json({
error: 'তোমার এখানে প্রবেশ নিষেধ'
});
}
next();
};
}
// Route-এ ব্যবহার
router.delete('/user/:id',
authenticate,
requireRole('admin','superadmin'),
deleteUser
);
SLIDE 04
নতুন User Sign Up
রহিম প্রথমবার account খুলছে
১
Email + Password দেয় — রহিম form fill করে submit করে
২
Validation — Email format ঠিক আছে? Password ৮ character-এর বেশি?
৩
Email duplicate check — DB-তে এই email আগে আছে কিনা
৪
bcrypt দিয়ে password hash — কখনো plain password DB-তে রাখা হয় না। hash:
$2b$10$xyz...
৫
DB-তে save — role: 'student' দিয়ে নতুন record
৬
Access + Refresh Token generate — রহিম-কে দিয়ে দাও, সে login হয়ে গেছে
SLIDE 05
Existing User Login
করিম আবার ফিরে এসেছে
২
DB-তে email খোঁজো — পাওয়া না গেলে ৪০৪
৩
bcrypt.compare() — দেওয়া password vs stored hash
৪
Match? → JWT Access + Refresh Token দাও
৫
Redis-এ user data cache করো (TTL: ১৫ মিনিট)
// Login flow
const user = await db.user.findUnique({
where: { email }
});
if (!user) throw new Error('User নেই');
const match = await bcrypt.compare(
password, user.passwordHash
);
if (!match) throw new Error('Wrong password');
// Redis-এ cache
await redis.setex(
`user:${user.id}`,
900, // 15 মিনিট
JSON.stringify(user)
);
return { accessToken, refreshToken };
SLIDE 06
Protected Route — Middleware Chain
প্রতিটা request এই পথে আসে
Request আসে
→
Token extract
→
JWT verify
→
Redis check
→
DB fallback
→
Route
async function authenticate(req, res, next) {
const token = req.headers.authorization
?.split(' ')[1];
if (!token) return res.status(401).json(
{ error: 'Token নেই' }
);
const decoded = jwt.verify(token, SECRET);
// Redis-এ আছে?
let user = await redis.get(
`user:${decoded.userId}`
);
if (!user) {
// DB থেকে নাও + cache করো
user = await db.user.findUnique(
{ where: { id: decoded.userId } }
);
await redis.setex(`user:${user.id}`,
900, JSON.stringify(user));
}
req.user = user;
next();
}
✅
৯৫% request Redis থেকে serve হয় — DB touch করে না। এই কারণে ১০ লাখ user
handle সম্ভব।
❌
Token invalid বা expire → ৪০১ Unauthorized। রহিমকে আবার login করতে হবে।
Cache Miss কখন?
- প্রথম login-এর পর (Redis-এ নেই)
- TTL expire হলে (১৫ মিনিট পর)
- User data update হলে (cache invalidate)
SLIDE 07
Redis Cache — Memory-তে রাখার জাদু
Database-এ বারবার যাওয়া বন্ধ
Redis কী?
- RAM-এ data রাখার database
- HDD/SSD-এর চেয়ে ১০০x দ্রুত
- Key-Value format: "user:123" → {...}
- TTL দিলে auto expire হয়
কী কী Cache করি?
- User info (id, email, role)
- Permission list
- Course access list
- Rate limit counter
Cache Invalidation
- User role বদলালে → cache delete
- Password change → সব session clear
- Logout → token blacklist Redis-এ
0.1ms
Redis response time
5-10ms
Database query time
50-100x
Redis কত গুণ দ্রুত
💡
উদাহরণ: ১ লাখ user একসাথে request পাঠাল। Redis ছাড়া → ১ লাখ DB query। Redis সহ → ৫,০০০ DB query +
৯৫,০০০ Redis hit। Server বাঁচল।
SLIDE 08
Course Access — কে কোন Course দেখতে পাবে?
জাবের কি premium course-এ ঢুকতে পারবে?
১
জাবের /course/456/video request পাঠায়
২
Authenticate middleware: জাবের কে? → Token verify
৩
Course access check: জাবের কি এই course কিনেছে?
৪
Redis: `enrollment:জাবের.id:course456` → YES/NO
৫
YES → Video দেখতে পাবে। NO → Payment page-এ পাঠাও।
async function checkCourseAccess(
userId, courseId
) {
// Redis-এ আছে?
const cacheKey =
`enroll:${userId}:${courseId}`;
const cached = await redis.get(cacheKey);
if (cached) return cached === 'true';
// DB check
const enrollment = await db.enrollment
.findUnique({
where: { userId_courseId:
{ userId, courseId } }
});
const hasAccess = !!enrollment;
// Cache করো ১ ঘণ্টার জন্য
await redis.setex(cacheKey, 3600,
String(hasAccess));
return hasAccess;
}
SLIDE 09
১০–২০ লাখ User Handle করার Strategy
ছোট system কীভাবে বড় হয়
Stateless JWT
- Server-এ session রাখা হয় না
- যেকোনো server request handle করতে পারে
- নতুন server যোগ করলেই scale
Redis Cluster
- একটা Redis → multiple Redis node
- Data শেয়ার হয় সব node-এ
- একটা মরলে অন্যটা চলে
Rate Limiting
- এক IP থেকে বেশি request → block
- Redis-এ counter রাখা হয়
- Brute force attack বন্ধ করে
❌
ভুল approach: Session-based auth → সব server-এ session sync করতে হয় →
nightmare at scale
✅
সঠিক approach: JWT + Redis → Server stateless, cache distributed → ১০ লাখ
user, ১০০ server — সব ঠিকঠাক
SLIDE 10
যা শিখলাম — এক নজরে
Auth System-এর পুরো ছবি
Authentication
- JWT — stateless, fast
- bcrypt password hashing
- Access + Refresh token pair
Authorization
- RBAC — Role-Based Access
- Middleware chain
- Permission per route
Cache & Scale
- Redis — ৯৫% DB query বাঁচায়
- Distributed cache
- Rate limiting protection
🎯
মনে রাখো: Authentication = কে তুমি? Authorization = কী করতে পারবে? Redis = দ্রুত উত্তর দেওয়ার
চাবি।