security · 7 دقائق قراءة

ما هو رمز JWT، وما ليس هو

سلسلة طويلة فيها نقطتان، وقسمها الأوسط مستند JSON مقروء يستطيع كل من يحمل الرمز أن يطبعه.

رمز JSON Web Token طريقة لحمل وقائع يستطيع المستلم التحقّق منها دون أن يسأل أحدًا. هذه هي الفكرة كلها، وشقّاها كلاهما مهمّ: الوقائع ظاهرة، والتحقّق يجري دون اتّصال.

الأجزاء الثلاثة

قسّمه عند النقاط تحصل على ترويسة وحمولة وتوقيع.

الترويسة تسمّي خوارزمية التوقيع. الحمولة كائن JSON من الادّعاءات. كلاهما Base64، بالصيغة الآمنة للروابط — وذلك ترميز لا تعمية، فكلاهما مقروء بوضوح لكل من يملك الرمز.

يُحسب التوقيع على الجزأين الأولين بسرّ أو بمفتاح خاص. غيّر محرفًا واحدًا من الحمولة فلا يعود التوقيع مطابقًا.

ماذا يثبت التوقيع فعلًا

أن الرمز أصدره من يملك المفتاح، وأنه لم يُعدَّل منذ ذلك.

لا يثبت شيئًا عمّن يقدّمه. الرمز المسروق رمز صالح — فالتوقيع جيّد بالقدر نفسه في يد مهاجم، ولهذا يكون رمز JWT بيان اعتماد لحامله ويجب حمايته كما تُحمى كلمة المرور.

هو أيضًا لا يخفي شيئًا. هذا هو الجزء الذي يوقع الناس: فالتوقيع والتعمية عمليتان مختلفتان، ورمز JWT القياسي لا يفعل إلا الأولى.

الادّعاءات التي تستحقّ المعرفة

exp — الانتهاء، طابعًا زمنيًّا يونكس بالثواني. هو أول ما تفحصه حين يُرفض رمز.

iat — وقت الإصدار. nbf — غير صالح قبل.

sub — الموضوع، وهو غالبًا معرّف المستخدم. iss — من أصدره. aud — لمن هو.

هذا الزوج الأخير أهمّ ممّا يبدو. فالخدمة التي تتحقّق من التوقيع وتتجاهل الجمهور ستقبل رمزًا صالحًا صدر لخدمة أخرى تمامًا.

لماذا تُستعمل

معرّف الجلسة التقليدي سلسلة عشوائية لا تعني شيئًا وحدها، فكل طلب يكلّف بحثًا في قاعدة البيانات لمعرفة صاحبه.

رمز JWT يحمل الجواب معه. فأي خدمة تملك المفتاح تستطيع التحقّق منه وقراءة معرّف المستخدم دون أن تسأل أحدًا — ولهذا تناسب الأنظمة الموزّعة وكل ما يعبر حدود الخدمات.

الكلفة، وهي الإبطال

لا يحتفظ الخادم بأي سجلّ للرمز، فلا شيء تحذفه حين تريد إيقافه.

يغيّر مستخدم كلمة مروره، أو يترك موظّف عمله، أو يُسرق رمز — ويبقى كل رمز صادر صالحًا حتى ينتهي. لا شيء في الصيغة يسمح بغير ذلك.

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

هذه هي المقايضة الحقيقية، ويجدر أن تُعقد عن قصد لا أن تُكتشف أثناء حادثة.

الأخطاء المتكرّرة

تصديق الترويسة. الرمز يذكر خوارزميته بنفسه، والمتحقّق الذي يصدّقه يمكن أن يُسلَّم alg: none ويُطلب منه قبول رمز غير موقَّع. ثبّت الخوارزمية على جهة الخادم.

وضع بيانات حسّاسة في الحمولة. عناوين البريد والأسماء والمعرّفات الداخلية — كلها منشورة لكل من يحمل الرمز.

تخزين الرموز في التخزين المحلّي. تقرؤها أي شفرة في الصفحة، فتتحوّل ثغرة برمجة نصية عابرة للمواقع واحدة إلى استيلاء كامل على الحساب. أما كوكي من نوع http-only فلا تصله JavaScript.

ألّا ينتهي أبدًا. الرمز الذي بلا exp بيان اعتماد دائم لا تستطيع سحبه.

الأسرار الضعيفة. المفتاح المتماثل الذي هو كلمة من قاموس يمكن استخراجه دون اتّصال من رمز واحد، وعندها يستطيع أي أحد أن يصكّ رمزه بنفسه.

كيف تقرأ واحدًا

فكّ رمز يُظهر الترويسة والحمولة فورًا، وهو أسرع طريق للجواب عن «لماذا رُفض هذا» — فالانتهاء والجمهور والمُصدِر هم القصة كلها عادةً.

افعل ذلك محلّيًّا. الرمز بيان اعتماد حيّ، ولصقه في موقع يعني تسليم ذلك الموقع جلسة موثَّقة. الفكّ ليس إلا Base64 وتحليل JSON، ولا يحتاج خادمًا، فالفاكّ الذي يرسل الرمز إلى مكان ما يطلب شيئًا لا يحتاجه.

الخلاصة

موقَّع لا معمّى: الحمولة علنية لكل من يحمل الرمز. التوقيع يثبت أنه لم يُعدَّل ولا يقول شيئًا عمّن يحمله. لا تستطيع إبطال واحد دون التخلّي عن الخاصّية التي جعلته جذّابًا.

أسئلة

ما رمز JWT؟

سلسلة من ثلاثة أجزاء تفصلها نقاط: ترويسة تقول كيف وُقّع، وحمولة فيها ادّعاءات، وتوقيع. الأولان بترميز Base64 ويقرؤهما أي أحد. التوقيع يثبت أن الجزأين الآخرين لم يعبث بهما من لا يملك المفتاح.

هل رمز JWT معمّى؟

ليس افتراضيًّا. رمز JWT القياسي موقَّع لا معمّى، فالحمولة علنية لكل من يحمل الرمز — الصق واحدًا في فاكّ وستظهر كل الادّعاءات. توجد صيغة معمّاة اسمها JWE، وهي أقل استعمالًا بكثير.

هل يجوز وضع بيانات المستخدم في رمز JWT؟

فقط البيانات التي ترضى بنشرها لمن يحمل الرمز. معرّف المستخدم ودوره أمر عادي. عنوان البريد إفشاء. أي شيء حسّاس لا مكان له في رمز موقَّع، لأن التوقيع يمنع العبث ولا يفعل شيئًا حيال القراءة.

لماذا لا أستطيع تسجيل خروج مستخدم من رمز JWT؟

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

ماذا يعني exp في رمز JWT؟

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

أدوات من هذا الدليل

المزيد من أدوات الأمان — كلّها تعمل في متصفّحك، ولا واحدة منها ترفع ملفًّا.