راهنمای کامل JSON Web Token (JWT).
JSON Web Tokens (JWT) یک استاندارد باز (RFC 7519) برای انتقال امن اطلاعات بین طرفین به عنوان یک شی JSON است. این اطلاعات به دلیل امضای دیجیتالی قابل تأیید و اعتماد است.
1. JWT چیست؟
JWT ابزاری فشرده و ایمن برای نشان دادن ادعاهایی است که باید بین دو طرف منتقل شود. توکن از سه بخش تشکیل شده است:
مثال:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
این توکن شامل موارد زیر است:
-
سربرگ:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
-
بار:
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
-
امضا:
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
2. اجزای JWT
الف سربرگ
هدر معمولاً از دو بخش تشکیل شده است: نوع توکن (یعنی JWT) و الگوریتم امضای مورد استفاده، مانند HMAC SHA256 یا RSA.
مثال:
{
"alg": "HS256",
"typ": "JWT"
}
این JSON سپس Base64Url کدگذاری می شود تا اولین قسمت JWT را تشکیل دهد.
ب بار
محموله حاوی مطالبات است. ادعاها اظهاراتی در مورد یک نهاد (معمولاً کاربر) و داده های اضافی هستند. سه نوع ادعا وجود دارد:
-
ادعاهای ثبت شده: ادعاهای از پیش تعریف شده مانند
iss
(صادر کننده)،exp
(انقضا)sub
(موضوع)، وaud
(مخاطب). - ادعاهای عمومی: ادعاهای ایجاد شده برای به اشتراک گذاری عمومی.
- ادعاهای خصوصی: ادعاهای سفارشی ایجاد شده برای به اشتراک گذاشتن اطلاعات بین طرفینی که موافق استفاده از آنها هستند.
مثال:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
این نیز Base64Url رمزگذاری شده است تا قسمت دوم JWT را تشکیل دهد.
ج. امضا
برای ایجاد قسمت امضا، باید هدر کدگذاری شده، بار رمزگذاری شده، یک راز و الگوریتم مشخص شده در هدر را بگیرید و آن را امضا کنید.
مثال با استفاده از HMAC SHA256:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
از امضا برای تأیید اینکه فرستنده JWT همان کسی است که می گوید و اطمینان حاصل شود که پیام در طول مسیر تغییر نکرده است استفاده می شود.
3. JWT چگونه کار می کند
- ورود کاربر: هنگامی که یک کاربر وارد سیستم می شود، سرور کاربر را احراز هویت می کند و یک JWT تولید می کند و آن را با یک کلید مخفی امضا می کند.
- فروشگاه های مشتری JWT: مشتری این JWT را ذخیره می کند (معمولاً در محلی ذخیره یا یک کوکی).
-
مشتری JWT می فرستد: مشتری JWT را در قسمت ارسال می کند
Authorization
سربرگ درخواست های آینده - سرور JWT را تأیید می کند: سرور امضای رمز را تأیید می کند و ادعاها را استخراج می کند.
4. JWT در Node.js
بیایید ببینیم چگونه می توانید JWT را در یک برنامه Node.js با استفاده از jsonwebtoken
کتابخانه
نصب و راه اندازی
npm install jsonwebtoken
تولید توکن
const jwt = require('jsonwebtoken');
// Generate a token
const token = jwt.sign({ id: 123, name: "John Doe" }, 'your-256-bit-secret', {
expiresIn: '1h' // expires in 1 hour
});
console.log(token);
تایید یک توکن
jwt.verify(token, 'your-256-bit-secret', function(err, decoded) {
if (err) {
console.log('Token is not valid');
} else {
console.log('Decoded token:', decoded);
}
});
5. مثال مورد استفاده
Express Middleware برای احراز هویت
شما می توانید میان افزار برای محافظت از مسیرها ایجاد کنید.
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const authenticateJWT = (req, res, next) => {
const token = req.header('Authorization');
if (!token) return res.status(401).send('Access Denied');
try {
const verified = jwt.verify(token, 'your-256-bit-secret');
req.user = verified;
next();
} catch (err) {
res.status(400).send('Invalid Token');
}
};
app.get('/protected', authenticateJWT, (req, res) => {
res.send('You are viewing protected content!');
});
app.listen(3000, () => console.log('Server running on port 3000'));
6. بهترین شیوه ها
- کلید مخفی خود را ایمن نگه دارید: کلیدهای خود را با استفاده از متغیرهای محیطی یا ابزارهای مدیریت مخفی ذخیره کنید.
- از HTTPS استفاده کنید: همیشه JWT ها را از طریق HTTPS ارسال کنید تا از رهگیری جلوگیری شود.
-
انقضای مناسب را تنظیم کنید: همیشه با استفاده از علامت انقضا روی توکن های خود تنظیم کنید
exp
ادعا
نتیجه گیری
JWT ها روشی قدرتمند برای احراز هویت کاربران و انتقال ایمن اطلاعات بین طرفین ارائه می دهند. با درک ساختار و استفاده از JWT ها، می توانید مکانیسم های احراز هویت قوی را در برنامه های خود پیاده سازی کنید.
این راهنما اصول اولیه JWT، ساختار آن، نحوه کارکرد و پیاده سازی عملی در برنامه Node.js را پوشش می دهد.