JWT چیست و چگونه کار می‌کند

خلاصه
1404/11/24

## JWT چیست و چگونه کار می‌کند؟ JWT مخفف **JSON Web Token** است. یک استاندارد باز (RFC 7519) برای انتقال اطلاعات به صورت امن بین طرفین به عنوان یک شیء JSON است. این اطلاعات می

JWT چیست و چگونه کار می‌کند

## JWT چیست و چگونه کار می‌کند؟

JWT مخفف **JSON Web Token** است. یک استاندارد باز (RFC 7519) برای انتقال اطلاعات به صورت امن بین طرفین به عنوان یک شیء JSON است. این اطلاعات می‌توانند شامل اطلاعات کاربر، نقش‌ها، مجوزها و سایر داده‌های مورد نیاز برای احراز هویت و مجوز دسترسی باشند.

**چرا از JWT استفاده می‌کنیم؟**

* **امنیت:** JWTها می‌توانند با استفاده از کلیدهای رمزنگاری امضا شوند، که اطمینان می‌دهد اطلاعات دستکاری نشده‌اند.
* **مقیاس‌پذیری:** JWTها stateless هستند، به این معنی که سرور نیازی به ذخیره اطلاعات session کاربر ندارد. این امر باعث می‌شود مقیاس‌پذیری سیستم آسان‌تر شود.
* **انعطاف‌پذیری:** JWTها می‌توانند در طیف گسترده‌ای از برنامه‌ها و پلتفرم‌ها استفاده شوند.
* **استاندارد باز:** JWT یک استاندارد باز است، به این معنی که به راحتی می‌توان آن را با سایر سیستم‌ها و فناوری‌ها ادغام کرد.

**ساختار یک JWT:**

یک JWT از سه بخش اصلی تشکیل شده است که با نقطه (`.`) از هم جدا شده‌اند:

1. **Header (سرصفحه):**
* این بخش شامل اطلاعاتی در مورد نوع توکن (JWT) و الگوریتم رمزنگاری مورد استفاده برای امضای توکن است.
* به صورت JSON کدگذاری شده و سپس Base64Url encode می‌شود.
* مثال:
```json
{
"alg": "HS256",
"typ": "JWT"
}
```

2. **Payload (بدنه):**
* این بخش شامل اطلاعاتی است که می‌خواهید منتقل کنید. این اطلاعات می‌توانند شامل اطلاعات کاربر، نقش‌ها، مجوزها و سایر داده‌های مورد نیاز باشند.
* به صورت JSON کدگذاری شده و سپس Base64Url encode می‌شود.
* **Claims (ادعاها):** اطلاعات موجود در Payload به صورت Claims شناخته می‌شوند. سه نوع Claim وجود دارد:
* **Registered Claims (ادعاهای ثبت شده):** این ادعاها از پیش تعریف شده‌اند و برای اهداف خاصی استفاده می‌شوند، مانند `iss` (issuer - صادرکننده)، `sub` (subject - موضوع)، `aud` (audience - مخاطب)، `exp` (expiration time - زمان انقضا)، `nbf` (not before - قبل از این زمان معتبر نیست)، `iat` (issued at - زمان صدور).
* **Public Claims (ادعاهای عمومی):** این ادعاها توسط کاربر تعریف می‌شوند و می‌توانند برای انتقال اطلاعات سفارشی استفاده شوند.
* **Private Claims (ادعاهای خصوصی):** این ادعاها بین طرفین توافق شده و برای انتقال اطلاعات محرمانه استفاده می‌شوند.
* مثال:
```json
{
"sub": "1234567890",
"name": "John Doe",
"admin": true,
"iat": 1516239022
}
```

3. **Signature (امضا):**
* این بخش برای تأیید اصالت و یکپارچگی JWT استفاده می‌شود.
* با استفاده از Header، Payload و یک کلید مخفی (Secret Key) با استفاده از الگوریتم رمزنگاری مشخص شده در Header ایجاد می‌شود.
* این امضا تضمین می‌کند که JWT دستکاری نشده است.
* مثال:
```
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
```

**نحوه کار JWT:**

1. **احراز هویت کاربر:** کاربر با استفاده از نام کاربری و رمز عبور خود احراز هویت می‌شود.
2. **ایجاد JWT:** پس از احراز هویت موفقیت‌آمیز، سرور یک JWT ایجاد می‌کند. این JWT شامل اطلاعات کاربر و یک امضای امن است.
3. **ارسال JWT به کلاینت:** سرور JWT را به کلاینت (مرورگر، اپلیکیشن موبایل و غیره) ارسال می‌کند.
4. **ذخیره JWT در کلاینت:** کلاینت JWT را در حافظه محلی (localStorage) یا کوکی ذخیره می‌کند.
5. **ارسال JWT در درخواست‌های بعدی:** کلاینت JWT را در هدر `Authorization` درخواست‌های بعدی به سرور ارسال می‌کند. معمولاً از طرح `Bearer` استفاده می‌شود:
```
Authorization: Bearer
```
6. **تأیید JWT توسط سرور:** سرور JWT را با استفاده از کلید مخفی خود تأیید می‌کند. اگر امضای JWT معتبر باشد، سرور اطلاعات موجود در Payload را استخراج کرده و به کاربر اجازه دسترسی می‌دهد.

**مزایا و معایب JWT:**

**مزایا:**

* **Stateless:** سرور نیازی به ذخیره اطلاعات session کاربر ندارد.
* **مقیاس‌پذیری:** به دلیل stateless بودن، مقیاس‌پذیری سیستم آسان‌تر است.
* **امنیت:** JWTها می‌توانند با استفاده از کلیدهای رمزنگاری امضا شوند.
* **انعطاف‌پذیری:** JWTها می‌توانند در طیف گسترده‌ای از برنامه‌ها و پلتفرم‌ها استفاده شوند.
* **استاندارد باز:** JWT یک استاندارد باز است.

**معایب:**

* **اندازه:** JWTها می‌توانند نسبتاً بزرگ باشند، به خصوص اگر شامل اطلاعات زیادی باشند.
* **ابطال:** ابطال JWTها می‌تواند دشوار باشد. اگر یک JWT به خطر بیفتد، نمی‌توان آن را به راحتی باطل کرد. (راه حل هایی مانند لیست سیاه (blacklist) وجود دارد اما stateless بودن را نقض می کند)
* **امنیت کلید:** کلید مخفی مورد استفاده برای امضای JWT باید به صورت امن نگهداری شود.

**ابزارهای مفید برای کار با JWT:**

* **jwt.io:** یک وب‌سایت برای رمزگذاری و رمزگشایی JWTها.
* **Libraries:** کتابخانه‌های JWT برای زبان‌های برنامه‌نویسی مختلف (مانند Node.js، Python، Java و غیره) وجود دارند که کار با JWTها را آسان‌تر می‌کنند.

**در نهایت:**

JWT یک ابزار قدرتمند برای احراز هویت و مجوز دسترسی است. با درک نحوه کار JWT، می‌توانید از آن برای ایجاد برنامه‌های امن و مقیاس‌پذیر استفاده کنید.