وبلاگ

چرا ورود شما یک عدد است، نه یک ایمیل

حسابی که به آن نیاز ندارید یک عدد 128 بیتی است، صادرشده توسط ماشینی که ساختاری نمی‌تواند تونل شما را باز کند. این‌جا می‌گوییم چرا هر دوی این‌ها باید با هم درست باشند.

تاریخ انتشار: ۱۴ شهریور ۱۴۰۵ · به‌روزرسانی: ۲۴ مهر ۱۴۰۵

بیشتر اپلیکیشن‌ها پیش از پرسیدن اینکه اصلاً برای چه آمده‌اید، آدرس ایمیل می‌خواهند. ForestVPN نه ایمیل می‌خواهد و نه رمز عبور — آن را باز کنید، دکمهٔ اتصال را بزنید. اگر یک اشتراک را روی بیش از یک دستگاه می‌خواهید، در عوض عددی 32 کاراکتری می‌گیرید، که فقط یک‌بار نشان داده می‌شود، و کل سامانهٔ ورود همین است.

این یک انتخاب سلیقه‌ای نیست. این چیزی است که پس از برخورد دو الزام باقی می‌ماند، و بخش جالب این است که کدام‌یک برنده می‌شود.

معمولاً ورود کجا اتفاق می‌افتد

دکمهٔ «Sign in with Apple» یا «Sign in with Google» در واقع یک ریدایرکت به دامنهٔ شخص دیگری است — appleid.apple.com، accounts.google.com، یک تننت *.auth0.com. روی گوشی‌ای که مسیری باز به آن میزبان‌ها دارد، آن ریدایرکت مثل لوله‌کشی‌ای نامرئی است.

نمی‌توانیم فرض کنیم آن مسیر باز است، چون بخشی از وظیفهٔ این محصول این است که روی شبکه‌هایی هم کار کند که فقط اجازه می‌دهند یک دستگاه به فهرستی کوتاه و ثابت از میزبان‌ها برسد. کل مدل امنیتیِ پراکسیِ رله‌ایِ خودمان همان فهرست است — سه نام، api.، sess. و catalog.fvpn.net، دقیقاً همان‌طور که هست. گسترش آن برای پذیرفتن یک ارائه‌دهندهٔ هویت پشتِ یک CDN یعنی پذیرفتن ارائه‌دهنده‌ای که همان CDN بخش بزرگی از اینترنت را هم پشتیبانی می‌کند، که یک رلهٔ محدود را به یک رلهٔ همه‌کاره تبدیل می‌کند. و به‌طور خاص روی iOS، وب‌ویوی ورود برای یک ارائه‌دهندهٔ هویتِ شخص ثالث خارج از فرایند اصلی اجرا می‌شود — یک تنظیم پراکسیِ سطح‌اپلیکیشن هیچ راهی برای رسیدن به داخل آن و مسیردادنش از طریق هرچیزی که ما اداره می‌کنیم ندارد. آن ریدایرکت دقیقاً همان‌جایی شکست می‌خورد که بیشترین نیاز را به کارکردن دارد.

پس آن عدد گزینه‌ای دوستانه نیست که به‌جای گزینهٔ آشنا انتخاب کرده باشیم. این همان گزینه‌ای است که زیر محدودیتی که اهمیت بیشتری داشت، همچنان کار می‌کند.

نیمهٔ دیگر: هیچ‌کس که آن عدد را دارد نمی‌تواند ترافیک شما را ببیند

شماره حساب را به شکلی دیگر بگوییم: این اعتبارنامه‌ای است که توسط سرویسی صادر می‌شود که روی Cloudflare Workers اجرا می‌شود — اجرای محدود به هر درخواست، بدون فرایند طولانی‌مدت، بدون سوکت خام، و سقفی برای حافظهٔ هر ایزوله در حد چند ده مگابایت. هیچ‌کدام از این‌ها محدودیتی نیست که دورش بزنیم. همین است که باعث می‌شود بتوان به آن سرویس برای نگه‌داشتن حق استفادهٔ شما اصلاً اعتماد کرد:

no raw UDP or TCP sockets
no long-lived process — execution is request-scoped
128 MB per isolate
a few MB, compressed, is the entire deployable

ماشینی که این‌طور ساخته شده نمی‌تواند یک تونل UDPِ دارای وضعیت را خاتمه دهد — نه اینکه «هنوز نمی‌تواند»، بلکه ساختاری. پس سرورهایی که واقعاً ترافیک شما را حمل می‌کنند، ناوگانی جداگانه‌اند، روی زیرساختی جداگانه، و دو طرف دقیقاً از طریق یک چیز به هم می‌رسند: یک بلیت. دستگاه شما از سمت Workers یکی درخواست می‌کند و مقداری امضاشده اما نخوانده پس می‌گیرد — این امضا روی عددی تولید می‌شود که خودِ امضاکننده هرگز آن را نمی‌بیند، پس بلیتی که بعداً ارائه می‌دهید نمی‌تواند به همان درخواستی که آن را صادر کرده ردیابی شود. این بلیت ثابت می‌کند کدام رده آن را خریده. نمی‌گوید کدام دستگاه، و نمی‌گوید شما.

همین است که شماره حساب را به همان شکلی که باید باشد، بی‌اهمیت می‌کند. هیچ ستونی در این سامانه وجود ندارد که شماره حساب را کنار یک سرور خروجی یا آدرسی که از آن متصل شده‌اید نگه دارد — نه اینکه «ما تصمیم گرفته‌ایم نگاه نکنیم»، آن ستون اصلاً وجود ندارد، و اگر کسی آن را اضافه کند یک بررسیِ build شکست می‌خورد. یک استثنای محدودتر و آگاهانه هست، و آن دربارهٔ دستگاه است، نه دربارهٔ شماره: تا وقتی یک بلیت زنده است، یک ردیف هش کلید دستگاه شما را کنار هشی از نشستی که به آن تعلق دارد نام می‌برد، که همین اجازه می‌دهد یک بلیتِ مصرف‌شده در برابر سهمیهٔ شما حساب شود و یک دستگاهِ لغوشده در میانهٔ نشست قطع شود. آن ردیف حدود یک روز پس از پایان نشست حذف می‌شود، زودتر اگر زودتر مستقر شود، و هیچ فیلدی برای سرور خروجی یا آدرس ندارد — فقط دستگاه و نشست، نه چیز دیگری. اگر دستگاهی را به حسابی پیوند داده باشید، همان پیوند حد دسترسی است؛ خودِ شماره حساب هرگز به یک ردیف نشست نمی‌رسد. سرویسی که واقعاً ترافیک شما را می‌بیند، از همان ابتدا آن شماره را نمی‌آموزد.

هزینه‌ای که دارد، گفته‌شده نه پنهان

هیچ‌کدام از این‌ها رایگان نیست. آن عدد فقط یک‌بار نشان داده می‌شود و در سمت ما هیچ‌جا ذخیره نمی‌شود؛ اگر آن را گم کنید درحالی‌که هیچ دستگاهی دیگر به آن وصل نیست، چیزی برای بازیابیِ آن با آن وجود ندارد، چون چیز دیگری که شما را شناسایی کند تا در برابرش بازیابی شود وجود ندارد. پیوند را می‌شود برداشت: یک دستگاه می‌تواند خودش از حساب خارج شود و هر دستگاه دیگرِ روی حساب می‌تواند آن را حذف کند (هر حساب تا ده دستگاه دارد؛ دستگاهی که در ۷ روز گذشته اضافه شده نمی‌تواند دستگاه‌های قدیمی‌تر را حذف کند و روتر نمی‌تواند دستگاه‌های دیگر را حذف کند). چیزی که برگشت‌پذیر نیست از دست دادن شماره است: بازنشانیِ رمز عبوری وجود ندارد، چون آن به راهی نیاز دارد که ثابت کند درخواست از سوی صاحب واقعیِ حساب آمده، و کل نکتهٔ طراحی این بود که هرگز چیزی جمع‌آوری نشود که بتواند آن را ثابت کند.

این یک مصالحهٔ واقعی است، نه یک پانوشت، و ترجیح می‌دهیم شما از همان ابتدا آن را بدانید تا اینکه دقیقاً همان لحظه‌ای که اهمیت دارد متوجه آن شوید.

همهٔ نوشته‌ها

فارسی
هر سؤالی دارید بپرسید