ما هو JWT؟ شرح رموز JSON Web Token
رمز JSON Web Token (اختصاراً JWT) سلسلة نصية مضغوطة تحمل مجموعة من المطالبات (claims) — عبارات مثل «هذا هو المستخدم 42، بدور مدير، صالح حتى الساعة 15:00» — إلى جانب توقيع تشفيري يتيح للمستقبل التأكد من أن المطالبات صادرة عن جهة يثق بها ولم تُعدَّل. رموز JWT هي الصيغة القياسية لمصادقة واجهات API ورموز وصول OAuth 2.0 ورموز هوية OpenID Connect.
يشرح هذا الدليل ما بداخل الرمز، ومعنى المطالبات القياسية، وكيفية فك ترميزه والتحقق منه، وقواعد الأمان التي تفصل بين تطبيق آمن واختراق.
الأجزاء الثلاثة لرمز JWT
يتكون JWT من ثلاثة مقاطع مرمّزة بـ Base64URL تفصل بينها نقاط: header.payload.signature. وBase64URL هو Base64 بأحرف آمنة لعناوين URL ودون حشو، حتى يمكن للرمز الانتقال في الترويسات وسلاسل الاستعلام وملفات تعريف الارتباط.
- الترويسة (Header) — JSON يصف نوع الرمز وخوارزمية التوقيع، مثل {"alg": "HS256", "typ": "JWT"}. وقد تحمل أيضاً kid (معرّف المفتاح) الذي يخبر المتحقق بالمفتاح الواجب استخدامه.
- الحمولة (Payload) — المطالبات ككائن JSON. يمكن وضع أي شيء هنا، لكنه مرمّز فقط لا مشفّر: كل من يملك الرمز يستطيع قراءته.
- التوقيع (Signature) — يُحسب على الترويسة والحمولة المرمّزتين بالخوارزمية المذكورة في الترويسة. تستخدم HS256 سراً مشتركاً (HMAC)؛ أما RS256 وES256 فتستخدمان مفتاحاً خاصاً للتوقيع ومفتاحاً عاماً للتحقق.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiI0MiIsIm5hbWUiOiJMYXlsYSIsInJvbGUiOiJhZG1pbiIsImlhdCI6MTc1NjcwMDAwMCwiZXhwIjoxNzU2NzAzNjAwfQ
.4l3Y2cYpXqZ0cVZ5m4Q8n1fGx0y8s3oT0kq4rV7cWvA
header → {"alg":"HS256","typ":"JWT"}
payload → {"sub":"42","name":"Layla","role":"admin","iat":1756700000,"exp":1756703600}المطالبات القياسية ومعانيها
- iss (المُصدر) — من أنشأ الرمز، وعادةً عنوان خادم المصادقة.
- sub (الموضوع) — من يتحدث عنه الرمز، وغالباً معرّف المستخدم.
- aud (الجمهور) — الخدمة التي يُقصد بها الرمز. يجب على المتحقق رفض الرموز الموجهة لجمهور آخر.
- exp (انتهاء الصلاحية) — طابع Unix زمني يصبح الرمز بعده غير صالح. الأعمار القصيرة (دقائق لرموز الوصول) تحدّ من ضرر التسريب.
- nbf (ليس قبل) وiat (وقت الإصدار) — طوابع زمنية تحدد متى أصبح الرمز صالحاً ومتى أُنشئ.
- jti (معرّف JWT) — معرّف فريد يُستخدم لاكتشاف إعادة الاستخدام أو لإبطال رمز بعينه.
- المطالبات المخصصة — الأدوار والصلاحيات ومعرّف المستأجر والبريد الإلكتروني. أبقها صغيرة: يُرسل الرمز مع كل طلب.
فك الترميز ليس تحققاً
فك ترميز JWT يعني فك ترميز Base64URL للترويسة والحمولة لقراءتهما. يستطيع أي شخص فعل ذلك دون أي مفتاح — وهذا بالضبط سبب وجوب عدم الوثوق بحمولة مفكوكة الترميز بمفردها. أما التحقق فيعني إعادة حساب التوقيع بالمفتاح والخوارزمية الصحيحين والتأكد من تطابقه، ثم فحص exp وnbf وiss وaud.
أداة فك الترميز أونلاين هي الأداة المناسبة لقراءة رمز أثناء تصحيح الأخطاء: معرفة المستخدم الذي يسمّيه، والأدوار التي يحملها، وموعد انتهاء صلاحيته. لكنها ليست فحصاً أمنياً، والأداة التي تعمل داخل متصفحك هي النوع الوحيد الذي يجوز لصق رمز حقيقي فيه.
HS256 مقابل RS256 مقابل ES256
- HS256 (HMAC مع SHA-256) — سر مشترك واحد يوقّع ويتحقق. بسيط وسريع ومناسب عندما تصدر خدمة واحدة الرموز وتستهلكها. كل طرف يستطيع التحقق يستطيع أيضاً التزوير.
- RS256 (توقيع RSA) — مفتاح خاص يوقّع ومفتاح عام يتحقق. تستطيع أي خدمة التحقق بالمفتاح العام المنشور (غالباً عبر نقطة نهاية JWKS) دون القدرة على إنشاء رموز. وهو الافتراضي لدى مزوّدي OAuth.
- ES256 (ECDSA مع P-256) — نموذج غير متماثل كـ RS256 بمفاتيح وتوقيعات أصغر بكثير.
- none — خوارزمية تعني «بلا توقيع». يجب على المتحققين رفضها؛ فقبول alg=none إحدى الثغرات الكلاسيكية في JWT.
قواعد أمان JWT
- تحقق من التوقيع وثبّت الخوارزمية في الخادم. لا تدع ترويسة الرمز نفسها تقرر الخوارزمية المستخدمة.
- افحص exp دائماً، وقارن aud وiss بقيمك الخاصة.
- لا تضع أسراراً أو كلمات مرور أو بيانات شخصية حساسة في الحمولة — فهي مقروءة لكل من يحمل الرمز. استخدم JWE إن احتجت إلى التشفير.
- أبقِ رموز الوصول قصيرة العمر واستخدم رمز تحديث للحصول على رموز جديدة.
- خزّن الرموز بحذر في المتصفحات: ملف تعريف ارتباط HttpOnly وSecure وSameSite أكثر أماناً من localStorage الذي يستطيع أي سكربت محقون قراءته.
- استخدم سراً قوياً لـ HS256 — 256 بت من العشوائية على الأقل، ولا تستخدم كلمة مرور أبداً.
- خطط للإبطال: يبقى JWT صالحاً حتى انتهاء صلاحيته، لذا يحتاج تسجيل الخروج أو الحساب المخترق إلى قائمة رفض (jti) أو أعمار قصيرة.
جرّبها: مولّد الأسرار العشوائية جرّبها: مفكّك ترميز رموز OAuth
JWT في OAuth 2.0 وOpenID Connect
غالباً ما تكون رموز وصول OAuth 2.0 من نوع JWT، وإن كانت المواصفة لا تشترط ذلك؛ أما رموز هوية OpenID Connect فهي كذلك دائماً. يصف رمز الهوية المستخدم المصادَق عليه (sub والبريد والاسم) لتطبيق العميل؛ بينما يمنح رمز الوصول العميل إذن استدعاء واجهة API (النطاق وaud). يُتحقق منهما بالطريقة نفسها، لكن يجب ألا يُرسل رمز الهوية إلى واجهة API كما لو كان رمز وصول.
الأسئلة الشائعة
هل JWT مشفّر؟
لا — رمز JWT الموقّع القياسي (JWS) مرمّز بـ Base64URL فقط. حمولته مقروءة لكل من يملك الرمز. توجد رموز مشفّرة (JWE) لكنها أقل شيوعاً بكثير.
هل يمكن فك ترميز JWT دون السر؟
نعم. الترويسة والحمولة مجرد Base64URL، فأي أداة فك ترميز تستطيع قراءتهما. لا يلزم السر أو المفتاح إلا للتحقق من التوقيع، وهو ما يثبت أصالة الرمز.
كيف أتحقق من انتهاء صلاحية JWT؟
فكّ ترميزه وقارن مطالبة exp (طابع Unix زمني بالثواني) بالوقت الحالي. تفعل مكتبات التحقق ذلك تلقائياً؛ وتعرض أداة فك الترميز أونلاين موعد الانتهاء كتاريخ مقروء.
ما الفرق بين JWT وملف تعريف ارتباط الجلسة؟
ملف تعريف ارتباط الجلسة معرّف معتم يبحث عنه الخادم في مخزنه؛ أما JWT فيحمل بيانات الجلسة نفسها موقّعة، فلا يحتاج الخادم إلى بحث. تتوسع رموز JWT عبر الخدمات بسهولة أكبر؛ بينما الجلسات أسهل في الإبطال.
أين أخزّن JWT في تطبيق ويب؟
يُفضَّل ملف تعريف ارتباط HttpOnly وSecure مع SameSite، حتى لا يستطيع JavaScript في الصفحة قراءته. localStorage مريح لكنه يعرّض الرمز لأي ثغرة برمجة عبر المواقع.
هل من الآمن لصق JWT في أداة فك ترميز أونلاين؟
فقط إذا كانت الأداة تعمل بالكامل في متصفحك ولا ترسل الرمز إلى أي مكان. تعمل أداة فك ترميز JWT في متقن محلياً؛ ومع ذلك عامل رموز الإنتاج كأسرار وفضّل رموز الاختبار متى استطعت.
الأدوات المذكورة في هذا الدليل
فكّ ترميز ترويسة JWT وحمولته، وفحص المطالبات (claims) والتحقق من انتهاء الصلاحية — بالكامل داخل متصفحك.
إنشاء رموز JWT موقَّعة (HS256 / HS384 / HS512) من مطالبات مخصّصة لأغراض الاختبار.
تحليل مطالبات JWT للكشف عن القيم المفقودة أو الخطرة أو غير القياسية مع توصيات أمنية.
التحقق مما إذا كان رمز JWT منتهي الصلاحية أو لم يصبح صالحاً بعد، أو المدة المتبقية حتى انتهاء صلاحيته.
فحص ترويسة JOSE لرمز JWT: alg وtyp وkid وjku وx5u ومخاطر الخلط بين الخوارزميات المحتملة.
فكّ ترميز رموز الوصول والهوية في OAuth 2.0 / OpenID Connect وفهم النطاقات والجماهير ومدد الصلاحية.
توليد توقيعات HMAC (SHA-256/384/512/SHA-1) لتوقيع طلبات webhook وواجهات API.
فكّ ترميز سلاسل Base64 أو Base64url إلى نص، مع إصلاح الحشو تلقائياً.