How-To Guides

بناء مصادقة JWT صلبة: دليل عملي

أصبحت رموز JSON Web (JWT) المعيار للمصادقة غير الحالة في تطبيقات الويب الحديثة. ومع ذلك، غالبًا ما تؤدي ملاءمتها إلى أخطاء أمنية حرجة. نظرًا لأن رموز JWT مكتفية ذاتيًا، فإن أي خادم يتحقق منها يثق في الحمولة دون التحقق من قاعدة بيانات مركزية. يتطلب هذا الاختيار التصميمي من المطورين أن يكونوا دقيقين في كيفية توليد الرموز ونقلها والتحقق منها. يوضح هذا الدليل الممارسات الأمنية الأساسية لمنع الثغرات الشائعة مثل اعتراض الرموز، وهجمات خلط الخوارزميات، والوصول غير المصرح به.

1. استخدام أوقات انتهاء صلاحية قصيرة ورموز التحديث

الخطأ الأكثر شيوعًا الذي يرتكبه المطورون هو إصدار رموز JWT بأوقات انتهاء صلاحية طويلة، مثل 24 ساعة أو أكثر. إذا سُرقت الرمز، فإن المهاجم يحصل على وصول طوال مدة الصلاحية تلك. بدلاً من ذلك، استخدم رمز وصول قصير العمر (مثل 15 دقيقة) مقترنًا برمز تحديث أطول العمر.

يتعامل رمز الوصول مع طلبات API الفورية، بينما يُستخدم رمز التحديث، المخزن بأمان على جانب الخادم، لإصدار رموز وصول جديدة. هذا يحد من نافذة الفرصة للمهاجم. إذا كان لا بد لك من إصدار رموز طويلة العمر، فتأكد من وجود آلية لحظر الرموز المخترقة في ذاكرة مؤقتة موزعة مثل Redis.

2. فرض HTTPS وملفات تعريف ارتباط HttpOnly

لا تنقل رموز JWT أبدًا في عنوان URL أو كمعاملات استعلام، فقد يتم تسجيلها في سجلات وصول الخادم أو سجل المتصفح. لتطبيقات الويب، فإن تخزين الرمز في ملف تعريف ارتباط httpOnly وSecure هو الطريقة الأكثر أمانًا. يمنع هذا هجمات البرمجة من جانب العميل (XSS) من قراءة الرمز عبر JavaScript. للتطبيقات المحمولة أو الأصلية، حيث تكون ملفات تعريف الارتباط أقل عملية، خزّن الرمز في تخزين آمن (مثل iOS Keychain أو Android Keystore) واستخدم HTTPS دائمًا.

3. تثبيت الخوارزمية لمنع هجمات الخلط

تحدث ثغرة أمنية كبيرة عندما يقبل الخادم أي خوارزمية مقدمة في ترويسة JWT. يمكن للمهاجمين تغيير الخوارزمية من RS256 (غير متماثل) إلى HS256 (متماثل) وتوقيع الرمز بالمفتاح العام، والذي قد يستخدمه الخادم عن طريق الخطأ كمفتاح سري. لمنع ذلك، تحقق صراحةً من أن الخوارزمية في ترويسة الرمز تطابق الخوارزمية المتوقعة.

import jwt from 'jsonwebtoken';

const verifyToken = (token, publicKey) => {
  try {
    // حدد صراحةً الخوارزميات المسموح بها
    const decoded = jwt.verify(token, publicKey, {
      algorithms: ['RS256'] 
    });
    return decoded;
  } catch (err) {
    // تعامل مع الرموز غير الصالحة أو الخوارزميات الخاطئة
    throw new Error('فشل التحقق من الرمز');
  }
};

4. تدوير مفاتيح التوقيع بانتظام

إذا تم اختراق مفتاح التوقيع الخاص بك، تظل جميع الرموز الصادرة سابقًا صالحة حتى تنتهي صلاحيتها. للتخفيف من هذا الخطر، نفذ تدوير المفاتيح. استخدم معرّفات المفاتيح (kid) في ترويسة JWT لتحديد المفتاح الذي وقّع الرمز. يتيح لك هذا توزيع عدة مفاتيح عامة وتدوير الأسرار دون إبطال جميع الجلسات الحالية. يمكن لأنظمة إدارة المفاتيح الآلية مثل HashiCorp Vault أن تساعد في التعامل مع هذه العملية بأمان.

5. التحقق من المطالبات بدقة

تحقق دائمًا من مطالبات iss (الجهة المصدرة) وaud (الجمهور). بدون ذلك، يمكن استخدام رمز صادر من الخدمة A للوصول إلى الخدمة B إذا كانتا تشتركان في نفس مفتاح التوقيع. تأكد من أن منطق التحقق الخاص بك يفحص هذه المطالبات مقابل القيم المتوقعة لبيئة تطبيقك المحددة.

الخاتمة

تأمين مصادقة JWT لا يتعلق فقط بالتشفير والتوقيع؛ بل يتعلق بإدارة دورة حياة الرمز بأكملها. من خلال تنفيذ أوقات انتهاء صلاحية قصيرة، واستخدام آليات تخزين آمنة، وتثبيت الخوارزميات، وتدوير المفاتيح، تقلل بشكل كبير من سطح الهجوم. تعامل دائمًا مع رمز JWT كمصداق حامل — إذا وقع في الأيدي الخطأ، فإنه يمنح وصولًا كاملًا. اعتمد هذه الممارسات لبناء أنظمة مصادقة قوية وآمنة يمكن للمستخدمين وأصحاب المصلحة الوثوق بها.

Share: