JWT এনকোডার
HS256, HS384, HS512 দিয়ে JSON Web Token তৈরি ও সাইন করুন
হেডার
পেলোড
সিক্রেট কী
এনকোডেড JWT
আপনার সিক্রেট কী ব্রাউজার থেকে বের হয় না। সমস্ত সাইনিং ক্লায়েন্ট-সাইডে হয়।
JWT এনকোডিং কী?
JWT এনকোডিং হলো একটি JSON Web Token তৈরির প্রক্রিয়া — একটি কমপ্যাক্ট, URL-safe স্ট্রিং যা ক্রিপ্টোগ্রাফিক কী দিয়ে সাইন করা ক্লেমের একটি সেট বহন করে। ফলাফল হলো একটি তিন-অংশের টোকেন (header.payload.signature) যা RFC 7519 দ্বারা সংজ্ঞায়িত, সার্ভার সেশন স্টেট বজায় না রেখেই যাচাই করতে পারে। অনলাইন JWT এনকোডিং আপনাকে পরীক্ষা ও ডেভেলপমেন্টের জন্য সরাসরি ব্রাউজারে টোকেন তৈরি ও সাইন করতে দেয়।
হেডার সাইনিং অ্যালগরিদম (যেমন HS256) এবং টোকেন টাইপ ঘোষণা করে। পেলোডে ক্লেম থাকে — কী-ভ্যালু জোড়া যেমন সাবজেক্ট (sub), মেয়াদ শেষের সময় (exp), এবং আপনার অ্যাপ্লিকেশনের প্রয়োজনীয় কাস্টম ডেটা। উভয় অংশ JSON হিসেবে সিরিয়ালাইজ করা হয়, তারপর base64url-এনকোড করা হয়। সিগনেচার একটি সিক্রেট কী ব্যবহার করে এনকোডেড হেডার ও পেলোডের উপর গণনা করা হয়, তিনটি অংশ একসাথে আবদ্ধ করে।
সেশন কুকির বিপরীতে, JWT স্ব-সম্পূর্ণ: যাচাইকারীকে ডেটাবেস কোয়েরি করতে বা কোনো বাহ্যিক সার্ভিস কল করতে হয় না। এটি JWT-ভিত্তিক প্রমাণীকরণকে REST API, মাইক্রোসার্ভিস এবং সিঙ্গেল-পেজ অ্যাপ্লিকেশনে জনপ্রিয় করে তুলেছে যেখানে স্টেটলেস অনুমোদন লেটেন্সি কমায় এবং অনুভূমিক স্কেলিং সহজ করে।
JWT এনকোডার কেন ব্যবহার করবেন?
হাতে JWT তৈরি করতে base64url এনকোডিং, JSON সিরিয়ালাইজেশন এবং HMAC গণনার প্রয়োজন। এই টুলটি তিনটি ধাপ তাৎক্ষণিকভাবে পরিচালনা করে যাতে আপনি সঠিক ক্লেম পেতে মনোযোগ দিতে পারেন।
JWT এনকোডারের ব্যবহারের ক্ষেত্র
HS256 বনাম HS384 বনাম HS512: HMAC অ্যালগরিদম তুলনা
তিনটি অ্যালগরিদমই একটি শেয়ার্ড সিক্রেট সহ HMAC (Hash-based Message Authentication Code) ব্যবহার করে। পার্থক্য হলো অন্তর্নিহিত হ্যাশ ফাংশনে, যা সিগনেচারের দৈর্ঘ্য ও নিরাপত্তা মার্জিনকে প্রভাবিত করে। বেশিরভাগ অ্যাপ্লিকেশনের জন্য HS256 যথেষ্ট নিরাপত্তা প্রদান করে। HS384 বা HS512 বেছে নিন যখন কমপ্লায়েন্স প্রয়োজনীয়তা (যেমন FIPS-140) শক্তিশালী হ্যাশ বাধ্যতামূলক করে বা যখন আপনার টোকেনে উচ্চমূল্যের অনুমোদন সিদ্ধান্ত থাকে।
| অ্যালগরিদম | হ্যাশ | সিগনেচার | গতি | সাধারণ ব্যবহার |
|---|---|---|---|---|
| HS256 | SHA-256 | 32 B | Fastest | General purpose, default for most libraries |
| HS384 | SHA-384 | 48 B | Fast | Higher security margin, FIPS-140 compliant |
| HS512 | SHA-512 | 64 B | Fast | Maximum HMAC security, large payloads |
স্ট্যান্ডার্ড JWT ক্লেম রেফারেন্স
RFC 7519 সাতটি নিবন্ধিত ক্লেম সংজ্ঞায়িত করে। কোনোটিই বাধ্যতামূলক নয়, কিন্তু সেগুলো সঠিকভাবে ব্যবহার করলে আন্তঃকার্যক্ষমতা ও নিরাপত্তা উন্নত হয়। exp ক্লেম বিশেষভাবে গুরুত্বপূর্ণ — মেয়াদ ছাড়া টোকেন অনির্দিষ্টকালের জন্য বৈধ যদি সিক্রেট রোটেট না করা হয়।
| ক্লেম | নাম | বিবরণ | উদাহরণ |
|---|---|---|---|
| iss | Issuer | Who issued the token | "auth.example.com" |
| sub | Subject | Who the token represents | "user-123" |
| aud | Audience | Intended recipient service | "api.example.com" |
| exp | Expiration | Unix timestamp — token invalid after this time | 1717203600 |
| nbf | Not Before | Unix timestamp — token invalid before this time | 1717200000 |
| iat | Issued At | Unix timestamp when the token was created | 1717200000 |
| jti | JWT ID | Unique token identifier for revocation tracking | "a1b2c3d4" |
কোডে JWT এনকোডিং
এই উদাহরণগুলো দেখায় কীভাবে প্রোগ্রামাটিকভাবে JWT তৈরি ও সাইন করতে হয়। প্রতিটি স্নিপেট একটি বৈধ HS256-সাইন করা টোকেন তৈরি করে। প্রোডাকশন সিস্টেমের জন্য সবসময় exp ক্লেম সেট করুন এবং কমপক্ষে 256 বিটের ক্রিপ্টোগ্রাফিকভাবে র্যান্ডম সিক্রেট ব্যবহার করুন।
async function signJWT(payload, secret, alg = 'HS256') {
const header = { alg, typ: 'JWT' }
const enc = new TextEncoder()
// Base64url encode header and payload
const b64url = (obj) =>
btoa(JSON.stringify(obj)).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')
const h = b64url(header)
const p = b64url(payload)
// Sign with HMAC-SHA256
const key = await crypto.subtle.importKey(
'raw', enc.encode(secret),
{ name: 'HMAC', hash: 'SHA-256' }, false, ['sign']
)
const sig = await crypto.subtle.sign('HMAC', key, enc.encode(`${h}.${p}`))
const s = btoa(String.fromCharCode(...new Uint8Array(sig)))
.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')
return `${h}.${p}.${s}`
}
// Usage
const token = await signJWT(
{ sub: 'user-123', name: 'Alice', iat: Math.floor(Date.now() / 1000) },
'your-256-bit-secret'
)
// → "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOi..."import jwt
import time
payload = {
"sub": "user-123",
"name": "Alice",
"iat": int(time.time()),
"exp": int(time.time()) + 3600, # expires in 1 hour
}
# Sign with HS256 (default)
token = jwt.encode(payload, "your-256-bit-secret", algorithm="HS256")
# → "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOi..."
# Verify and decode
decoded = jwt.decode(token, "your-256-bit-secret", algorithms=["HS256"])
# → {"sub": "user-123", "name": "Alice", "iat": 1717200000, "exp": 1717203600}const jwt = require('jsonwebtoken')
const payload = {
sub: 'user-123',
name: 'Alice',
role: 'admin',
}
// Sign — iat is added automatically
const token = jwt.sign(payload, 'your-256-bit-secret', {
algorithm: 'HS256',
expiresIn: '1h', // sets exp claim
issuer: 'auth.example.com', // sets iss claim
})
// Verify
const decoded = jwt.verify(token, 'your-256-bit-secret')
// → { sub: 'user-123', name: 'Alice', role: 'admin', iat: ..., exp: ... }package main
import (
"fmt"
"time"
"github.com/golang-jwt/jwt/v5"
)
func main() {
claims := jwt.MapClaims{
"sub": "user-123",
"name": "Alice",
"iat": time.Now().Unix(),
"exp": time.Now().Add(time.Hour).Unix(),
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
signed, _ := token.SignedString([]byte("your-256-bit-secret"))
fmt.Println(signed)
// → eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOi...
}