فك ترميز JWT وقراءة محتواه: ما بداخل التوكن وما لا يعنيه توقيعه

تسجّل الدخول إلى تطبيق، وبعدها ترى في أدوات المطوّر سلسلة طويلة تبدأ بالحروف eyJ وفيها نقطتان. هذا رمز JWT. تظن أنه مشفّر ولا يمكن قراءته، ثم تكتشف أنك تستطيع قراءة معظمه في ثوانٍ دون أي مفتاح. وهذا الاكتشاف يحمل درساً أمنياً مهماً سنصل إليه.
ثلاثة أجزاء تفصلها نقطتان
رمز JWT يتكون من ثلاثة أجزاء، كل جزء مكتوب بصيغة Base64 الآمنة للروابط:
- الترويسة (Header): تقول أي خوارزمية استُخدمت للتوقيع، ونوع الرمز.
- البيانات (Payload): الحقول التي يحملها الرمز، وتسمى «claims»: من هو المستخدم، ومتى صدر الرمز، ومتى ينتهي.
- التوقيع (Signature): بصمة تُحسب من الجزأين الأولين بمفتاح سري، وهدفها كشف التلاعب.
الجزآن الأولان ليسا سرّيين. هما مجرد ترميز، ولذلك يفكّهما فك ترميز JWT في سهل فوراً ويعرضهما بصورة مقروءة. وهذه هي النقطة الجوهرية: ما يوضع داخل JWT يراه كل من يحمله، فلا تضع فيه كلمة مرور ولا بياناتك الحساسة.
الحقول التي ستراها غالباً
أغلب الرموز تحمل مجموعة حقول معيارية قصيرة الأسماء:
- sub: صاحب الرمز، وغالباً معرّف المستخدم.
- iss: الجهة التي أصدرت الرمز.
- aud: الجهة المقصودة بالرمز.
- iat: وقت الإصدار.
- exp: وقت الانتهاء، وهو أكثر ما يُسأل عنه.
- nbf: الوقت الذي لا يصلح الرمز قبله.
الأوقات في هذه الحقول مخزّنة كأرقام طويلة، أي ثوانٍ منذ بداية عام 1970، ولا يقرؤها الإنسان مباشرة. الأداة تحوّلها إلى تاريخ مقروء وتقول لك إن كان الرمز منتهياً الآن. وإن أردت تحويل رقم من هذا النوع بنفسك فاستخدم محوّل الطابع الزمني.
الفرق بين الفك والتحقق
هذه أهم فكرة في المقال. فك الترميز يعني قراءة المحتوى، وهو متاح للجميع. أما التحقق فيعني التأكد أن التوقيع صحيح، أي أن الرمز صدر فعلاً من الجهة التي تدّعيها ولم يتغيّر حرف منه. والتحقق يحتاج المفتاح السري أو المفتاح العام للجهة المصدرة.
الأداة لا تتحقق من التوقيع ولا تطلب منك المفتاح، وهذا مقصود. المفتاح السري لا يُدخل في صفحة ويب بأي حال، وأي أداة تطلبه منك يجب أن تثير شكّك.
والنتيجة العملية: حين ترى الأداة تعرض رمزاً بحقول سليمة وتاريخ انتهاء مقبولاً، فهذا لا يعني أنه صالح. ربما عُدّل المحتوى بعد التوقيع، وربما صُنع الرمز كله من شخص آخر. الخادم وحده، ومعه المفتاح، هو من يقرر الصلاحية.
أخطاء أمنية شائعة مع JWT
تفكيك الرمز يكشف أحياناً مشكلات في التصميم لا في الأداة. أكثرها تكراراً:
- بيانات حساسة داخل الرمز: رقم هاتف كامل، أو عنوان، أو دور إداري لا يُفترض أن يعرفه المستخدم. كل ما في البيانات مقروء لحامله.
- مدة صلاحية طويلة جداً: رمز ينتهي بعد أشهر يعني أن سرقته تمنح المهاجم وقتاً طويلاً قبل أن يتوقف.
- خوارزمية «none»: ترويسة تقول إن الرمز بلا توقيع. الخادم السليم يرفضها دائماً، وظهورها في رمز حقيقي إنذار خطير.
- الاعتماد على الواجهة وحدها: قراءة الدور من الرمز في المتصفح لإخفاء زر أمر مقبول للعرض، لكن القرار الفعلي بالصلاحية يجب أن يُتخذ في الخادم.
خطوات الاستخدام
- انسخ الرمز كاملاً من استجابة تسجيل الدخول أو من ترويسة الطلب. انتبه لحذف كلمة Bearer إن كانت ملتصقة به.
- الصقه في الأداة.
- اقرأ الترويسة والبيانات، وانظر إلى تاريخ الإصدار والانتهاء وهل مرّ الوقت.
- إن ظهرت رسالة خطأ فعدد الأجزاء غالباً ليس ثلاثة، أو أن النسخ قُطع في منتصفه.
سيناريو واقعي
مطوّر واجهة أمامية يشتكي من أن المستخدمين يُطرَدون من التطبيق بعد وقت قصير من الدخول. يلصق الرمز الذي يُرجعه الخادم في الأداة فيرى أن الفرق بين iat وexp خمس عشرة دقيقة فقط. لم يكن الخلل في الواجهة، بل في إعداد الخادم لمدة الصلاحية. ثم يلاحظ أن حقل aud يشير إلى خدمة غير التي يتصل بها تطبيقه، فيفهم أيضاً سبب رفض بعض الطلبات بعد تجديد الرمز. كل هذا ظهر في دقيقة واحدة دون الحاجة إلى مفتاح أو إلى الاطلاع على شيفرة الخادم.
أسئلة شائعة
هل يُرسل التوكن الخاص بي إلى خادم؟
لا. فك الترميز يجري كله داخل متصفحك. وهذا مهم لأن رمز الدخول الصالح يمنح من يمتلكه صلاحيات صاحبه إلى أن ينتهي، فلا يصح لصقه في موقع يرسله إلى خادم آخر.
هل يمكنني استخدام رمز حقيقي لحساب فعال للتجربة؟
الأفضل رمز تجريبي أو رمز منتهي الصلاحية. وإن اضطررت لفحص رمز فعّال فاعلم أن الأداة لا ترسله، لكن تجنّب لصقه في أي مكان آخر، وأنهِ الجلسة بعد ذلك إن أمكن.
لماذا يقول إن الرمز منتهٍ وأنا ما زلت مسجلاً دخولي؟
قد يكون هذا رمز وصول قصير العمر، بينما جلستك قائمة بفضل رمز تجديد منفصل يعيد إصدار رموز جديدة تلقائياً. فلا تعارض بين الأمرين.
ما سبب رسالة «غير صالح الصيغة»؟
أسباب شائعة: نسخ جزء من الرمز فقط، أو لصق معه كلمة Bearer، أو وجود مسافات وأسطر جديدة، أو أن السلسلة ليست JWT أصلاً بل رمزاً معتماً من نوع آخر لا يمكن قراءته.
هل تغيّر الأداة الرمز الذي ألصقته؟
لا، هي تقرؤه فقط ولا تعدّل فيه شيئاً، ويبقى الرمز الأصلي في الحافظة صالحاً كما كان.
هل JWT مشفّر؟
JWT الأكثر شيوعاً موقَّع لا مشفَّر، أي أن محتواه مقروء لمن يحمله. توجد صيغ مشفّرة، لكنها نادرة وتبدو بخمسة أجزاء لا ثلاثة، ولا تستطيع أداة تفك الترميز العادي قراءتها دون المفتاح.



