رمز JSON Web Token طريقة لحمل وقائع يستطيع المستلم التحقّق منها دون أن يسأل أحدًا. هذه هي الفكرة كلها، وشقّاها كلاهما مهمّ: الوقائع ظاهرة، والتحقّق يجري دون اتّصال.
الأجزاء الثلاثة
قسّمه عند النقاط تحصل على ترويسة وحمولة وتوقيع.
الترويسة تسمّي خوارزمية التوقيع. الحمولة كائن JSON من الادّعاءات. كلاهما Base64، بالصيغة الآمنة للروابط — وذلك ترميز لا تعمية، فكلاهما مقروء بوضوح لكل من يملك الرمز.
يُحسب التوقيع على الجزأين الأولين بسرّ أو بمفتاح خاص. غيّر محرفًا واحدًا من الحمولة فلا يعود التوقيع مطابقًا.
ماذا يثبت التوقيع فعلًا
أن الرمز أصدره من يملك المفتاح، وأنه لم يُعدَّل منذ ذلك.
لا يثبت شيئًا عمّن يقدّمه. الرمز المسروق رمز صالح — فالتوقيع جيّد بالقدر نفسه في يد مهاجم، ولهذا يكون رمز JWT بيان اعتماد لحامله ويجب حمايته كما تُحمى كلمة المرور.
هو أيضًا لا يخفي شيئًا. هذا هو الجزء الذي يوقع الناس: فالتوقيع والتعمية عمليتان مختلفتان، ورمز JWT القياسي لا يفعل إلا الأولى.
الادّعاءات التي تستحقّ المعرفة
exp — الانتهاء، طابعًا زمنيًّا يونكس بالثواني. هو أول ما تفحصه حين يُرفض رمز.
iat — وقت الإصدار. nbf — غير صالح قبل.
sub — الموضوع، وهو غالبًا معرّف المستخدم. iss — من أصدره. aud — لمن هو.
هذا الزوج الأخير أهمّ ممّا يبدو. فالخدمة التي تتحقّق من التوقيع وتتجاهل الجمهور ستقبل رمزًا صالحًا صدر لخدمة أخرى تمامًا.
لماذا تُستعمل
معرّف الجلسة التقليدي سلسلة عشوائية لا تعني شيئًا وحدها، فكل طلب يكلّف بحثًا في قاعدة البيانات لمعرفة صاحبه.
رمز JWT يحمل الجواب معه. فأي خدمة تملك المفتاح تستطيع التحقّق منه وقراءة معرّف المستخدم دون أن تسأل أحدًا — ولهذا تناسب الأنظمة الموزّعة وكل ما يعبر حدود الخدمات.
الكلفة، وهي الإبطال
لا يحتفظ الخادم بأي سجلّ للرمز، فلا شيء تحذفه حين تريد إيقافه.
يغيّر مستخدم كلمة مروره، أو يترك موظّف عمله، أو يُسرق رمز — ويبقى كل رمز صادر صالحًا حتى ينتهي. لا شيء في الصيغة يسمح بغير ذلك.
الحلول المعتادة كلها تتنازل عن شيء. فالانتهاء القصير مع رموز تجديد يضيّق النافذة ويضيف بيان اعتماد ثانيًا تديره. قائمة المنع تعمل، لكنها تعيد البحث في كل طلب الذي اختيرت الصيغة لتفاديه. رقم نسخة على سجلّ المستخدم يُقارَن بادّعاء هو المقايضة نفسها بحجم أصغر.
هذه هي المقايضة الحقيقية، ويجدر أن تُعقد عن قصد لا أن تُكتشف أثناء حادثة.
الأخطاء المتكرّرة
تصديق الترويسة. الرمز يذكر خوارزميته بنفسه، والمتحقّق الذي يصدّقه يمكن أن يُسلَّم alg: none ويُطلب منه قبول رمز غير موقَّع. ثبّت الخوارزمية على جهة الخادم.
وضع بيانات حسّاسة في الحمولة. عناوين البريد والأسماء والمعرّفات الداخلية — كلها منشورة لكل من يحمل الرمز.
تخزين الرموز في التخزين المحلّي. تقرؤها أي شفرة في الصفحة، فتتحوّل ثغرة برمجة نصية عابرة للمواقع واحدة إلى استيلاء كامل على الحساب. أما كوكي من نوع http-only فلا تصله JavaScript.
ألّا ينتهي أبدًا. الرمز الذي بلا exp بيان اعتماد دائم لا تستطيع سحبه.
الأسرار الضعيفة. المفتاح المتماثل الذي هو كلمة من قاموس يمكن استخراجه دون اتّصال من رمز واحد، وعندها يستطيع أي أحد أن يصكّ رمزه بنفسه.
كيف تقرأ واحدًا
فكّ رمز يُظهر الترويسة والحمولة فورًا، وهو أسرع طريق للجواب عن «لماذا رُفض هذا» — فالانتهاء والجمهور والمُصدِر هم القصة كلها عادةً.
افعل ذلك محلّيًّا. الرمز بيان اعتماد حيّ، ولصقه في موقع يعني تسليم ذلك الموقع جلسة موثَّقة. الفكّ ليس إلا Base64 وتحليل JSON، ولا يحتاج خادمًا، فالفاكّ الذي يرسل الرمز إلى مكان ما يطلب شيئًا لا يحتاجه.
الخلاصة
موقَّع لا معمّى: الحمولة علنية لكل من يحمل الرمز. التوقيع يثبت أنه لم يُعدَّل ولا يقول شيئًا عمّن يحمله. لا تستطيع إبطال واحد دون التخلّي عن الخاصّية التي جعلته جذّابًا.