معماری میکروسرویس مزایای بسیاری را برای اپلیکیشن از جمله تبدیل تیم های بزرگ به تیم های کوچک توسعه ، چرخه های توسعه کوتاه تر، انعطاف پذیری در انتخاب زبان و قابلیت مقیاس پذیری بیشتر را فراهم می کند.
از طرفی با بسیاری از مشکلات پیچیده سیستم های توزیع شده نیز مواجه می شویم. یكی از این چالش ها نحوه پیاده سازی احراز هویت (authentication) و دسترسی ها (authorization) به صورت ایمن و كارآمد در معماری میکروسرویس است. در این مطلب سعی می کنیم در مورد این موضوع صحبت کنیم.
احراز هویت (authentication) مشخص می کند شما چه کسی هستید و شما می توانید با نام کاربری و رمز عبور از اپلیکیشن استفاده کنید.
دسترسی ها (authorization) مشخص می کند که کاربر چه کاری می تواند انجام دهد به طور مثال آیا دسترسی ویرایش پست ها را دارد یا ندارد.
در معماری مونولیتیک تمام اپلیکیشن در داخل یک پروسه کار ها را انجام می دهند که وظیفه احراز هویت و مدیریت دسترسی ها به عهده ماژول اعتبار سنجی هست.
بعد از لاگین کاربر ماژول اعتبارسنجی اطلاعات کاربر را بررسی می کند و پس از تایید شدن هویت کاربر یک session به همراه یک شناسه یکتا برای کاربر ساخته می شود. و در داخل session اطلاعات مربوط به کاربر را مانند نام کاربر ، نقش و دسترسی را وارد می کند. سرور شناسه session را به سمت کلاینت بر می گرداند. کلاینت شناسه را در داخل یک کوکی ذخیره می کند و در درخواست های بعدی آن را به برنامه ارسال می کند. سپس اپلیکیشن می تواند از شناسه session برای تأیید هویت کاربر استفاده کند ، بدون نیاز به وارد کردن نام کاربری و رمز عبور برای تأیید اعتبار در هر بار.
در معماری میکروسرویس، یک اپلیکیشن به چندین میکروسرویس مجزا تقسیم می شود و هر میکروسرویس منطق یک ماژول در اپلیکیشن مونولیتیک پیاده سازی می کند. پس از تقسیم شدن کار ها ما نیاز به احراز هویت در میکروسرویس هایی که کاملا از هم جداگانه کار می کنند داریم. اگر از معماری مونولیتیک به میکروسرویس مهاجرت کنیم با مشکلات زیر در زمینه احراز هویت مواجه می شویم.
به منظور استفاده کامل از مزایای معماری میکروسرویس و دستیابی به مقیاس پذیری و انعطاف پذیری میکروسرویس ها نیاز است یکی از روش های زیر برای مدیریت سشن ها انتخاب شود.
روش سنتی استفاده از یک سشن در سمت سرور برای ذخیره وضعیت کاربر است. از آنجا که سرور stateful است، تأثیر آن بر گسترش افقی سرور است. توصیه می شود برای ذخیره وضعیت ورود کاربر در معماری میکروسرویس از توکن استفاده کنید.
تفاوت اصلی بین توکن و سشن در ذخیره سازی متفاوت است. سشن ها در سرور ذخیره می شوند. توکن ها توسط خود کاربر نگهداری می شوند و به طور معمول به صورت کوکی در مرورگر ذخیره می شوند. توکن اطلاعات هویت کاربر را در اختیار دارد و هر بار که درخواست به سرور ارسال می شود ، بنابراین سرور می تواند هویت کاربر را تعیین کند و مشخص کند که آیا به جای درخواست شده دسترسی دارد یا خیر.
توکن برای نشان هویت کاربر است. بنابراین برای جلوگیری از جعل توسط کاربر، باید محتوای توکن رمزگذاری شود. JWT یک استاندارد (RFC 7519) است که ساختار توکن و محتوی توکن را تعریف می کند ، آن را رمزگذاری می کند و برای زبان های مختلفی کتابخانه دارد. نمونه ای از jwt توکن را در قسمت زیر مشاهده میکنیم.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTIzLCJuYW1lIjoiTWVuYSBNZXNlaGEiLCJpc19hZG1pbiI6dHJ1ZSwiZXhwaXJlIjoxNTU4MjEzNDIwfQ.Kmy_2WCPbpg-aKQmiLaKFLxb5d3rOC71DHexncH_AcQd
با استفاده از توکن برای تأیید اعتبار کاربر، سرور وضعیت کاربر را ذخیره نمی کند. کاربر باید با هر درخواست توکن را برای تأیید اعتبار به سرور ارسال کند.
تأیید اعتبار کاربر با توکن به شرح زیر است:
ایده Single sign-on ساده است ، یعنی کاربران فقط باید یک بار وارد برنامه شوند ، سپس می توانند به کلیه خدمات در میکروسرویس ها دسترسی پیدا کنند. این راه حل بدین معنی است که هر میکروسوریس باید مانند میکروسرویس زیر با میکرو سرویس تأیید اعتبار ارتباط برقرار کند:
این می تواند باعث ایجاد ترافیک بسیار زیاد شبکه شود. هنگامی که ده ها میکروسرویس وجود دارد، اشکالاتی در مورد این راه حل خودشون رو نشون میدن.
مراحل احراز هویت کاربر مشابه روش دوم است. تفاوت در این است که API Gateway به عنوان ورودی درخواست خارجی اضافه می شود. این یعنی که همه درخواست ها باید از API Gateway رد بشوند.
در این حالت خروج از سیستم مشکلی ایجاد نمی کند زیرا API Gateway می تواند هنگام خروج از سیستم توکن کاربر را از بین ببرد.
چند روش پیاده سازی احراز هویت معماری میکروسرویس رو با هم بررسی کردیم که هرکدوم مزایا و معایب خاص خودشون را داشتند.
اگه بخوایم از روش های فوق نتیجه گیری کنیم احتمالا به ساختار زیر خواهیم رسید:
امیدوارم که این مطلب مفید بوده باشه.
منابع :
Authentication and Authorization of End User in Microservice Architecture
Microservices Authentication and Authorization Solutions