سی ام اس نویسسی ام اس نویسیاد بگیر، سیستم خودتو بنویس
مجلهتماس با ما
سی ام اس نویسسی ام اس نویس

CMS نویس مرجعی برای آموزش برنامه نویسی وب و PHP، توسعه افزونه‌های اختصاصی وردپرس، طراحی ورک‌فلو و اتوماسیون با n8n و توسعه CMS های اختصاصی است. هدف ما ارائه آموزش‌های کاربردی و راهکارهای حرفه‌ای برای توسعه‌دهندگان، کسب‌وکارها و علاقه‌مندان به دنیای برنامه‌نویسی است.

پیوندهای سریع
محصولات فیزیکیمحصولات دیجیتالدوره‌های آموزشی
سی ام اس نویس
مجله سی ام اس نویستماس با ماپنل کاربری
سی ام اس نویس — تمامی حقوق برای سی ام اس نویس محفوظ است. © 1406 تماس با ما09307711941
JWT در PHP چیست؟ آموزش JSON Web Token با مثال عملی

JWT در PHP چیست؟ آموزش JSON Web Token با مثال عملی

ممدیر کل سیستم ۲۶ شهریور ۱۴۰۵ ۲۰ دقیقه مطالعه ۲ بازدید
JWT در PHP چیست؟ آموزش JSON Web Token با مثال عملی

وقتی یک وب‌سایت یا اپلیکیشن دارای سیستم ورود کاربران باشد، بعد از Login باید روشی وجود داشته باشد که سرور بتواند در درخواست‌های بعدی تشخیص دهد کاربر قبلاً احراز هویت شده است.

در سیستم‌های سنتی PHP معمولاً می‌توان از Session استفاده کرد؛ اما در بسیاری از APIها و اپلیکیشن‌های مدرن، روش‌های مبتنی بر Token نیز کاربرد زیادی دارند.

یکی از شناخته‌شده‌ترین روش‌ها در این زمینه JWT است.

JWT مخفف JSON Web Token است و می‌تواند برای انتقال اطلاعات قابل اعتبارسنجی بین Client و Server استفاده شود.

در این مقاله ابتدا بررسی می‌کنیم JWT چیست، از چه بخش‌هایی تشکیل شده، چگونه کار می‌کند و چه تفاوتی با Session دارد. سپس یک نمونه عملی از ساخت و اعتبارسنجی JWT در PHP را بررسی می‌کنیم.


# JWT چیست؟

JWT مخفف:

JSON Web Token

است.

JWT یک فرمت استاندارد و فشرده برای انتقال اطلاعات بین طرفین به صورت یک Token است.

یک JWT معمولاً به شکل زیر دیده می‌شود:


xxxxx.yyyyy.zzzzz

این Token از سه بخش تشکیل می‌شود:


Header.Payload.Signature

که با نقطه (.) از یکدیگر جدا شده‌اند.

به صورت ساده:


JWT

│

├── Header

├── Payload

└── Signature


# JWT چه کاربردی دارد؟

یکی از کاربردهای رایج JWT، احراز هویت در APIها است.

برای مثال:


User

 ↓

Login

 ↓

PHP API

 ↓

Check Email + Password

 ↓

Generate JWT

 ↓

Return Token

 ↓

Client

بعد از آن Client می‌تواند Token را در درخواست‌های بعدی ارسال کند:


Authorization: Bearer YOUR_TOKEN

سرور Token را دریافت و اعتبار آن را بررسی می‌کند.

اگر Token معتبر باشد، درخواست پردازش می‌شود.


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

فرض کنید کاربر با Email و Password وارد سیستم می‌شود.

ابتدا:


POST /api/login

و اطلاعاتی مانند زیر ارسال می‌شود:


{

    "email": "user@example.com",

    "password": "12345678"

}

سرور اطلاعات را بررسی می‌کند.

اگر رمز عبور صحیح باشد، یک JWT تولید می‌کند:


PHP API

   ↓

JWT

   ↓

Client

Client سپس Token را ذخیره می‌کند و در درخواست‌های بعدی ارسال می‌کند:


Authorization: Bearer eyJ...

سرور نیز JWT را اعتبارسنجی می‌کند.


# ساختار JWT چیست؟

یک JWT استاندارد سه بخش اصلی دارد:


Header.Payload.Signature

برای مثال:


eyJhbGciOiJIUzI1NiJ9

.

eyJzdWIiOiIxMjMifQ

.

SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

این سه بخش عبارت‌اند از:

  1. Header
  2. Payload
  3. Signature

# Header در JWT چیست؟

Header معمولاً اطلاعاتی درباره نوع Token و الگوریتم مورد استفاده برای Signature دارد.

مثلاً:


{

    "alg": "HS256",

    "typ": "JWT"

}

در این مثال:


alg = HS256

الگوریتم Signature را مشخص می‌کند.

و:


typ = JWT

نوع Token را مشخص می‌کند.


# Payload در JWT چیست؟

Payload بخشی است که اطلاعات یا Claimهای Token داخل آن قرار می‌گیرند.

مثلاً:


{

    "sub": "123",

    "name": "Saeed",

    "role": "user"

}

این اطلاعات را می‌توان در زمان اعتبارسنجی Token استخراج کرد.

اما یک نکته بسیار مهم وجود دارد:

Payload به صورت معمول رمزنگاری نمی‌شود.

JWT معمولی برای مخفی کردن اطلاعات طراحی نشده است.

بنابراین نباید اطلاعات حساس مانند موارد زیر را داخل Payload قرار دهیم:


Password

Credit Card Number

Private Secret

Database Password


# Signature در JWT چیست؟

بخش سوم JWT، Signature است.

Signature برای بررسی صحت و اعتبار Token استفاده می‌شود.

برای مثال در الگوریتم HS256 می‌توان به صورت مفهومی چنین چیزی داشت:


HMACSHA256(

    Base64Url(Header) + "." + Base64Url(Payload),

    Secret

)

اگر شخصی Payload را تغییر دهد، Signature دیگر با Token مطابقت نخواهد داشت.

بنابراین Server می‌تواند متوجه شود Token دستکاری شده است.


# آیا JWT رمزنگاری شده است؟

در حالت معمول، خیر.

این یکی از مهم‌ترین نکات درباره JWT است.

JWT معمولاً Signed است، نه Encrypted.

یعنی:


JWT

 ↓

Signature

 ↓

بررسی تغییر نکردن اطلاعات

نه اینکه:


JWT

 ↓

Encryption

 ↓

مخفی شدن اطلاعات

بنابراین اطلاعات حساس را داخل Payload قرار ندهید.

برای انتقال اطلاعات حساس نیز باید از HTTPS استفاده شود.


# Base64URL در JWT چیست؟

Header و Payload در JWT معمولاً به شکل Base64URL Encode شده‌اند.

برای مثال:


{

    "alg": "HS256",

    "typ": "JWT"

}

به یک رشته متنی تبدیل می‌شود.

نکته مهم این است که:

Base64 Encoding رمزنگاری نیست.

بنابراین هر کسی که Token را در اختیار داشته باشد، در حالت عادی می‌تواند Header و Payload را Decode کند.

چیزی که باید از آن محافظت شود، Secret Key و خود Token است.


# Claim در JWT چیست؟

اطلاعات داخل Payload معمولاً به عنوان Claim شناخته می‌شوند.

Claimها می‌توانند به دو دسته کلی تقسیم شوند:

  • Registered Claims
  • Custom Claims

برخی Claimهای استاندارد عبارت‌اند از:


iss

sub

aud

exp

nbf

iat

jti


# Claim به نام sub چیست؟

sub مخفف Subject است.

معمولاً برای مشخص کردن شناسه موضوع Token استفاده می‌شود.

برای Authentication می‌توان مثلاً شناسه کاربر را قرار داد:


{

    "sub": "125"

}

یعنی این Token مربوط به کاربر شماره 125 است.


# Claim به نام iat چیست؟

iat مخفف:

Issued At

است.

یعنی زمان ایجاد Token.

مثلاً:


{

    "iat": 1720000000

}

مقدار آن معمولاً به صورت Unix Timestamp است.


# Claim به نام exp چیست؟

exp مخفف:

Expiration Time

است.

یعنی زمانی که Token منقضی می‌شود.

مثلاً:


{

    "sub": "125",

    "exp": 1720003600

}

بعد از زمان تعیین‌شده، Token نباید معتبر در نظر گرفته شود.

استفاده از Expiration Time یکی از بخش‌های مهم مدیریت Token است.


# Claim به نام iss چیست؟

iss مخفف:

Issuer

است.

می‌توان از آن برای مشخص کردن صادرکننده Token استفاده کرد.

مثلاً:


{

    "iss": "cmsnevis-api"

}


# Claim به نام aud چیست؟

aud مخفف:

Audience

است.

می‌تواند مشخص کند Token برای چه سرویس یا مخاطبی صادر شده است.

مثلاً:


{

    "aud": "mobile-app"

}


# Claim به نام jti چیست؟

jti مخفف:

JWT ID

است.

می‌توان از آن برای اختصاص یک شناسه یکتا به هر Token استفاده کرد.

این موضوع در بعضی سیستم‌ها برای مدیریت یا Revocation Tokenها کاربرد دارد.


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

PHP به صورت Built-in یک تابع استاندارد برای تولید JWT ندارد.

در پروژه‌های واقعی معمولاً از یک کتابخانه معتبر استفاده می‌شود.

یکی از کتابخانه‌های شناخته‌شده در اکوسیستم PHP:


firebase/php-jwt

است.

اگر پروژه شما Composer داشته باشد، می‌توان پکیج را با Composer نصب کرد.


# نصب کتابخانه JWT با Composer

در ریشه پروژه PHP اجرا کنید:


composer require firebase/php-jwt

Composer کتابخانه و وابستگی‌های مورد نیاز را نصب می‌کند.

بعد از نصب معمولاً می‌توان Autoload Composer را وارد کرد:


require __DIR__ . '/vendor/autoload.php';


# Secret Key چیست؟

برای الگوریتم‌هایی مانند HS256 به یک Secret Key نیاز داریم.

مثلاً:


my-super-secret-key

اما در پروژه واقعی نباید Secret را به صورت مستقیم داخل کد قرار دهیم.

روش بهتر استفاده از Environment Variable است.

مثلاً:


JWT_SECRET=very-long-random-secret

و سپس:


$secret = $_ENV['JWT_SECRET'];

روش دقیق خواندن Environment Variable به ساختار پروژه و ابزار Configuration آن بستگی دارد.


# ساخت JWT در PHP

بعد از نصب کتابخانه، می‌توانیم یک Token ایجاد کنیم.

مثال:


<?php



require __DIR__ . '/vendor/autoload.php';



use Firebase\JWT\JWT;



$secret = $_ENV['JWT_SECRET'];



$payload = [

    'iss' => 'cmsnevis-api',

    'sub' => 123,

    'iat' => time(),

    'exp' => time() + 3600

];



$jwt = JWT::encode(

    $payload,

    $secret,

    'HS256'

);



echo $jwt;

در این مثال Token برای مدت یک ساعت معتبر در نظر گرفته شده است.


# چرا نباید Secret را داخل Git قرار دهیم؟

فرض کنید کد زیر را داشته باشیم:


$secret = 'my-secret-key';

اگر این کد وارد Git Repository عمومی شود، Secret نیز افشا می‌شود.

روش بهتر این است که Secret در Environment Configuration قرار بگیرد.

مثلاً:


.env

و در:


.gitignore

قرار گیرد:


.env

تا اطلاعات حساس وارد Repository نشود.


# اعتبارسنجی JWT در PHP

تولید Token فقط یک بخش کار است.

در درخواست بعدی باید Token را دریافت و اعتبارسنجی کنیم.

فرض کنید Client این Header را ارسال کرده است:


Authorization: Bearer eyJ...

ابتدا Header را دریافت می‌کنیم.

در PHP:


$authorization = $_SERVER['HTTP_AUTHORIZATION'] ?? '';

سپس باید Token را از قسمت Bearer جدا کنیم.

مثلاً:


if (!preg_match('/Bearer\s(\S+)/', $authorization, $matches)) {

    http_response_code(401);

    exit('Unauthorized');

}



$token = $matches[1];

حالا $token شامل JWT است.


# Decode کردن JWT در PHP

می‌توانیم Token را با کتابخانه JWT Decode کنیم:


<?php



require __DIR__ . '/vendor/autoload.php';



use Firebase\JWT\JWT;

use Firebase\JWT\Key;



$secret = $_ENV['JWT_SECRET'];



$decoded = JWT::decode(

    $token,

    new Key($secret, 'HS256')

);

در صورت معتبر بودن Token، اطلاعات Decode شده در اختیار برنامه قرار می‌گیرد.

مثلاً:


echo $decoded->sub;

می‌تواند شناسه کاربر را برگرداند.


# بررسی Expiration در JWT

اگر Token دارای:


{

    "exp": 1720003600

}

باشد، کتابخانه می‌تواند منقضی شدن Token را بررسی کند.

بنابراین اگر Client یک Token قدیمی ارسال کند، Server نباید آن را معتبر در نظر بگیرد.

این موضوع یکی از دلایل مهم استفاده از exp در JWT است.


# مدیریت خطا هنگام Decode

در پروژه واقعی نباید فرض کنیم Token همیشه معتبر است.

ممکن است:

  • Token خراب باشد.
  • Signature اشتباه باشد.
  • Token منقضی شده باشد.
  • Algorithm مورد انتظار نباشد.
  • ساختار Token صحیح نباشد.

بنابراین باید خطاها را مدیریت کنیم.

مثلاً:


try {



    $decoded = JWT::decode(

        $token,

        new Key($secret, 'HS256')

    );



} catch (Throwable $e) {



    http_response_code(401);



    echo json_encode([

        'success' => false,

        'message' => 'Invalid token'

    ]);



    exit;

}

در محیط Production بهتر است جزئیات داخلی Exception را مستقیماً به Client نمایش ندهیم.


# ساخت Middleware ساده برای JWT

اگر Endpointهای زیادی داشته باشیم، نباید اعتبارسنجی JWT را در همه فایل‌ها تکرار کنیم.

می‌توانیم یک Middleware یا Helper ایجاد کنیم.

مثلاً:


src/

└── Middleware/

    └── AuthMiddleware.php

وظیفه آن:


Request

   ↓

Read Authorization Header

   ↓

Extract Token

   ↓

Validate JWT

   ↓

Identify User

   ↓

Continue Request

در معماری‌های حرفه‌ای، این کار باعث می‌شود منطق Authentication از Controllerها جدا بماند.


# نمونه Middleware ساده JWT

یک نمونه ساده:


<?php



use Firebase\JWT\JWT;

use Firebase\JWT\Key;



function authenticateRequest(string $secret): object

{

    $authorization = $_SERVER['HTTP_AUTHORIZATION'] ?? '';



    if (!preg_match(

        '/Bearer\s(\S+)/',

        $authorization,

        $matches

    )) {

        http_response_code(401);

        exit('Unauthorized');

    }



    $token = $matches[1];



    try {



        return JWT::decode(

            $token,

            new Key($secret, 'HS256')

        );



    } catch (Throwable $e) {



        http_response_code(401);

        exit('Invalid token');

    }

}

حالا در Endpoint:


$user = authenticateRequest($secret);



echo $user->sub;

می‌توان شناسه کاربر احراز هویت‌شده را دریافت کرد.


# JWT و REST API

JWT یکی از روش‌هایی است که می‌توان برای Authentication در REST API استفاده کرد.

مثلاً:


POST /api/login

پاسخ:


{

    "access_token": "eyJ..."

}

Client سپس درخواست می‌دهد:


GET /api/profile

Authorization: Bearer eyJ...

Server:


Authorization Header

        ↓

Extract Token

        ↓

Verify Signature

        ↓

Check Expiration

        ↓

Identify User

        ↓

Return Data


# Access Token چیست؟

Access Token توکنی است که Client برای دسترسی به منابع محافظت‌شده ارسال می‌کند.

مثلاً:


Authorization: Bearer ACCESS_TOKEN

در سیستم JWT، این Access Token می‌تواند همان JWT باشد.


# Refresh Token چیست؟

اگر Access Token عمر کوتاهی داشته باشد، کاربر بعد از انقضا مجبور می‌شود دوباره Login کند.

برای حل این مشکل در برخی معماری‌ها از Refresh Token استفاده می‌شود.

ساختار مفهومی:


Login

 ↓

Access Token

 ↓

Refresh Token

Access Token:


عمر کوتاه‌تر

Refresh Token:


عمر طولانی‌تر

وقتی Access Token منقضی شود، Client می‌تواند طبق طراحی سیستم از Refresh Token برای دریافت Access Token جدید استفاده کند.


# آیا Refresh Token حتماً باید JWT باشد؟

خیر.

Refresh Token می‌تواند یک Token تصادفی و غیرقابل حدس باشد که Server آن را در دیتابیس یا سیستم ذخیره‌سازی مناسب مدیریت می‌کند.

بنابراین نباید تصور کنیم که تمام Tokenهای Authentication حتماً باید JWT باشند.


# JWT Stateless چیست؟

یکی از ویژگی‌هایی که درباره JWT زیاد مطرح می‌شود، Stateless بودن است.

در یک مدل Stateless، Server لازم نیست برای هر Access Token یک Session سنتی در حافظه یا دیتابیس نگه دارد.

اطلاعات لازم برای اعتبارسنجی Token در خود Token و Signature آن وجود دارد.

به صورت ساده:


Client

   |

   | JWT

   ↓

Server

   |

   | Verify Signature

   ↓

Accept / Reject

اما این به معنی حذف کامل State از تمام سیستم نیست.

برای مثال اگر سیستم Refresh Token، Logout سراسری، Revocation یا Session Management داشته باشد، ممکن است همچنان به Storage سمت Server نیاز داشته باشد.


# JWT و Session چه تفاوتی دارند؟

این یکی از مهم‌ترین سوالات در Authentication است.

ویژگیSessionJWT
محل نگهداری وضعیتمعمولاً Serverاطلاعات اصلی در Token
مناسب برایWeb Appهای سنتیAPI و معماری‌های Token-Based
نیاز به Session Storeمعمولاً بلهبرای Access Token الزاماً نه
ارسال در درخواستمعمولاً Cookieمعمولاً Authorization Header
Stateless بودنمعمولاً خیرمی‌تواند باشد
مدیریت Revocationنسبتاً ساده‌ترنیازمند طراحی بیشتر

این جدول به این معنی نیست که JWT همیشه بهتر از Session است.

انتخاب روش به معماری پروژه، نوع Client، نیازهای امنیتی و نحوه مدیریت Session بستگی دارد.


# JWT چه مزایایی دارد؟

برخی مزایای JWT عبارت‌اند از:

  • مناسب برای APIها
  • قابلیت استفاده بین سرویس‌های مختلف
  • ساختار استاندارد
  • امکان قرار دادن Claimهای مشخص
  • قابلیت اعتبارسنجی Signature
  • امکان طراحی Stateless برای Access Token
  • عدم نیاز اجباری به Session Server-Side برای هر Access Token

# JWT چه معایبی دارد؟

JWT نیز محدودیت‌هایی دارد.

1. لغو Token دشوارتر است

اگر JWT مدت زیادی اعتبار داشته باشد و بخواهید قبل از Expiration آن را باطل کنید، باید مکانیزم مناسبی برای Revocation طراحی کنید.

2. حجم Token

JWT معمولاً از یک Session ID ساده بزرگ‌تر است.

3. Payload محرمانه نیست

نباید اطلاعات حساس داخل آن قرار داد.

4. مدیریت Refresh Token

در سیستم‌های حرفه‌ای ممکن است به Access Token و Refresh Token نیاز داشته باشید و این موضوع معماری را پیچیده‌تر می‌کند.

5. سرقت Token

اگر Access Token در اختیار مهاجم قرار بگیرد، تا زمانی که معتبر است ممکن است بتواند از آن استفاده کند.

به همین دلیل حفاظت از Token بسیار مهم است.


# JWT و HTTPS

یکی از مهم‌ترین اصول استفاده از JWT این است که API باید از HTTPS استفاده کند.

فرض کنید Token شما:


eyJhbGciOi...

باشد.

اگر این Token در یک ارتباط ناامن ارسال شود، مهاجم ممکن است بتواند آن را سرقت کند.

بنابراین:


HTTP

برای انتقال اطلاعات حساس مناسب نیست.

از:


HTTPS

استفاده کنید.


# آیا JWT را در LocalStorage ذخیره کنیم؟

این موضوع به معماری و مدل تهدید پروژه بستگی دارد و یک پاسخ واحد برای همه پروژه‌ها وجود ندارد.

ذخیره Token در localStorage می‌تواند در صورت وجود آسیب‌پذیری XSS خطرناک باشد، زیرا JavaScript صفحه می‌تواند به آن دسترسی داشته باشد.

در بعضی معماری‌های وب، استفاده از Cookieهای امن و HttpOnly می‌تواند گزینه مناسبی باشد، اما در این حالت باید موضوعاتی مانند CSRF نیز به شکل صحیح مدیریت شوند.

بنابراین انتخاب محل ذخیره Token باید بر اساس معماری Frontend، نوع API و مدل تهدید انجام شود.


# JWT و XSS

اگر مهاجم بتواند JavaScript مخرب را در سایت اجرا کند، ممکن است بتواند به Tokenهایی که از طریق JavaScript قابل دسترسی هستند دسترسی پیدا کند.

به همین دلیل باید از XSS جلوگیری کرد.

مثلاً در نمایش داده‌های کاربر در HTML باید خروجی را متناسب با Context Encode کنیم:


echo htmlspecialchars(

    $username,

    ENT_QUOTES,

    'UTF-8'

);

همچنین Content Security Policy و سایر کنترل‌های امنیتی می‌توانند در کاهش ریسک XSS نقش داشته باشند.


# JWT و CSRF

اگر JWT را در Cookie قرار دهید، مرورگر ممکن است آن Cookie را در درخواست‌های مناسب ارسال کند.

در این حالت باید ملاحظات CSRF را جدی بگیرید.

در مقابل، اگر Token را در Authorization Header قرار دهید و JavaScript آن را به صورت صریح ارسال کند، مدل CSRF متفاوت خواهد بود.

بنابراین نوع ذخیره و ارسال Token روی طراحی امنیتی API تأثیر دارد.


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

JWT می‌تواند در سناریوهایی مانند موارد زیر مفید باشد:

  • REST API
  • اپلیکیشن موبایل
  • ارتباط بین سرویس‌ها
  • معماری‌های توزیع‌شده
  • سیستم‌هایی که Clientهای مختلف دارند
  • APIهایی که نیاز به Token-Based Authentication دارند

اما استفاده از JWT فقط به دلیل محبوب بودن آن دلیل کافی برای انتخابش نیست.

ابتدا معماری سیستم و نیازهای امنیتی را بررسی کنید.


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

اگر یک وب‌سایت ساده Server-Side Rendered دارید و فقط به Login معمولی نیاز دارید، Session و Cookie می‌توانند معماری ساده‌تری ایجاد کنند.

مثلاً:


PHP Website

+

Traditional Login

+

Session

+

Cookie

در چنین سناریویی ممکن است نیازی به JWT وجود نداشته باشد.


# JWT در Laravel

در Laravel نیز می‌توان سیستم Authentication برای API طراحی کرد.

اما Laravel به صورت پیش‌فرض الزام نمی‌کند که حتماً از JWT استفاده کنید.

بسته به معماری پروژه می‌توان از راهکارهای مختلفی برای Authentication API استفاده کرد.

بنابراین بهتر است ابتدا مفهوم JWT و Token Authentication را با PHP درک کنید و سپس روش مناسب را در Laravel انتخاب کنید.


# یک معماری کامل JWT Authentication

یک معماری ساده می‌تواند چنین ساختاری داشته باشد:


             Client

                |

                | Email + Password

                ↓

           Login Endpoint

                |

                ↓

       Verify Password Hash

                |

                ↓

          Create JWT

                |

                ↓

             Client

                |

                | Bearer Token

                ↓

        Protected Endpoint

                |

                ↓

         Validate JWT

                |

                ↓

          Identify User

                |

                ↓

            Response

این ساختار پایه بسیاری از APIهای Token-Based است.


# نکات امنیتی مهم هنگام استفاده از JWT

برای استفاده صحیح از JWT چند نکته بسیار مهم است:

1. Secret قوی استفاده کنید

Secret باید غیرقابل حدس و به اندازه کافی طولانی باشد.

2. Secret را داخل Git قرار ندهید

آن را در Environment یا Secret Management مناسب نگهداری کنید.

3. HTTPS استفاده کنید

Token باید در یک ارتباط امن منتقل شود.

4. Token را بیش از حد طولانی معتبر نکنید

Access Token با عمر کوتاه‌تر معمولاً ریسک سرقت طولانی‌مدت را کاهش می‌دهد.

5. Payload را محرمانه فرض نکنید

اطلاعات حساس را داخل JWT قرار ندهید.

6. Algorithm را صریح مدیریت کنید

Server نباید صرفاً به اطلاعات کنترل‌شده توسط Client برای انتخاب الگوریتم اعتماد کند.

7. Token را در Log ذخیره نکنید

ثبت کامل Access Token در Log می‌تواند یک ریسک امنیتی جدی ایجاد کند.

8. Refresh Token را جداگانه مدیریت کنید

در صورت استفاده از Refresh Token، چرخه عمر و Revocation آن را مشخص کنید.

9. Logout را فراموش نکنید

در معماری JWT باید از ابتدا مشخص کنید Logout و ابطال Token چگونه انجام می‌شود.


# تفاوت JWT با API Key

JWT و API Key یکی نیستند.

API Key معمولاً یک شناسه یا Secret ثابت‌تر برای شناسایی Client یا دسترسی به یک سرویس است.

JWT معمولاً شامل Claimها، زمان انقضا و Signature است.

مثلاً:


API Key

 ↓

Identify Client

در حالی که:


JWT

 ↓

Claims

 ↓

Signature

 ↓

Expiration

 ↓

Identify / Authorize

البته کاربرد دقیق هر دو به معماری سیستم بستگی دارد.


# آیا JWT جایگزین کامل Session است؟

خیر.

JWT و Session دو روش متفاوت برای مدیریت Authentication هستند.

Session برای بسیاری از وب‌سایت‌های سنتی انتخاب ساده و مناسبی است.

JWT نیز برای برخی APIها و معماری‌های Token-Based کاربرد زیادی دارد.

به جای اینکه همیشه یکی را بهتر بدانیم، باید بر اساس نیاز پروژه انتخاب کنیم.


# جمع‌بندی

JWT یا JSON Web Token یکی از روش‌های شناخته‌شده برای انتقال اطلاعات قابل اعتبارسنجی بین Client و Server است.

یک JWT از سه بخش تشکیل می‌شود:


Header.Payload.Signature

Header الگوریتم و نوع Token را مشخص می‌کند.

Payload شامل Claimها است.

Signature برای بررسی صحت Token استفاده می‌شود.

در PHP می‌توان با استفاده از کتابخانه‌هایی مانند firebase/php-jwt JWT ایجاد و اعتبارسنجی کرد.

یک جریان معمول Authentication با JWT به شکل زیر است:


Login

 ↓

Verify Password

 ↓

Generate JWT

 ↓

Client

 ↓

Authorization: Bearer TOKEN

 ↓

Verify JWT

 ↓

Access Protected Resource

با این حال JWT راه‌حل جادویی برای Authentication نیست. باید مواردی مانند HTTPS، مدیریت Secret، Expiration، XSS، CSRF، Token Revocation و Refresh Token را متناسب با معماری پروژه در نظر گرفت.


# سوالات متداول درباره JWT در PHP

JWT در PHP چیست؟

JWT یک Token ساختاریافته است که می‌تواند برای انتقال اطلاعات قابل اعتبارسنجی بین Client و Server استفاده شود و یکی از کاربردهای رایج آن Authentication در APIها است.

JWT از چه بخش‌هایی تشکیل شده است؟

JWT معمولاً از سه بخش Header، Payload و Signature تشکیل شده که با نقطه از یکدیگر جدا می‌شوند.

آیا Payload در JWT رمزنگاری شده است؟

خیر. JWT معمولی برای محرمانه‌سازی Payload طراحی نشده است و اطلاعات آن را نباید حساس یا محرمانه در نظر گرفت.

آیا JWT برای Authentication مناسب است؟

JWT می‌تواند برای Authentication در APIها و سیستم‌های Token-Based مناسب باشد، اما انتخاب آن باید بر اساس معماری و نیازهای امنیتی پروژه انجام شود.

JWT بهتر است یا Session؟

هیچ پاسخ عمومی برای همه پروژه‌ها وجود ندارد. Session برای بسیاری از وب‌سایت‌های سنتی مناسب است و JWT می‌تواند برای برخی APIها و Clientهای مختلف کاربرد مناسبی داشته باشد.

آیا JWT را می‌توان با PHP ساخت؟

بله. PHP به صورت Built-in استاندارد مشخصی برای JWT ندارد، اما می‌توان از کتابخانه‌های معتبر PHP مانند firebase/php-jwt استفاده کرد.

Access Token و Refresh Token چه تفاوتی دارند؟

Access Token معمولاً برای دسترسی به Resourceهای محافظت‌شده استفاده می‌شود و عمر کوتاه‌تری دارد. Refresh Token برای دریافت Access Token جدید در معماری‌هایی که از آن استفاده می‌کنند به کار می‌رود.

آیا JWT باید در HTTPS ارسال شود؟

بله. Tokenهای Authentication باید از طریق ارتباط امن HTTPS منتقل شوند تا خطر شنود و سرقت Token کاهش پیدا کند.

آیا JWT جایگزین Session است؟

JWT می‌تواند در بعضی معماری‌ها جایگزین مدل سنتی Session شود، اما جایگزین عمومی و ضروری برای Session نیست. انتخاب بین آن‌ها به نوع پروژه و معماری سیستم بستگی دارد.

نظرات (0)

نظرات پس از تأیید مدیر نمایش داده می‌شوند

هنوز نظری ثبت نشده است؛ اولین نفر باشید!

مقالات مرتبط

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

۲۴ دقیقه
ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

۲۲ دقیقه
ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

۲۲ دقیقه
مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

۲۲ دقیقه