أمان · مدة القراءة: 3 د ·

ماذا يوجد داخل JWT، ولماذا فك الترميز ليس تحققًا

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

JWT ‏(JSON Web Token) هو السلسلة الطويلة التي تُبقيك مسجّل الدخول في كثير من تطبيقات الويب وواجهات API. يبدو مشفّرًا، لكنه في أغلب الحالات ليس كذلك: كل من يملك الرمز يستطيع قراءة ما بداخله.

ثلاثة أجزاء تفصل بينها نقاط

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI0MiJ9.3q2-7w…
└ header ──────────┘ └ payload ───────┘ └ signature

يوضح الـ header طريقة توقيع الرمز، مثل HS256 أو RS256. ويحمل الـ payload المطالبات (claims): من هو المستخدم (sub)، ومتى صدر الرمز (iat)، ومتى تنتهي صلاحيته (exp)، إضافة إلى ما يضيفه التطبيق مثل الأدوار. كلاهما مجرد JSON مُرمّز بـ base64url، وهذا ترميز وليس تشفيرًا.

التوقيع هو المهم

الجزء الثالث توقيع على الجزأين الأولين، يُنشأ بسرّ أو بمفتاح خاص. لا يستطيع التحقق منه إلا خادم يملك المفتاح الصحيح. إذا غيّر أحدهم محرفًا واحدًا في الـ payload، مثل تغيير الدور من user إلى admin، يتوقف التوقيع عن المطابقة.

فك الترميز ليس تحققًا

الرمز الذي يُفك ترميزه بنجاح يخبرك بما يدّعيه، لا بما إذا كانت ادعاءاته صحيحة. يجب على الخادم الخلفي أن يتحقق من التوقيع بالمفتاح، وأن يرفض الرموز التي انقضى exp الخاص بها، وألا يقبل إلا الخوارزميات المتوقعة، وألا يقبل «none» أبدًا. مكتبات JWT تفعل ذلك نيابة عنك، وتجاوزه ثغرة كلاسيكية.

قواعد عملية

لا تضع أسرارًا مثل كلمات المرور في الـ payload لأنه مقروء. اجعل مدة الصلاحية قصيرة. تعامل مع الرمز ككلمة مرور ما دام صالحًا: كل من ينسخه يستطيع استخدامه حتى تنتهي صلاحيته.

أين تحفظ الرمز في المتصفح

كل ما يُحفظ في localStorage يمكن لأي سكربت في الصفحة قراءته، لذا تكفي ثغرة واحدة من نوع XSS لتسريب الرمز. أما ملف تعريف الارتباط HttpOnly فلا يمكن لـ JavaScript قراءته إطلاقًا، وهذا يزيل ذلك الخطر؛ اجمعه مع السمتين Secure و SameSite ومع حماية من تزوير الطلبات بين المواقع (CSRF). لا يوجد خيار مثالي، لكن ملفات تعريف الارتباط HttpOnly هي الخيار الافتراضي الأكثر أمانًا لرموز الجلسات.

انتهاء الصلاحية ورموز التحديث

لا يمكن "تسجيل خروج" رمز JWT بمفرده: يبقى صالحًا حتى وقت exp ما لم يحتفظ الخادم بقائمة إلغاء. لهذا تعيش رموز الوصول عادة دقائق لا أيامًا. ويُستخدم رمز تحديث أطول عمرًا، يُحفظ بعناية أكبر ويُتحقق منه على الخادم، للحصول على رمز وصول جديد عندما تنتهي صلاحية القديم.

الحقول الشائعة في لمحة

iss  المُصدِر       من أنشأ الرمز
sub  الموضوع        المستخدم أو العميل الذي يخصه
aud  الجمهور        الخدمة التي يجب أن تقبله
exp  الانتهاء       وقت Unix الذي يصبح بعده غير صالح
nbf  ليس قبل        وقت Unix الذي يكون قبله غير صالح
iat  وقت الإصدار    وقت Unix الذي أُنشئ فيه

حقول الوقت هي طوابع زمنية Unix بالثواني. يجب على الخادم أن يتحقق من aud إلى جانب exp: الرمز الصالح الصادر لخدمة ما لا ينبغي أن تقبله خدمة أخرى.

قراءة رمز

تقسّم أداة فك ترميز JWT من 4Dev الرمز إلى أجزائه وتعرض الـ header والـ payload بصيغة JSON مقروءة. إنها تفك الترميز فقط ولا تتحقق من التوقيع. يُرسل الرمز إلى خادم 4Dev لفك ترميزه ولا يُسجَّل ولا يُحفظ، ومع ذلك تجنّب لصق رموز إنتاج فعّالة، وألغِ أي رمز تظن أنه تسرّب.

افتح أداة فك ترميز JWT

LinkedInXFacebook