Authorization چیست؟
فرض کنید وارد حساب کاربری خود در یک فروشگاه اینترنتی شدهاید.
شما میتوانید سفارشهای خود را مشاهده کنید، اطلاعات حساب خود را ویرایش کنید و خرید انجام دهید.
اما آیا میتوانید تمام کاربران سایت را حذف کنید یا تنظیمات اصلی وبسایت را تغییر دهید؟
پاسخ این سؤال معمولاً خیر است.
دلیل این موضوع مفهومی به نام Authorization یا مجوزدهی است.
Authorization فرآیندی است که مشخص میکند یک کاربر، پس از احراز هویت، به چه منابع یا قابلیتهایی اجازه دسترسی دارد.
به زبان ساده، Authorization تعیین میکند هر کاربر چه کارهایی میتواند انجام دهد و به چه بخشهایی دسترسی دارد.
چرا Authorization اهمیت دارد؟
فرض کنید همه کاربران یک وبسایت پس از ورود بتوانند به تمام اطلاعات و بخشهای مدیریتی دسترسی داشته باشند.
در چنین شرایطی امنیت سیستم تقریباً از بین میرود و هر کاربر میتواند اطلاعات سایر کاربران را مشاهده یا تغییر دهد.
Authorization از بروز چنین مشکلاتی جلوگیری میکند و برای هر کاربر سطح دسترسی مشخصی تعریف میکند.
به همین دلیل، تقریباً تمام نرمافزارهای تحت وب از نوعی سیستم مجوزدهی استفاده میکنند.
یک مثال ساده
فرض کنید وارد یک ساختمان اداری شدهاید.
ابتدا نگهبان کارت شناسایی شما را بررسی میکند تا هویتتان تأیید شود.
پس از ورود، ممکن است فقط اجازه دسترسی به طبقهای خاص را داشته باشید.
اگر بخواهید وارد اتاق سرور شوید، احتمالاً اجازه این کار را نخواهید داشت.
در این مثال، بررسی کارت شناسایی همان Authentication است و تعیین اینکه به کدام بخشها اجازه ورود دارید، Authorization محسوب میشود.
Authorization چگونه کار میکند؟
در بیشتر سیستمها، Authorization پس از Authentication انجام میشود.
- کاربر وارد حساب کاربری خود میشود.
- سیستم هویت او را تأیید میکند.
- اطلاعات مربوط به نقش یا مجوزهای کاربر بررسی میشوند.
- در صورت داشتن مجوز، دسترسی به منبع یا عملیات موردنظر داده میشود.
- در غیر این صورت، درخواست رد میشود.
به همین دلیل، معمولاً ابتدا باید Authentication انجام شود و سپس Authorization بررسی شود.
تفاوت Authentication و Authorization
این دو مفهوم ارتباط نزدیکی با یکدیگر دارند، اما وظایف متفاوتی انجام میدهند.
Authentication بررسی میکند که کاربر چه کسی است.
Authorization بررسی میکند که همان کاربر پس از ورود، اجازه انجام چه کارهایی را دارد.
به عبارت دیگر، Authentication هویت را تأیید میکند و Authorization سطح دسترسی را مشخص میکند.
Authorization چه چیزهایی را کنترل میکند؟
سیستم مجوزدهی میتواند دسترسی به بخشهای مختلف یک نرمافزار را کنترل کند.
برای مثال، ممکن است مشخص کند که آیا کاربر اجازه انجام موارد زیر را دارد یا خیر.
- مشاهده یک صفحه خاص
- ویرایش اطلاعات
- حذف دادهها
- ایجاد اطلاعات جدید
- دسترسی به پنل مدیریت
- استفاده از یک Endpoint در REST API
این مجوزها بسته به نوع سیستم میتوانند بسیار ساده یا بسیار پیچیده باشند.
Role یا نقش چیست؟
یکی از رایجترین روشهای پیادهسازی Authorization، استفاده از Role یا نقش است.
در این روش، به هر کاربر یک یا چند نقش اختصاص داده میشود.
هر نقش مجموعهای از مجوزها را در اختیار کاربر قرار میدهد.
برای مثال، نقش «مدیر» معمولاً دسترسی بیشتری نسبت به نقش «کاربر عادی» دارد.
Permission چیست؟
Permission یا مجوز، مشخص میکند که یک کاربر اجازه انجام یک عملیات خاص را دارد یا خیر.
برای مثال، ممکن است یک کاربر اجازه مشاهده اطلاعات را داشته باشد اما نتواند آنها را ویرایش یا حذف کند.
در بسیاری از سیستمها، نقشها از مجموعهای از Permissionهای مختلف تشکیل شدهاند.
آیا Authorization فقط برای کاربران استفاده میشود؟
خیر.
علاوه بر کاربران، سرویسها، برنامهها و حتی دستگاهها نیز ممکن است برای دسترسی به منابع مختلف نیاز به Authorization داشته باشند.
برای مثال، یک REST API ممکن است فقط به برنامههایی اجازه استفاده از برخی Endpointها را بدهد که مجوز لازم را داشته باشند.
در بخش بعدی مقاله، مدلهای مختلف Authorization، روشهای رایج مدیریت مجوزها، نقش Authorization در Django و REST API و اشتباهات رایج در پیادهسازی سیستمهای مجوزدهی را بررسی خواهیم کرد.
مدلهای مختلف Authorization
همه سیستمها از یک روش یکسان برای مدیریت مجوزها استفاده نمیکنند.
با بزرگتر شدن پروژه، تعداد کاربران، نقشها و قابلیتهای مختلف نیز افزایش پیدا میکند و نیاز به مدلهای پیشرفتهتر احساس میشود.
در ادامه با رایجترین مدلهای Authorization آشنا میشویم.
Role-Based Access Control (RBAC)
رایجترین مدل Authorization، استفاده از نقشها یا Role-Based Access Control (RBAC) است.
در این مدل، به هر کاربر یک یا چند نقش اختصاص داده میشود و هر نقش مجموعه مشخصی از مجوزها را در اختیار دارد.
برای مثال، در یک فروشگاه اینترنتی ممکن است نقشهای زیر وجود داشته باشند:
- مدیر
- پشتیبان
- فروشنده
- کاربر عادی
هر نقش فقط به امکاناتی دسترسی دارد که برای انجام وظایفش لازم است.
به همین دلیل، RBAC یکی از سادهترین و محبوبترین روشهای مدیریت دسترسی در پروژههای وب محسوب میشود.
Permission-Based Authorization
در برخی پروژهها، اختصاص نقش بهتنهایی کافی نیست.
در این شرایط، مجوزها بهصورت مستقیم برای هر کاربر تعریف میشوند.
برای مثال، ممکن است دو کاربر هر دو مدیر باشند، اما فقط یکی از آنها اجازه حذف کاربران را داشته باشد.
این روش انعطاف بیشتری ایجاد میکند، اما مدیریت آن در پروژههای بزرگ میتواند پیچیدهتر باشد.
Attribute-Based Access Control (ABAC)
در پروژههای بزرگتر، گاهی تصمیمگیری درباره مجوزها بر اساس ویژگیهای مختلف انجام میشود.
برای مثال، سیستم ممکن است علاوه بر نقش کاربر، عواملی مانند زمان، موقعیت جغرافیایی، نوع دستگاه یا وضعیت حساب کاربری را نیز بررسی کند.
به این مدل Attribute-Based Access Control (ABAC) گفته میشود.
این روش انعطاف بسیار بالایی دارد، اما طراحی و نگهداری آن نسبت به RBAC پیچیدهتر است.
Authorization در REST API
در REST API نیز Authorization نقش بسیار مهمی دارد.
فرض کنید یک API برای مدیریت محصولات یک فروشگاه اینترنتی وجود دارد.
ممکن است همه کاربران بتوانند لیست محصولات را مشاهده کنند، اما فقط مدیران اجازه ایجاد، ویرایش یا حذف محصولات را داشته باشند.
در چنین شرایطی، سرور پس از Authentication بررسی میکند که آیا کاربر مجوز استفاده از آن Endpoint را دارد یا خیر.
Authorization در Django
Django امکانات کاملی برای مدیریت مجوزها در اختیار توسعهدهندگان قرار میدهد.
در Django هر کاربر میتواند عضو یک یا چند گروه باشد و همچنین مجوزهای مشخصی دریافت کند.
علاوه بر این، برای هر مدل بهصورت پیشفرض مجوزهایی مانند مشاهده، ایجاد، ویرایش و حذف تعریف میشود.
توسعهدهندگان نیز میتوانند مجوزهای اختصاصی خود را ایجاد کنند.
این امکانات باعث میشود پیادهسازی سیستمهای مجوزدهی در Django بسیار سادهتر شود.
مثالی از Authorization در یک سامانه آموزشی
فرض کنید یک سامانه آموزش برنامهنویسی دارید.
کاربران مختلف میتوانند نقشهای متفاوتی داشته باشند.
- دانشجو فقط میتواند دورههای خریداریشده خود را مشاهده کند.
- مدرس میتواند محتوای دورههای خود را مدیریت کند.
- پشتیبان میتواند اطلاعات سفارشها را مشاهده کند اما اجازه حذف آنها را ندارد.
- مدیر به تمام بخشهای سیستم دسترسی دارد.
اگر دانشجو تلاش کند وارد بخش مدیریت شود، سیستم درخواست او را رد میکند؛ زیرا مجوز لازم را ندارد.
خطای Access Denied چیست؟
احتمالاً هنگام کار با برخی وبسایتها یا نرمافزارها با پیامهایی مانند Access Denied یا 403 Forbidden مواجه شدهاید.
این پیامها معمولاً به این معنا هستند که هویت کاربر تأیید شده است، اما مجوز لازم برای دسترسی به منبع موردنظر وجود ندارد.
در واقع، Authentication موفق بوده اما Authorization شکست خورده است.
آیا Authorization همیشه بعد از Authentication انجام میشود؟
در بیشتر سیستمها، بله.
ابتدا باید مشخص شود کاربر چه کسی است و سپس بررسی شود که چه مجوزهایی دارد.
البته برخی منابع عمومی ممکن است بدون Authentication نیز در دسترس باشند.
برای مثال، صفحه اصلی یک وبسایت یا مستندات عمومی یک API معمولاً نیازی به ورود کاربر ندارند.
در بخش پایانی مقاله، اشتباهات رایج در پیادهسازی Authorization، اهمیت اصل حداقل سطح دسترسی (Least Privilege)، بهترین روشهای طراحی سیستمهای مجوزدهی و ارتباط Authorization با امنیت نرمافزار را بررسی خواهیم کرد.
چرا Authorization اهمیت دارد؟
Authentication مشخص میکند که کاربر چه کسی است، اما این موضوع بهتنهایی برای حفظ امنیت کافی نیست.
اگر پس از ورود، همه کاربران به تمام بخشهای سیستم دسترسی داشته باشند، عملاً هیچ محدودیتی وجود نخواهد داشت.
Authorization از بروز چنین مشکلاتی جلوگیری میکند و مشخص میکند هر کاربر دقیقاً به چه منابع و قابلیتهایی دسترسی دارد.
به همین دلیل، Authorization یکی از مهمترین لایههای امنیت در توسعه نرمافزارهای تحت وب محسوب میشود.
اصل حداقل سطح دسترسی (Least Privilege)
یکی از مهمترین اصول امنیتی در طراحی سیستمهای مجوزدهی، اصل Least Privilege یا «حداقل سطح دسترسی» است.
بر اساس این اصل، هر کاربر باید فقط به امکاناتی دسترسی داشته باشد که برای انجام وظایف خود به آنها نیاز دارد.
برای مثال، اگر یک کاربر فقط مسئول پاسخگویی به تیکتهای پشتیبانی است، نیازی ندارد به بخش مدیریت کاربران یا تنظیمات سیستم دسترسی داشته باشد.
رعایت این اصل باعث کاهش احتمال خطاهای انسانی و افزایش امنیت سیستم میشود.
اگر Authorization وجود نداشته باشد چه اتفاقی میافتد؟
فرض کنید تمام کاربران یک وبسایت پس از ورود بتوانند اطلاعات سایر کاربران را مشاهده، ویرایش یا حذف کنند.
یا هر کاربری بتواند وارد پنل مدیریت شود و تنظیمات اصلی سیستم را تغییر دهد.
در چنین شرایطی، امنیت نرمافزار تقریباً از بین میرود و اطلاعات کاربران در معرض خطر قرار میگیرد.
Authorization دقیقاً برای جلوگیری از چنین اتفاقاتی طراحی شده است.
اشتباهات رایج در پیادهسازی Authorization
پیادهسازی نادرست سیستم مجوزدهی میتواند آسیبپذیریهای جدی ایجاد کند.
برخی از اشتباهات رایج عبارتاند از:
- اعطای دسترسی بیش از حد به کاربران
- بررسی نکردن مجوزها در سمت سرور
- اتکا به کنترلهای سمت مرورگر برای محدود کردن دسترسی
- استفاده از نقشهای بسیار کلی و بدون تفکیک مناسب
- عدم بازبینی مجوزها پس از تغییر نقش کاربران
- فراموش کردن بررسی مجوزها در Endpointهای API
رعایت این موارد باعث میشود سیستم در برابر بسیاری از حملات و سوءاستفادهها مقاومتر باشد.
Authorization در پروژههای واقعی
تقریباً تمام نرمافزارهای بزرگ از سیستمهای مجوزدهی استفاده میکنند.
برای مثال، در یک فروشگاه اینترنتی مشتری فقط سفارشهای خود را مشاهده میکند، اپراتور پشتیبانی به اطلاعات سفارشها دسترسی دارد و مدیر میتواند محصولات، کاربران و تنظیمات سایت را مدیریت کند.
در یک سامانه آموزشی نیز دانشجو، مدرس و مدیر هر کدام امکانات متفاوتی در اختیار دارند.
این تفاوتها همگی توسط سیستم Authorization مدیریت میشوند.
Authorization در Django
Django امکانات کاملی برای پیادهسازی Authorization ارائه میدهد.
علاوه بر سیستم گروهها (Groups)، هر کاربر میتواند مجوزهای اختصاصی نیز داشته باشد.
همچنین توسعهدهندگان میتوانند برای مدلهای مختلف مجوزهای سفارشی تعریف کنند و قبل از اجرای هر عملیات، مجوزهای لازم را بررسی کنند.
به همین دلیل، Django برای توسعه نرمافزارهایی که دارای کاربران با سطح دسترسی متفاوت هستند، انتخاب بسیار مناسبی است.
چرا یادگیری Authorization برای برنامهنویسان ضروری است؟
تقریباً تمام پروژههای واقعی دارای نقشهای مختلف کاربری هستند.
درک صحیح Authorization به توسعهدهندگان کمک میکند سیستمهایی طراحی کنند که هم امن باشند و هم مدیریت کاربران در آنها ساده و قابل توسعه باشد.
همچنین بسیاری از مفاهیم پیشرفته امنیت نرمافزار، کنترل دسترسی در APIها و طراحی پنلهای مدیریتی بر پایه شناخت صحیح Authorization شکل میگیرند.
جمعبندی
Authorization یا مجوزدهی فرآیندی است که مشخص میکند یک کاربر پس از احراز هویت، به چه منابع و عملیاتی اجازه دسترسی دارد.
در حالی که Authentication هویت کاربر را تأیید میکند، Authorization سطح دسترسی او را تعیین میکند.
استفاده از نقشها، مجوزها و رعایت اصل حداقل سطح دسترسی باعث میشود نرمافزارها امنیت بیشتری داشته باشند و هر کاربر فقط به امکانات موردنیاز خود دسترسی پیدا کند.
شناخت Authorization برای هر توسعهدهنده Backend و حتی Frontend که با سیستمهای دارای حساب کاربری کار میکند، یکی از مفاهیم پایه و ضروری محسوب میشود.
سؤالات متداول
Authorization چیست؟
Authorization یا مجوزدهی فرآیندی است که مشخص میکند یک کاربر پس از احراز هویت، به چه منابع یا قابلیتهایی اجازه دسترسی دارد.
تفاوت Authentication و Authorization چیست؟
Authentication هویت کاربر را بررسی میکند، اما Authorization تعیین میکند آن کاربر پس از ورود چه کارهایی میتواند انجام دهد.
Role و Permission چه تفاوتی دارند؟
Role مجموعهای از مجوزها است، در حالی که Permission یک مجوز مشخص برای انجام یک عملیات یا دسترسی به یک منبع خاص محسوب میشود.
آیا Django از Authorization پشتیبانی میکند؟
بله. Django دارای سیستم داخلی برای مدیریت کاربران، گروهها و مجوزها است و توسعهدهندگان میتوانند بهراحتی سیستمهای کنترل دسترسی را در پروژههای خود پیادهسازی کنند.
مطالعه بیشتر
قدم بعدی چیست؟
اکنون که با Authorization آشنا شدید، در مقاله بعدی بررسی میکنیم JWT چیست، ساختار JSON Web Token چگونه است، چه تفاوتی با Session دارد و در چه پروژههایی استفاده از JWT انتخاب مناسبتری محسوب میشود.
نظرات
مفید بود
ثبت نظر
در حال پاسخ به