📝 BLOG

JSON Web Token (JWT): دليل المصادقة والأمان

JSON Web Token (JWT) هو رمز معيار مفتوح يستخدم للمصادقة وتبادل المعلومات في تطبيقات الويب. يغطي هذا الدليل هيكل JWT وحالات الاستخدام ومخاطر الأمان وأفضل الممارسات.

آخر تحديث:

إعداد: Gsetsoft

JSON Web Token (JWT): دليل المصادقة والأمان

ما هو JWT؟

JWT (JSON Web Token) هو تنسيق رمز مدمج وآمن لـ URL، محدد في RFC 7519، يستخدم لتبادل المعلومات بشكل آمن بين الأطراف.

يتكون JWT من ثلاثة أجزاء: Header وPayload وSignature. هذه الأجزاء الثلاثة مفصولة بنقاط (.): xxxxx.yyyyy.zzzzz

يوفر مصادقة بدون حالة. بدلاً من تخزين بيانات الجلسة في قاعدة بيانات، يرسل الخادم الرمز إلى العميل. العميل يرسل الرمز مع كل طلب.

حالات الاستخدام: مصادقة API، SSO (تسجيل دخول موحد)، المصادقة بين microservices، تفويض تطبيقات الجوال.

هيكل JWT

Header: يحتوي على نوع الرمز (JWT) وخوارزمية التوقيع (HS256، RS256، ES256). مشفر بـ Base64URL.

Payload: يحتوي على claims. Registered claims (iss، sub، aud، exp، nbf، iat، jti)، public claims وprivate claims. مشفر بـ Base64URL.

Signature: Header وPayload المشفران بـ Base64URL يُدمجان بنقطة ويُوقّعان بمفتاح سري. HS256 يستخدم HMAC-SHA256، RS256 يستخدم RSA-SHA256.

مثال: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

تدفق استخدام JWT

1. يرسل المستخدم طلباً إلى endpoint تسجيل الدخول مع اسم المستخدم وكلمة المرور.

2. يتحقق الخادم من بيانات الاعتماد وينشئ JWT. يتم إرجاع الرمز في body الاستجابة أو cookie.

3. يخزن العميل الرمز في localStorage أو cookie httpOnly.

4. في الطلبات اللاحقة، يرسل العميل JWT كـ Bearer token في header Authorization: Authorization: Bearer <token>

5. يتحقق الخادم من الرمز (فحص التوقيع والانتهاء). إذا كان صالحاً، يعالج الطلب؛ إذا لم يكن، يُرجع 401 Unauthorized.

مخاطر الأمان

سرقة الرمز: يمكن سرقة الرمز في localStorage عبر هجوم XSS. استخدم cookie httpOnly لتقليل خطر XSS.

عمر الرمز: Access token قصير (15-30 دقيقة) + refresh token طويل (7-30 يوم). أدر refresh token при كل استخدام.

الارتباك في الخوارزمية: خوارزمية 'none' أو تبديل RS256→HS256. حدد الخوارزمية كثابت على جانب الخادم، لا تأخذها من الرمز.

البيانات الحساسة: Payload JWT مشفر بـ Base64، غير مشفر. لا تضع بيانات حساسة (كلمة مرور، بطاقة ائتمان) في payload.

حجم الرمز: JWT أكبر من cookie جلسة. يُرسل مع كل طلب. اجعل payload minimal.

أفضل الممارسات

رموز قصيرة العمر: Access token 15-30 دقيقة، refresh token 7-30 يوم. الرموز المنتهية تصبح غير صالحة تلقائياً.

Cookie httpOnly + Secure + SameSite: خزّن الرمز في cookie httpOnly. JavaScript لا يمكنه الوصول (حماية XSS). Secure (HTTPS فقط). SameSite (حماية CSRF).

تدوير الرمز: يتم تجديد refresh token при كل استخدام. refresh token القديم يصبح غير صالح. يحد من وصول المهاجم في حالة سرقة الرمز.

Blacklist/revocation: استخدم blacklist لإلغاء الرموز. خزّن الرموز الملغاة في Redis. استخدم لـ logout وأحداث الأمان.

الخوارزمية: RS256 (غير متماثل) موصى به للإنتاج. وقّع بالمفتاح الخاص، تحقق بالمفتاح العام. HS256 (متماثل) فقط لخدمة واحدة.

التحقق: تحقق من التوقيع وissuer (iss) وaudience (aud) وانتهاء (exp) في كل طلب. تأكد من اجتياز جميع الفحوصات قبل الوثوق بالرمز.

JWT vs المصادقة المعتمدة على الجلسة

JWT: بدون حالة، scaling أفقي سهل، مثالي لـ microservices، حجم رمز كبير، صعب الإلغاء.

Session: مع حالة، يتطلب تخزيناً جانب الخادم، يحتاج sticky session أو shared store للscaling الأفقي، حجم رمز صغير، سهل الإلغاء.

معايير الاختيار: بنية microservices → JWT. تطبيق monolithic → Session. تطبيق جوال → JWT. متطلب أمان عالٍ → Session + JWT hybrid.

نهج hybrid: JWT قصير العمر (access token) + session store (refresh token). يجمع مزايا كليهما.

اختيار الخصوصية

تدعم ملفات الارتباط الأساسية الأمان والجلسات. نعد الزيارات الأساسية أيضًا؛ وبموافقتك نفعّل تحليلات استخدام إضافية. سياسة ملفات الارتباط