شرح بنية رمز JWT: Header و Payload و Signature
شرح بنية رمز JWT
كل JSON Web Token (JWT) هو سلسلة نصية مدمجة وآمنة للاستخدام في عناوين URL تنقل المطالبات بين طرفين. فهم بنيته الداخلية أمر ضروري لأي مطور يعمل مع الأمان القائم على الرموز.
الأجزاء الثلاثة لـ JWT
يتكون JWT من ثلاثة أجزاء مفصولة بنقاط (.):
header.payload.signature
مثال:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
كل جزء هو JSON مشفر بـ base64url. يتم توقيع JWT، وليس تشفيره — يمكن لأي شخص فك تشفير وقراءة محتوياته.
الجزء 1: Header
يحتوي header على بيانات وصفية حول الرمز — خوارزمية التوقيع ونوع الرمز.
| الحقل | الوصف | قيم المثال |
|-------|-------------|----------------|
| alg | خوارزمية التوقيع (مطلوب) | HS256، RS256، ES256 |
| typ | نوع الرمز (اختياري) | JWT |
| kid | معرف المفتاح (اختياري) | "key-1" |
{
"alg": "HS256",
"typ": "JWT"
}
يخبر حقل alg المدقق بالخوارزمية التي أنشأت التوقيع. عدم تطابق الخوارزمية — أو قبول alg: "none" — هو ثغرة أمنية شائعة في JWT.
الجزء 2: Payload
يحتوي payload على مطالبات حول المستخدم والبيانات الوصفية. تنقسم المطالبات إلى ثلاث فئات:
المطالبات المسجلة
| المطالبة | الاسم الكامل | الغرض |
|-------|-----------|---------|
| iss | المُصدر | من أصدر الرمز |
| sub | الموضوع | يحدد المستخدم |
| aud | الجمهور | المستلم المقصود |
| exp | انتهاء الصلاحية | طابع زمني لانتهاء صلاحية الرمز |
| nbf | غير صالح قبل | الرمز غير صالح قبل هذا الوقت |
| iat | وقت الإصدار | طابع زمني لإنشاء الرمز |
| jti | معرف JWT | معرف فريد للرمز |
مثال Payload مفكوك التشفير
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516242622,
"iss": "https://auth.example.com"
}
يتم تعريف المطالبات العامة في سجل IANA أو تستخدم URIs مقاومة للتصادم. المطالبات الخاصة هي مطالبات مخصصة متفق عليها بين المُصدر والمستهلك.
الجزء 3: Signature
يتم إنشاء التوقيع من خلال دمج header المشفر و payload المشفر ومفتاح سري باستخدام الخوارزمية من header. يخدم غرضين:
- السلامة — يؤكد أن الرمز لم يتم تعديله بعد التوقيع.
- المصادقة — يثبت أن الرمز تم توقيعه من قبل الطرف المتوقع.
إنشاء توقيع HS256
HMACSHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
secret
)
إنشاء توقيع RS256
RSASHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
Base64url مقابل Base64 القياسي
| الجانب | Base64 القياسي | Base64url |
|--------|-----------------|-----------|
| الحرف 62 | + | - |
| الحرف 63 | / | _ |
| الحشو | = | محذوف |
يضمن هذا الترميز أن تكون رموز JWT آمنة لـ HTTP headers ومعاملات الاستعلام ومسارات URL دون ترميز النسبة المئوية.
عملية إنشاء JWT الكاملة
- أنشئ header JSON وقم بترميزه بـ base64url.
- أنشئ payload JSON وقم بترميزه بـ base64url.
- ادمج مع فاصل
.. - قم بالتوقيع باستخدام الخوارزمية والمفتاح السري المختارين.
- قم بترميز التوقيع بـ base64url.
- ادمج الأجزاء الثلاثة مع فواصل
..
اعتبارات أمنية
- لا تخزن الأسرار أبدًا في payload. الـ payload مُشفّر، وليس مشفرًا تشفيرًا حقيقيًا.
- تحقق دائمًا من التوقيع. بدون التحقق، يمكن لأي شخص تزوير الرموز.
- تحقق من header
alg. ارفضalg: "none"ومحاولات تخفيض الخوارزمية. - حدد أوقات انتهاء صلاحية قصيرة. استخدم مطالبات
expبالدقائق أو الساعات، وليس بالأشهر.
فك تشفير رمز JWT عبر الإنترنت
استخدم أداة فك تشفير JWT لفحص أي رمز. الصقه وشاهد فورًا header و payload وخوارزمية التوقيع المفكوكة. تتم جميع المعالجات في متصفحك.