ইউজার অথেন্টিকেশন: আগের পদ্ধতির ঝামেলা?
ওয়েবে ইউজার লগইন সিস্টেম অনেক পুরনো একটি বিষয়। আগে যখন কোনো ইউজার লগইন করত, সার্ভার তার জন্য একটি session তৈরি করত এবং সেই সেশনের আইডি ব্রাউজারে cookie আকারে পাঠিয়ে দিত। পরে ইউজার যখনই সার্ভারে কোনো রিকোয়েস্ট পাঠাত, সেই কুকির মাধ্যমে সার্ভার বুঝত — এই ইউজার আগে লগইন করেছে।
তবে এই পদ্ধতির একটি বড় সীমাবদ্ধতা আছে — প্রতিটি ইউজারের সেশন সার্ভারে আলাদাভাবে সংরক্ষণ করতে হয়। ফলে ইউজারের সংখ্যা বাড়লে সার্ভারের উপর চাপও বেড়ে যায়, এবং অ্যাপ্লিকেশনকে স্কেল করা কঠিন হয়ে পড়ে।
এই সমস্যা সমাধান করার জন্যই এসেছে JWT (JSON Web Token) — যা সার্ভার-সাইড সেশন সংরক্ষণের প্রয়োজনীয়তা দূর করে দিয়েছে।

JWT আসার পর কী বদলালো?
JWT (JSON Web Token) এই সমস্যার সমাধান করে। এটি এমন একটি টোকেন, যার ভেতরেই ইউজারের দরকারি তথ্য থাকে — যেমন ইউজার আইডি, রোল, মেয়াদ ইত্যাদি।
সার্ভার শুধু টোকেনটি যাচাই করে নেয় একটি secret key দিয়ে। এর ফলে সার্ভারকে ইউজারের সেশন ধরে রাখতে হয় না, যা পুরো সিস্টেমকে করে তোলে stateless এবং scalable।
JWT-এর ভেতরের গঠন এবং প্রয়োজনীয় প্রযুক্তি
JWT (JSON Web Token) হলো একটি compact, URL-safe token, যা মূলত তিনটি অংশে বিভক্ত: Header, Payload এবং Signature। সঠিকভাবে বুঝতে হলে আমাদের কিছু গুরুত্বপূর্ণ প্রযুক্তি সম্পর্কে ধারণা থাকা দরকার:
1️⃣ Base64url Encoding
-
JWT-এর Header এবং Payload মূলত JSON ফরম্যাটে থাকে।
-
কিন্তু JSON ডেটা সরাসরি HTTP header বা URL-এ পাঠানো কঠিন। এজন্য Base64url encoding ব্যবহার করা হয়।
-
Base64url হলো Base64-এর একটি পরিবর্তিত সংস্করণ, যা URL এবং HTTP header-এ নিরাপদ।
-
Base64url-এ ব্যবহারযোগ্য ক্যারেক্টার:
A-Z(uppercase অক্ষর)a-z(lowercase অক্ষর)0-9(সংখ্যা)-(plus+এর পরিবর্তন)_(slash/এর পরিবর্তন)
-
প্রধান পরিবর্তনগুলো Base64 থেকে Base64url-এ:
+→-/→_- Padding
=সরানো হয়
-
উদাহরণ:
{"alg":"HS256","typ":"JWT"} → eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
2️⃣ SHA (Secure Hash Algorithm)
Signature তৈরিতে Hash function ব্যবহার করা হয়।
SHA হলো একটি ক্রিপ্টোগ্রাফিক হ্যাশ অ্যালগরিদম, যা কোনো ইনপুটকে fixed-length output এ রূপান্তর করে।
JWT-তে সাধারণত ব্যবহৃত SHA version গুলো:
- SHA-1: পুরনো, কম নিরাপদ
- SHA-256: জনপ্রিয়, নিরাপদ (উদাহরণ: HS256 JWT)
- SHA-512: বেশি নিরাপত্তার জন্য বড় হ্যাশ আউটপুট
Hash function এর সুবিধা:
- ডেটার integrity নিশ্চিত করা: ডেটা পরিবর্তন হলে হ্যাশও পরিবর্তিত হবে
- Predictability না থাকা: হ্যাশ থেকে মূল ডেটা বের করা সম্ভব নয়
3️⃣ HMAC (Hash-based Message Authentication Code)
HMAC হলো একটি ক্রিপ্টোগ্রাফিক ফাংশন, যা Hash + Secret key ব্যবহার করে message authentication করে।
JWT-এর Signature তৈরিতে HMAC ব্যবহার করা হয়:
Signature = HMAC-SHA256(secret_key, base64url(header) + "." + base64url(payload))
এর মাধ্যমে নিশ্চিত হয়:
- Token পরিবর্তন করা হয়নি
- Secret key ছাড়া কেউ valid Signature তৈরি করতে পারবে না
JWT-এর তিনটি অংশ এবং বানানোর ধাপ
JWT তিনটি অংশে বিভক্ত: Header . Payload . Signature — এগুলো তিনটা string কে ডট দিয়ে আলাদা করে রাখে।

১. Header
সংক্ষেপে বলে JWT কোন algorithm এবং type ব্যবহার করছে।
{ "alg": "HS256", "typ": "JWT" }
এটা JSON। পরে base64url এ এনকোড করবেন।
২. Payload (Claims)
এখানে থাকে ইউজারের তথ্য এবং অন্যান্য claim যেমন expiry time (exp)।
{ "sub": "123", "name": "Rokib", "role": "admin", "exp": 1710000000 }
এটাও JSON — পরে base64url এ এনকোড করবেন।
৩. Base64url এনকোডিং
JWT এ সাধারণ base64 নয় — base64url লাগে। সেটার মূল দুটি ফারাক:
+→-এবং/→_- শেষে
=padding দিতে হয় না (remove=)
তাই: JSON → UTF-8 bytes → base64 → replace characters → strip =
৪. Signature বানানো
Signature = HMAC-SHA256(secret, ${base64url(header)}.${base64url(payload)})
Header এবং Payload কে Base64url encode করে ডট দিয়ে যোগ করা হয়। এরপর Secret key দিয়ে HMAC-SHA256 চালিয়ে Signature তৈরি হয়।
৫. Final JWT Token
token = base64url(Header) . base64url(Payload) . base64url(Signature)
JWT কিভাবে কাজ করে?
JWT এর কাজ করার প্রক্রিয়া খুবই সহজ এবং efficient:
১. Login Process:
- User তার credentials (username/password) দিয়ে login করে
- Server credentials verify করে এবং একটি JWT token তৈরি করে
- এই token এ user এর তথ্য (ID, role, permissions) থাকে
- Server token টি client এর কাছে পাঠিয়ে দেয়
২. Request Process:
- Client প্রতিটি API request এ JWT token টি header এ পাঠায়
- Server token টি verify করে এবং user এর identity check করে
- Token valid হলে request process করে, invalid হলে reject করে
৩. Token Management:
- JWT token এর একটি expiry time থাকে (সাধারণত ১-২৪ ঘন্টা)
- Token expire হলে client নতুন token চায়
- Refresh token mechanism দিয়ে seamless experience দেওয়া যায়
সুবিধা:
- Server এ session store করার দরকার নেই
- Multiple server এ same token ব্যবহার করা যায়
- Stateless authentication - scalable এবং efficient
Raw JWT তৈরি করুন: Go Language এ
এখন আমরা দেখব কীভাবে Go language এ একটি সম্পূর্ণ JWT টোকেন হাতে তৈরি করা যায়। প্রতিটি ধাপে বিস্তারিত ব্যাখ্যা এবং কোড কমেন্ট দেওয়া থাকবে।
নিচে Go এর implementation দেখুন:
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"encoding/json"
"fmt"
"time"
)
// Base64url encode - padding ছাড়া
func base64urlEncode(data []byte) string {
return base64.URLEncoding.WithPadding(base64.NoPadding).EncodeToString(data)
}
// HMAC-SHA256 signature তৈরি
func createSignature(header, payload, secret string) string {
data := header + "." + payload
h := hmac.New(sha256.New, []byte(secret))
h.Write([]byte(data))
signature := h.Sum(nil)
return base64urlEncode(signature)
}
// JWT তৈরি করার ফাংশন
func createJWT(userData map[string]string, secret string) string {
// Header
header := map[string]string{
"alg": "HS256",
"typ": "JWT",
}
headerJSON, _ := json.Marshal(header)
encodedHeader := base64urlEncode(headerJSON)
// Payload
payload := map[string]interface{}{
"sub": userData["id"],
"name": userData["name"],
"role": userData["role"],
"iat": time.Now().Unix(),
"exp": time.Now().Unix() + 3600, // ১ ঘন্টা পর expire
}
payloadJSON, _ := json.Marshal(payload)
encodedPayload := base64urlEncode(payloadJSON)
// Signature
signature := createSignature(encodedHeader, encodedPayload, secret)
// Final JWT
jwt := fmt.Sprintf("%s.%s.%s", encodedHeader, encodedPayload, signature)
return jwt
}
func main() {
userData := map[string]string{
"id": "1234567890",
"name": "Rokib",
"role": "admin",
}
secretKey := "mySecretKey123"
jwt := createJWT(userData, secretKey)
fmt.Println("Generated JWT:", jwt)
}
JWT টেস্ট করুন
jwt.io তে গিয়ে preloaded JWT দিয়ে play এবং test করুন। সেখানে আপনি দেখতে পাবেন:
- Header এবং Payload decode হয়ে যাবে
- Signature verify হবে
- Algorithm এবং Secret key দেখতে পাবেন
- নিজের custom data দিয়ে নতুন JWT তৈরি করতে পারবেন
Real-world JWT Libraries
Production এ JWT ব্যবহার করার জন্য বিভিন্ন language এর জনপ্রিয় libraries। এই libraries গুলো behind the scenes এ উপরে দেখানো raw implementation এর মতোই কাজ করে, কিন্তু আরো secure, tested এবং optimized:
Go Language
- golang-jwt/jwt - Official Go JWT library, most widely used by Go developers
JavaScript/Node.js
- jsonwebtoken - Most popular JS JWT library, widely used in Node.js applications
Python
- PyJWT - Standard Python JWT library, most widely adopted in Python ecosystem