تصور کنید مهاجمی به رمز عبور یکی از کاربران دست پیدا کرده است. در گذشته، همین یک اطلاعات برای ورود به حساب کاربری کافی بود. اما امروز، با افزایش نشت اطلاعات، حملات فیشینگ و استفاده مجدد کاربران از یک رمز عبور در چندین سرویس، دیگر نمیتوان رمز عبور را تنها خط دفاعی یک وباپلیکیشن دانست.
احراز هویت دو عاملی (2FA) دقیقا برای حل همین مشکل به وجود آمده است. در این روش، حتی اگر رمز عبور کاربر فاش شود، مهاجم همچنان برای ورود به حساب به یک عامل امنیتی دیگر نیاز دارد، عاملی که معمولا فقط در اختیار صاحب حساب است. همین لایه امنیتی اضافه، احتمال دسترسی غیرمجاز را به شکل چشمگیری کاهش میدهد و به همین دلیل، امروزه 2FA به یکی از استانداردهای امنیتی در سرویسهای آنلاین تبدیل شده است.
در این مطلب، با مفهوم احراز هویت دو عاملی، نحوه عملکرد آن، روشهای مختلف پیادهسازی و نکاتی آشنا میشویم که به شما کمک میکنند این قابلیت را به شکلی امن و اصولی در وباپلیکیشنهای خود پیادهسازی کنید.
احراز هویت دو عاملی (2FA) چیست؟
احراز هویت دو عاملی یا Two-Factor Authentication (2FA) روشی برای تایید هویت کاربران است که بهجای تکیه بر یک عامل، از دو عامل مستقل برای ورود به سیستم استفاده میکند. هدف از این روش، کاهش احتمال دسترسی غیرمجاز به حسابهای کاربری، حتی در صورت افشای رمز عبور است.
برای درک بهتر 2FA، ابتدا باید بین احراز هویت (Authentication) و مجوزدهی (Authorization) تفاوت قائل شد. احراز هویت مشخص میکند کاربر واقعا همان کسی است که ادعا میکند، در حالی که مجوزدهی تعیین میکند پس از ورود، به چه بخشهایی از سیستم دسترسی خواهد داشت. 2FA بخشی از فرآیند احراز هویت است و قبل از تعیین سطح دسترسی انجام میشود.
در سیستمهای احراز هویت، عامل به نوعی مدرک برای اثبات هویت کاربر گفته میشود. این عوامل معمولا در سه دسته اصلی قرار میگیرند:
-
چیزی که میدانید: مانند رمز عبور، PIN یا پاسخ به سؤال امنیتی.
-
چیزی که دارید: مانند تلفن همراه، برنامههای تولیدکننده کد یکبارمصرف، توکن سختافزاری یا کلید امنیتی.
-
چیزی که هستید: مانند اثر انگشت، تشخیص چهره یا سایر ویژگیهای بیومتریک.
احراز هویت دو عاملی (2FA) چگونه کار میکند؟
فرآیند احراز هویت دو عاملی در ظاهر تنها یک مرحله بیشتر از ورود معمولی دارد، اما همین مرحله اضافه، نقش مهمی در افزایش امنیت حسابهای کاربری ایفا میکند.
ابتدا کاربر نام کاربری و رمز عبور خود را وارد میکند. اگر این اطلاعات صحیح باشد، سیستم بهجای ورود مستقیم، از کاربر میخواهد عامل دوم احراز هویت را نیز ارائه کند. این عامل میتواند یک کد یکبارمصرف، تایید از طریق یک اپلیکیشن احراز هویت، اعلان (Push Notification) یا حتی یک کلید امنیتی فیزیکی باشد.
پس از اعتبارسنجی عامل دوم، هویت کاربر تایید میشود و سیستم یک Session یا توکن دسترسی (مانند JWT) صادر میکند. از این لحظه، کاربر میتواند تا پایان اعتبار Session یا توکن، بدون نیاز به تکرار فرآیند احراز هویت از سرویس استفاده کند.
بهطور خلاصه، جریان ورود در یک سیستم 2FA به شکل زیر است:
-
کاربر نام کاربری و رمز عبور خود را وارد میکند.
-
سرور اعتبار اطلاعات را بررسی میکند.
-
در صورت موفقیت، درخواست ارائه عامل دوم ارسال میشود.
-
کاربر کد یا عامل دوم را ارسال میکند.
-
سیستم عامل دوم را اعتبارسنجی میکند.
-
در صورت تایید، Session یا JWT ایجاد شده و کاربر وارد حساب خود میشود.
همین مرحله دوم باعث میشود حتی اگر مهاجم به رمز عبور کاربر دسترسی پیدا کند، بدون در اختیار داشتن عامل دوم، امکان ورود به حساب را نداشته باشد.
در یک سیستم 2FA، کاربر باید حداقل از دو دسته متفاوت این عوامل استفاده کند. برای مثال، وارد کردن رمز عبور (چیزی که میدانید) بههمراه کد تولیدشده توسط یک برنامه احراز هویت (چیزی که دارید)، یک نمونه رایج از احراز هویت دو عاملی است. همین ترکیب باعث میشود سرقت تنها یکی از عوامل، برای ورود به حساب کاربری کافی نباشد.

روشهای رایج پیادهسازی 2FA
احراز هویت دو عاملی را میتوان با روشهای مختلفی پیادهسازی کرد. هر روش سطح امنیت، هزینه و تجربه کاربری متفاوتی دارد و انتخاب بهترین گزینه به نیازهای پروژه و حساسیت اطلاعات بستگی دارد.
-
SMS OTP: در این روش، یک کد یکبارمصرف از طریق پیامک برای کاربر ارسال میشود. پیادهسازی آن ساده است، اما در برابر حملاتی مانند تعویض سیمکارت (SIM Swapping) یا رهگیری پیامک، امنیت بالایی ندارد.
-
Email OTP: کد تایید به آدرس ایمیل کاربر ارسال میشود. این روش از SMS ارزانتر است، اما امنیت آن به امنیت حساب ایمیل کاربر وابسته است.
-
TOTP (Time-based One-Time Password): یکی از رایجترین و امنترین روشها که در اپلیکیشنهایی مانند Google Authenticator ،Microsoft Authenticator و Authy استفاده میشود. کدها بهصورت محلی و بر اساس زمان تولید میشوند و نیازی به ارسال پیامک یا اتصال دائمی به اینترنت ندارند.
-
Push Notification: پس از وارد کردن رمز عبور، یک اعلان به اپلیکیشن کاربر ارسال میشود و او تنها با تایید آن میتواند وارد حساب شود. این روش تجربه کاربری بسیار خوبی دارد و در بسیاری از سرویسهای بزرگ مورد استفاده قرار میگیرد.
-
Security Key (FIDO2 / WebAuthn): در این روش از کلیدهای امنیتی سختافزاری یا قابلیتهای امنیتی دستگاه استفاده میشود. این راهکار بالاترین سطح امنیت را ارائه میدهد و در برابر حملات فیشینگ نیز مقاومت بسیار بالایی دارد.
اگرچه همه این روشها امنیت بیشتری نسبت به استفاده از رمز عبور بهتنهایی ایجاد میکنند، اما امروزه TOTP و WebAuthn بهعنوان دو گزینه استاندارد و قابل اعتماد، بیشتر از سایر روشها برای توسعه وباپلیکیشنهای مدرن توصیه میشوند.
پیادهسازی 2FA در یک وب اپلیکیشن
یکی از رایجترین روشهای پیادهسازی 2FA در وباپلیکیشنها، استفاده از TOTP است. در این روش، کاربر یکبار اپلیکیشن احراز هویت خود را به حساب کاربری متصل میکند و پس از آن، برای هر ورود باید کد ششرقمی تولیدشده توسط آن اپلیکیشن را وارد کند.
فرآیند پیادهسازی معمولا از تولید یک Secret Key برای هر کاربر آغاز میشود. این کلید بهصورت امن در دیتابیس ذخیره شده و با استفاده از آن، یک QR Code تولید میشود تا کاربر بتواند آن را با اپلیکیشنهایی مانند Google Authenticator یا Authy اسکن کند.
در Node.js میتوان با استفاده از کتابخانه speakeasy یک Secret تولید کرد:
const speakeasy = require("speakeasy");
const secret = speakeasy.generateSecret({
name: "MyApp"
});
console.log(secret.base32);
پس از اسکن QR Code، اپلیکیشن احراز هویت هر ۳۰ ثانیه یک کد جدید تولید میکند. هنگام ورود، کاربر این کد را وارد میکند و سرور آن را با Secret ذخیرهشده اعتبارسنجی میکند.
نمونه اعتبارسنجی کد:
const verified = speakeasy.totp.verify({
secret: user.secret,
encoding: "base32",
token: userToken
});
if (verified) {
// Login success
}
اگر کد معتبر باشد، فرآیند احراز هویت تکمیل شده و سیستم میتواند Session یا JWT کاربر را ایجاد کند. در غیر این صورت، درخواست ورود رد میشود.
در پروژههای واقعی، این فرآیند معمولاً با تولید QR Code، رمزنگاری Secret قبل از ذخیرهسازی، محدود کردن تعداد تلاشهای ناموفق و ارائه Backup Code به کاربران تکمیل میشود تا هم امنیت افزایش پیدا کند و هم امکان بازیابی حساب در شرایط اضطراری وجود داشته باشد.
بهترین روشها برای پیادهسازی 2FA
پیادهسازی 2FA تنها به اضافه کردن یک مرحله ورود محدود نمیشود. برای اینکه این قابلیت هم امنیت مناسبی داشته باشد و هم تجربه کاربری را تحت تاثیر قرار ندهد، رعایت چند نکته ضروری است.
-
کدهای بازیابی: مجموعهای از کدهای یکبارمصرف در اختیار کاربر قرار دهید تا در صورت از دست دادن دستگاه احراز هویت، بتواند دوباره به حساب خود دسترسی پیدا کند.
-
محدود کردن تعداد تلاشها: تعداد دفعات وارد کردن کد را محدود کنید تا از حملات Brute Force جلوگیری شود.
-
رمزنگاری اطلاعات حساس: Secret مربوط به هر کاربر را بهصورت امن ذخیره کنید و از قرار دادن آن در لاگها یا پاسخهای API خودداری کنید.
-
فرآیند بازیابی حساب: مکانیزمی امن برای غیرفعال کردن یا بازیابی 2FA در نظر بگیرید تا کاربران در صورت تعویض یا گم شدن دستگاه، حساب خود را از دست ندهند.
-
اعتماد به دستگاههای شناختهشده (Trusted Devices): در صورت نیاز، امکان اعتماد به یک دستگاه برای مدتزمان مشخص را فراهم کنید تا کاربر مجبور نباشد در هر ورود، عامل دوم را وارد کند.
-
استفاده از روش مناسب: برای سیستمهای حساس، استفاده از TOTP یا WebAuthn نسبت به SMS، امنیت بیشتری فراهم میکند و در برابر بسیاری از حملات رایج مقاومتر است.
مزایا و محدودیتهای 2FA
استفاده از 2FA یکی از موثرترین راهکارها برای افزایش امنیت حسابهای کاربری است، اما مانند هر مکانیزم امنیتی دیگری، مزایا و محدودیتهای خاص خود را دارد:
| محدودیت | مزایا | ویژگی |
|---|---|---|
| — | جلوگیری از دسترسی غیرمجاز حتی در صورت افشای رمز عبور | امنیت |
| نیاز به یک مرحله اضافی هنگام ورود | افزایش اعتماد کاربران به امنیت سرویس | تجربه کاربری |
| برخی روشها به زیرساخت یا سرویسهای جانبی نیاز دارند | امکان استفاده از روشهای مختلف متناسب با نیاز پروژه | پیادهسازی |
| SMS OTP میتواند هزینه ارسال پیامک ایجاد کند | TOTP و Email OTP هزینه اجرایی پایینی دارند | هزینه |
| SMS OTP در برابر حملاتی مانند SIM Swapping آسیبپذیرتر است | TOTP و WebAuthn مقاومت بالایی در برابر بسیاری از حملات دارند | مقاومت در برابر حملات |
در مجموع، مزایای 2FA بهمراتب بیشتر از چالشهای آن است. هرچند اضافه شدن یک مرحله به فرآیند ورود ممکن است اندکی بر تجربه کاربری تاثیر بگذارد، اما این هزینه در برابر افزایش قابل توجه امنیت، برای بیشتر وباپلیکیشنها کاملا منطقی و قابل قبول است.
جمعبندی
2FA یک لایه اضافی ساده اما بسیار موثر در معماری امنیتی وباپلیکیشنهاست که وابستگی سیستم به رمز عبور را کاهش میدهد و سطح حفاظت از حسابهای کاربری را بهطور قابل توجهی افزایش میدهد.
در این مقاله دیدیم که چگونه 2FA با ترکیب دو عامل مستقل، حتی در صورت افشای رمز عبور، از دسترسی غیرمجاز جلوگیری میکند. همچنین روشهای مختلف پیادهسازی آن، از SMS OTP تا TOTP و WebAuthn، بررسی شد و مشخص شد که هر روش بسته به سطح امنیت و تجربه کاربری، کاربرد متفاوتی دارد.
در نهایت، 2FA زمانی بیشترین ارزش را دارد که در سیستمهایی با دادههای حساس یا دسترسیهای سطح بالا استفاده شود، جایی که یک لایه امنیتی اضافه میتواند تفاوت بین یک حساب امن و یک نفوذ جدی را رقم بزند.
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید