مقارنة بين JWT و Sessions لمعرفة الأفضل في الأمان
كنت أشغل مشروعًا كبيرًا كمتخصص في Backend، وكان عليّ اختيار نظام التوثيق المناسب. كانت Sessions هي الخيار التقليدي، ولكن بعد البحث العميق، وجدت أن JWT قد يكون الخيار الأفضل في بعض الحالات.
في هذا السياق، سأقوم بتقديم مقارنة بين JWT و Sessions، لكي نفهم بشكل أفضل أيهما يصلح لنا في مشاريعنا، وبالتالي نختار النظام المناسب لتحقيق الأمان المطلوب.
لنبدأ بفهم كيفية عمل كل من JWT و Sessions، ومن ثم سوف نقوم بمقارنتهم فيما يخص الأمان.
JWT أو JSON Web Token هو نظام توثيق يعتمد على التوقيع الرقمي لمعلومات المستخدم، حيث يتم إنشاء Token يحتوي على البيانات الأساسية للمستخدم، مثل اسم المستخدم والصلاحيات، وسيتم التوقيع عليها باستخدام مفتاح سري.
const jwt = require('jsonwebtoken');
const token = jwt.sign({ username: 'john' }, 'secretkey', { expiresIn: '1h' });هذا يعني أن كل طلب يصل إلى الخادم يجب أن يحمل Token صحيحًا، وعندما يصل الطلب، يقوم الخادم بفحص صحة Token، إذا كان صحيحًا، يتم السماح للمستخدم بالوصول إلى الموارد المطلوبة.
Sessions هي طريقة قديمة لتحقيق التوثيق، حيث يتم تخزين معلومات المستخدم على الخادم، وعندما يقوم المستخدم بتسجيل الدخول، يتم إنشاء Session جديدة له، ويتم تخزين Session ID في ملف تعريف الارتباط على متصفح المستخدم.
const express = require('express');
const app = express();
const session = require('express-session');
app.use(session({ secret: 'secretkey', resave: false, saveUninitialized: true }));عندما يرسل المستخدم طلبًا، يتم إرسال Session ID مع الطلب، ويتحقق الخادم من Session ID لمعرفة إذا كان المستخدم مصادقًا أم لا.
كلا النظامين له مزايا وعيوب، JWT يعتبر أكثر أمانًا لأن البيانات يتم التوقيع عليها، ولكن قد يكون أبطأ بسبب الحاجة إلى التوقيع والفحص، في حين أن Sessions أسرع ولكن قد يكون أقل أمانًا لأن البيانات يتم تخزينها على الخادم.
أنا أوصي باستخدام JWT فيกรณات التطبيقات التي تحتاج إلى أمان عالي، مثل تطبيقات البنوك والمؤسسات الحكومية، بينما يمكن استخدام Sessions في تطبيقات الألعاب والمنصات الإلكترونية التي لا تحتاج إلى أمان عالي.