System Design

مقیاس‌پذیری هویت: هنر احراز هویت و مجوزدهی در سیستم‌های توزیع‌شده

در مراحل اولیه توسعه برنامه، مدیریت هویت کاربر اغلب کار ساده‌ای است. شما یک جدول پایگاه داده برای کاربران، یک هش رمز عبور ساده و یک کوکی نشست دارید. این روش برای ۱۰۰۰ کاربر اول شما به خوبی کار می‌کند. با این حال، وقتی سیستم شما به یک معماری توزیع‌شده با میکروسرویس‌ها، کلاینت‌های موبایل و یکپارچه‌سازی‌های شخص ثالث رشد می‌کند، پیچیدگی مدیریت هویت به شدت افزایش می‌یابد. در اینجا تمایز بین احراز هویت (اثبات هویت شما) و مجوزدهی (اثبات کاری که می‌توانید انجام دهید) برای پایداری و امنیت سیستم حیاتی می‌شود.

در مقیاس بزرگ، شما نمی‌توانید اجازه دهید هر میکروسرویس برای تأیید اعتبارنامه‌ها به یک پایگاه داده مرکزی درخواست بفرستد. تأخیرها جمع می‌شوند و یک نقطه شکست واحد در ارائه‌دهنده هویت شما می‌تواند کل پلتفرم شما را از دسترس خارج کند. برای حل این مشکل، طراحی سیستم‌های مدرن بر روی توکن‌های بدون حالت، تأیید غیرمتمرکز و جداسازی دقیق نگرانی‌ها تکیه دارد.

گذار به سمت حالت‌زدایی با JWTها

ستون فقرات احراز هویت مقیاس‌پذیر، توکن دسترسی بدون حالت است که معمولاً با استفاده از توکن‌های وب JSON (JWT) پیاده‌سازی می‌شود. برخلاف نشست‌های سنتی که نیاز دارند سرور حالت را ذخیره کند (اغلب در Redis یا پایگاه داده)، یک JWT تمام اطلاعات کاربری و مجوزهای لازم را به صورت امضای دیجیتال شده توسط سرور در خود دارد.

هنگامی که کاربر وارد سیستم می‌شود، ارائه‌دهنده هویت (IdP) یک توکن امضا شده صادر می‌کند. کلاینت این توکن را ذخیره می‌کند (معمولاً در حافظه یا یک کوکی httpOnly) و آن را در هدر Authorization درخواست‌های بعدی گنجانده و ارسال می‌کند. هر میکروسرویس می‌تواند امضای توکن را با استفاده از یک کلید عمومی تأیید کند، بدون اینکه هرگز با IdP یا پایگاه داده تماس بگیرد. این کار تأخیر را به شدت کاهش داده و گلوگاه پایگاه داده را از بین می‌برد.

// Example: Verifying a JWT in a Node.js microservice
const jwt = require('jsonwebtoken');

function verifyAccessToken(req, res, next) {
  const token = req.headers['authorization']?.split(' ')[1];
  
  if (!token) {
    return res.status(401).send('Access Denied');
  }

  try {
    // Verify signature against public key
    const verified = jwt.verify(token, process.env.PUBLIC_KEY);
    req.user = verified; // Attach user claims to request
    next();
  } catch (err) {
    res.status(403).send('Invalid Token');
  }
}

مجوزدهی دقیق و کنترل دسترسی مبتنی بر نقش (RBAC)

در حالی که JWTها احراز هویت را به طور کارآمد مدیریت می‌کنند، آن‌ها برای مجوزدهی پویا ایده‌آل نیستند زیرا بدون زمان انقضای کوتاه، بازخوانی آن‌ها دشوار است. برای مجوزدهی در مقیاس، ما اغلب از کنترل دسترسی مبتنی بر نقش (RBAC) یا کنترل دسترسی مبتنی بر ویژگی (ABAC) استفاده می‌کنیم که در ادعاهای (claims) JWT کدگذاری شده یا از طریق یک تماس API سبک دریافت می‌شوند.

سناریویی را در نظر بگیرید که مجوزهای کاربر تغییر می‌کند. با یک نشست حالت‌دار، شما فروشگاه نشست را به‌روزرسانی می‌کنید. با JWTها، شما باید بر روی توکن‌های دسترسی با عمر کوتاه (مثلاً ۱۵ دقیقه) همراه با توکن‌های تازه‌سازی تکیه کنید. توکن تازه‌سازی به صورت امن ذخیره می‌شود و برای دریافت توکن‌های دسترسی جدید استفاده می‌شود، که به شما امکان می‌دهد دسترسی را بلافاصله با سیاه‌چاله کردن (blacklist) توکن تازه‌سازی در صورت لزوم لغو کنید.

جداسازی هویت از منطق کسب‌وکار

برای مقیاس‌پذیری واقعی، شما باید هویت را از میکروسرویس‌های اصلی کسب‌وکار خود جدا کنید. منطق احراز هویت را در سرویس سفارش یا سرویس پروفایل کاربری خود تعبیه نکنید. در عوض، مدیریت هویت را در یک ارائه‌دهنده هویت اختصاصی (مانند Auth0، Keycloak یا یک سرویس سفارشی) متمرکز کنید. این سرویس ورود، بازنشانی رمز عبور، احراز هویت چندمرحله‌ای (MFA) و صدور توکن را مدیریت می‌کند.

سرویس‌های کسب‌وکار شما به عنوان سرورهای منبع عمل می‌کنند. آن‌ها فقط امضا و انقضای JWT را اعتبارسنجی می‌کنند. اگر به منطق مجوزدهی پیچیده‌تری نیاز دارید (مثلاً «آیا این کاربر مالک این منبع خاص است؟») یک نقطه تصمیم‌گیری سیاست با عمر کوتاه پیاده‌سازی کنید یا از کتابخانه‌ای مانند OPA (نماینده سیاست باز) استفاده کنید که می‌تواند تصمیمات دقیقی بر اساس ادعاهای JWT و متادیتای منبع بگیرد.

نتیجه‌گیری

مقیاس‌پذیری احراز هویت و مجوزدهی تنها به انتخاب کتابخانه مناسب نیست؛ بلکه طراحی سیستمی است که گردش‌های کاری به پایگاه‌های داده مرکزی را به حداقل و امنیت را به حداکثر می‌رساند. با اتخاذ JWTهای بدون حالت، اعمال عمر کوتاه برای توکن‌ها و جداسازی هویت از منطق کسب‌وکار، شما زیرساختی مقاوم ایجاد می‌کنید که می‌تواند میلیون‌ها کاربر را بدون مشکل مدیریت کند. به یاد داشته باشید، امنیت یک فرآیند مداوم است، بنابراین سیاست‌های توکن و استراتژی‌های چرخش آن‌ها را به طور منظم بررسی کنید تا همواره گامی جلوتر از تهدیدات نوظهور باشید.

Share: