احراز هویت و کنترل دسترسی؛ تفاوت Authentication و Authorization چیست؟
فرض کنید وارد یه فروشگاه اینترنتی شدید. با ایمیل و رمز عبورتون لاگین میکنید، سفارشهاتون رو میبینید و میتونید اطلاعات حساب کاربریتون رو تغییر بدید.
حالا فرض کنید آدرس یکی از سفارشهای کاربر دیگه رو بهدست بیارید و مستقیماً توی مرورگر باز کنید. آیا چون وارد حساب کاربری شدید، باید بتونید اطلاعات اون سفارش رو هم ببینید؟
قطعاً نه!
اینجا با دو مفهوم مهم در امنیت نرمافزار سروکار داریم:AuthenticationوAuthorization.
این دو مفهوم معمولاً کنار هم استفاده میشن، اما وظیفهی متفاوتی دارن. اولی مشخص میکنه شما چه کسی هستید و دومی مشخص میکنه اجازهی انجام چه کاری رو دارید.
Authentication یعنی چی؟
Authentication یا احراز هویت، فرایند بررسی هویت کاربره. یعنی سیستم باید مطمئن بشه کسی که ادعا میکنه صاحب یه حساب کاربریه، واقعاً به اون حساب دسترسی داره.
برای مثال، وقتی ایمیل و رمز عبورتون رو وارد میکنید، سیستم اطلاعات واردشده رو با اطلاعات ثبتشده مقایسه میکنه. اگه معتبر باشن، هویت دیجیتال شما تأیید میشه.
برای درک بهتر، چند اصطلاح مرتبط رو بشناسیم:
Identity:هویت دیجیتال شما در یک سیستم؛ مثلاً حساب کاربری با شناسهیuser_125.
Identification:معرفی خودتون به سیستم؛ مثلاً وارد کردن ایمیل یا نام کاربری.
Authentication:بررسی اینکه آیا واقعاً صاحب هویتی هستید که ادعا میکنید یا نه.
نکتهی مهم اینه که داشتن یک شناسه، بهتنهایی هویت شما رو اثبات نمیکنه. هر کسی میتونه ایمیل شخص دیگهای رو وارد کنه، اما این به معنی دسترسی به حساب اون شخص نیست.
Authentication معمولاً با روشهایی مثل رمز عبور، کد یکبارمصرف یا کلیدهای امنیتی انجام میشه. البته جزئیات پیادهسازی این روشها موضوع جداگانهایه.
Authorization یعنی چی؟
Authorization یا مجوزدهی، مشخص میکنه یک کاربر احراز هویتشده اجازه داره چه عملیاتی رو روی چه منبعی انجام بده.
مثلاً در یک فروشگاه اینترنتی:
کاربر میتونه سفارشهای خودش رو مشاهده کنه.
کاربر میتونه اطلاعات پروفایل خودش رو تغییر بده.
مدیر میتونه وضعیت سفارشهای کاربران رو تغییر بده.
کاربر عادی اجازهی حذف محصولات فروشگاه رو نداره.
در تمام این مثالها، ممکنه کاربر از قبل احراز هویت شده باشه؛ اما مجوز انجام هر عملیات به شرایط متفاوتی بستگی داره.
برای فهم بهتر Authorization، این اصطلاحات رو هم در نظر بگیرید:
Principal:موجودیتی که درخواست انجام یک عملیات رو ارسال میکنه؛ مثلاً یک کاربر یا سرویس.
Resource:منبعی که قراره بهش دسترسی پیدا کنیم؛ مثل سفارش، محصول یا پروفایل.
Action:عملیاتی که قراره روی منبع انجام بشه؛ مثل مشاهده، ویرایش یا حذف.
Permission:مجوز انجام یک عملیات مشخص.
Policy:مجموعهای از قوانین که مشخص میکنه تحت چه شرایطی یک عملیات مجازه.
در واقع Authorization با بررسی این موارد تصمیم میگیره که درخواست باید پذیرفته بشه یا نه. این فرایند بخشی از چیزی به اسمAccess Controlیا کنترل دسترسیه.
تفاوت Authentication و Authorization در عمل
بیاید با یک مثال ساده از فروشگاه اینترنتی این تفاوت رو بررسی کنیم.
فرض کنید کاربرAliوارد حساب کاربری خودش شده و میخواد سفارش شمارهی125رو مشاهده کنه.
سیستم ابتدا بررسی میکنه که آیا Ali واقعاً کاربر احراز هویتشدهایه یا نه. اگه این بررسی موفق باشه، نوبت به Authorization میرسه.
حالا سیستم بررسی میکنه:
۱. آیا سفارش شمارهی ۱۲۵ متعلق به Ali هست؟
۲. آیا Ali اجازهی مشاهدهی این سفارش رو داره؟
اگه سفارش متعلق به خودش باشه، دسترسی داده میشه. اما اگه سفارش متعلق به کاربر دیگهای باشه، حتی با وجود احراز هویت موفق، درخواست رد میشه.
در حال رسم نمودار…
چرخهی احراز هویت و کنترل دسترسی
این مثال یک نکتهی امنیتی مهم داره:احراز هویت موفق به معنی دسترسی آزاد به تمام منابع سیستم نیست.
حتی اگه کاربری وارد حساب خودش شده باشه، باید قبل از انجام هر عملیات، مجوز دسترسی به منبع موردنظر بررسی بشه.
یک اشتباه رایج: اعتماد به شناسهی منبع
فرض کنید API فروشگاه چنین آدرسی داشته باشه:
متن ساده
GET /api/orders/125
ممکنه توسعهدهنده فقط بررسی کنه که کاربر وارد حسابش شده و بعد سفارش رو با شناسهی ارسالشده پیدا کنه:
PHP
$order=Order::findOrFail($id);
return$order;
مشکل اینجاست که شناسهی سفارش از سمت کاربر ارسال شده و هیچ بررسیای برای مالکیت اون انجام نشده.
در نتیجه، کاربر میتونه شناسهی سفارش رو تغییر بده و اطلاعات سفارشهای دیگران رو مشاهده کنه.
راه درست اینه که علاوه بر احراز هویت، مالکیت منبع یا مجوز دسترسی به اون هم بررسی بشه:
PHP
$order=Order::where('user_id',auth()->id())
->findOrFail($id);
return$order;
این مثال ساده نشون میده چرا بررسی مجوز دسترسی باید روی خود منبع انجام بشه، نه صرفاً روی نوع کاربر یا وضعیت ورود اون.
Access Decision چطور انجام میشه؟
برای تصمیمگیری دربارهی دسترسی، سیستم باید درخواست رو با قوانین امنیتی خودش مقایسه کنه.
مثلاً فرض کنید یک کاربر درخواست حذف محصولی رو ارسال کرده. سیستم باید بررسی کنه:
درخواست از طرف چه کسی ارسال شده؟
منبع موردنظر کدوم محصوله؟
چه عملیاتی قراره انجام بشه؟
آیا این کاربر اجازهی انجام این عملیات رو داره؟
در نهایت، بر اساس نتیجهی بررسی، دسترسی تأیید یا رد میشه.
در حال رسم نمودار…
دیاگرام فرایند تصمیمگیری برای دسترسی
یک نکتهی مهم اینه که کنترل دسترسی نباید فقط به مخفی کردن دکمهها در Frontend محدود بشه. حتی اگه کاربر دکمهی حذف رو نبینه، همچنان میتونه مستقیماً درخواست حذف رو به API ارسال کنه.
بنابراین بررسی مجوز باید در سمت سرور و برای هر درخواست انجام بشه. همچنین بهتره سیاست امنیتی سیستم بهصورت پیشفرض دسترسی رو رد کنه و فقط در صورت وجود مجوز معتبر، اجازهی عملیات داده بشه.
تفاوت HTTP 401 و 403 چیه؟
یکی از جاهایی که تفاوت Authentication و Authorization کاملاً مشخص میشه، کدهای وضعیت HTTP هستن.
کد
مفهوم
کاربرد
401 Unauthorized
اطلاعات احراز هویت معتبر وجود نداره
کاربر وارد سیستم نشده یا اطلاعات احراز هویت معتبر نیست
403 Forbidden
سرور درخواست رو رد میکنه
کاربر با وجود داشتن اطلاعات احراز هویت، مجوز لازم رو نداره
مثلاً اگه کاربر بدون ورود بخواد سفارش خودش رو مشاهده کنه، معمولاً پاسخ401دریافت میکنه.
اما اگه وارد حساب شده باشه و بخواد سفارش کاربر دیگهای رو مشاهده کنه، پاسخ403منطقیتره.
البته طبق RFC 9110، سرور در بعضی شرایط میتونه برای پنهان کردن وجود یک منبع، بهجای403پاسخ404برگردونه.
جمعبندی
Authentication و Authorization دو بخش جدا اما مرتبط از امنیت نرمافزار هستن.
Authentication مشخص میکنه درخواست از طرف چه کسی ارسال شده و Authorization بررسی میکنه که آیا اون شخص اجازهی انجام عملیات موردنظر رو داره یا نه.
موقع طراحی API، فقط بررسی اینکه کاربر وارد سیستم شده کافی نیست. باید مالکیت منابع و مجوز انجام عملیات هم بررسی بشه.
این تفاوت ساده، یکی از پایههای جلوگیری از دسترسی غیرمجاز به اطلاعات کاربران در نرمافزارهای واقعی محسوب میشه.
نظرات
هنوز نظری ثبت نشده است. اولین نفر باشید!