اینترنت و شبکه

HTTP و HTTPS چیست

HTTP قراردادی است که مرورگر و سرور با آن حرف می زنند: مرورگر یک درخواست می فرستد و سرور یک پاسخ برمی گرداند، به همراه یک کد سه رقمی که می گوید کار انجام شد یا نشد. HTTPS همان قرارداد است که داخل یک لایه رمز شده حرکت می کند، پس کسی در میانه راه نه محتوا را می خواند و نه می تواند عوضش کند.

  • درس ۶ از ۱۲
  • مقدماتی
  • رایگان، بدون ثبت نام

دو سر یک گفتگو، و چیزی که روی پل رد و بدل می شود

مرورگر

همیشه او شروع می کند. سرور هیچ وقت خودش زنگ نمی زند.

درخواستهدرهاکد وضعیتبدنه پاسخ

سرور

فقط جواب می دهد، و بین دو درخواست چیزی از شما به یاد ندارد.

این پل یک رفت و برگشت را نشان می دهد. یک صفحه معمولی ده ها بار همین را تکرار می کند، یک بار برای خود صفحه و بار های بعد برای تصویر و فونت و اسکریپت.

آخرین بررسی: فکت ها و نام ابزارهای این درس در همین تاریخ با منابعشان بازبینی شده اند.

وقتی یک آدرس را باز می کنید چه چیزی رد و بدل می شود؟

مرورگر یک درخواست می سازد و می فرستد، سرور یک پاسخ برمی گرداند. HTTP اسم قراردادی است که شکل این دو را تعیین می کند: درخواست می گوید چه چیزی را از کجا می خواهد، پاسخ می گوید نتیجه چه شد و بدنه اش چیست.

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

یک ویژگی که اسم این قرارداد پنهانش می کند: HTTP حافظه ندارد. هر درخواست برای سرور مستقل است و سرور به خودی خود نمی داند این همان کسی است که یک ثانیه پیش آمده بود. چیزی که ورود به حساب کاربری را ممکن می کند فقط یک هدر اضافه است که مرورگر هر بار دوباره می فرستد. اگر این را بدانید، نصف رفتارهای عجیب ورود و خروج از حساب دیگر عجیب نیستند.

نسخه های تازه تر همان قرارداد را مرتب تر و فشرده تر روی سیم می برند و معنی درخواست و پاسخ را عوض نمی کنند. صفحه های همین سایت روی HTTP/2 جواب می دهند و شبکه توزیع محتوایی که جلوی آن نشسته در یک هدر جداگانه اعلام می کند که HTTP/3 هم آماده است. برای خواننده این تفاوت دیدنی نیست و نباید هم باشد.

پلی میان قاب مرورگر و سرور سبز با کارت درخواست قرمز، کارت پاسخ آبی و قفل سفید روی پل

کدهای وضعیت را چطور بخوانیم؟

رقم اول کد تقریبا همه چیز را می گوید و بقیه اش جزئیات است. دویست یعنی شد، سیصد یعنی جای دیگری برو، چهارصد یعنی اشکال از درخواست بود، پانصد یعنی سرور خودش زمین خورد. همین یک جمله در عمل کافی است تا بدانید توپ زمین کیست.

کدیعنی چهچه کسی باید کاری بکند
200پاسخ آماده است و بدنه همان چیزی است که خواسته بودیدهیچ کس
301این نشانی برای همیشه به جای دیگری منتقل شده استهر کسی که هنوز نشانی قدیم را لینک کرده
404سرور سالم است و چنین نشانی ای نداردصاحب سایت، یا کسی که نشانی را اشتباه نوشته
500درخواست درست بود و برنامه سمت سرور خطا دادفقط صاحب سرور

یک تصور غلط رایج را همین جا تمام کنیم: کد 404 یعنی صفحه پیدا نشد، نه اینکه سایت خراب است. سرور کاملا سالم بوده و توانسته با اطمینان بگوید چنین چیزی ندارد. بدنه اش هم لزوما خالی نیست؛ صفحه چهارصد و چهار همین سایت یک صفحه کامل با منو و جستجو است و HTML آن بیش از صد کیلوبایت است. کد و ظاهر صفحه دو چیز مستقل اند.

و یک تله که در همین سرور بهایش را داده ایم: کد وضعیت و بدنه پاسخ همیشه با هم به مقصد نمی رسند. لایه های جلوی برنامه، یعنی وب سرور و شبکه توزیع محتوا، اجازه دارند بدنه یک پاسخ خطا را با صفحه خودشان عوض کنند. نتیجه اش این است که برنامه شما یک پیام خطای دقیق فرستاده و کاربر یک صفحه عمومی دیده است. اگر روزی خطایی را دیباگ می کنید که در لاگ سرور هست و در مرورگر نیست، اول به همین شک کنید.

رقم اول، و کدی که از هر خانواده به کار می آید

کد وضعیتسه رقم، که رقم اولش کار را تمام می کند
  • کد 200: انجام شد

    پاسخ آماده است و بدنه همان چیزی است که خواسته بودید.

    کاری لازم نیست
  • کد 301: جای دیگری برو

    این کد می گوید نشانی برای همیشه منتقل شده است.

    لینک قدیمی را به روز کنید
  • کد 404: اشکال از درخواست بود

    یعنی سرور توانسته با اطمینان بگوید چنین نشانی ای ندارد.

    سرور سالم است
  • کد 500: سرور زمین خورد

    یعنی درخواست درست بود و برنامه سمت سرور خطا داد.

    فقط صاحب سرور

این چهار خانواده تنها خانواده ها نیستند و هر خانواده کدهای دیگری هم دارد. اینها آنهایی اند که یک صاحب سایت واقعا با آنها روبه رو می شود.

HTTPS دقیقا چه چیزی را امن می کند؟

سه چیز، نه بیشتر. اول محرمانگی: هر کسی که در میانه راه نشسته باشد، از اپراتور تا صاحب یک وای فای عمومی، فقط می بیند که شما با کدام دامنه حرف زده اید و چه حجمی رد و بدل شده؛ نه نشانی دقیق صفحه را می بیند و نه محتوا را. دوم درستی: اگر کسی در راه یک بایت را عوض کند، مرورگر می فهمد و اتصال را قطع می کند. سوم هویت دامنه: مرورگر مطمئن می شود سروری که جواب می دهد واقعا برای همان دامنه گواهی دارد.

این کار با یک گواهی انجام می شود که یک مرجع صدور بیرونی امضایش کرده، به علاوه یک دست دادن کوتاه در ابتدای اتصال که کلید رمزنگاری آن نشست را می سازد. گواهی همین سایت را می شود همین حالا دید: صادرکننده اش Google Trust Services است، برای rgb.ir و هر زیردامنه آن معتبر است، و عمرش نود روز است. کوتاه بودن عمدی است؛ گواهی کوتاه عمر خودکار تمدید می شود و اگر کلیدی لو برود پنجره استفاده نادرست از آن کوچک می ماند.

اتصالی که همین حالا برقرار می شود روی TLS 1.3 بسته می شود. عدد نسخه چیزی است که تقریبا هیچ بازدیدکننده ای نمی بیند و تنها جایی اهمیت پیدا می کند که یک دستگاه خیلی قدیمی نتواند صفحه را باز کند.

و مرز این محافظت: HTTPS فقط مسیر را امن می کند. به محض اینکه داده به سرور رسید، از حفاظت این لایه بیرون آمده است. یک فرم کاملا رمز شده می تواند رمز عبور شما را در یک فایل متنی روی سروری ذخیره کند که هیچ کس مراقبش نیست. قفل درباره آن هیچ نمی گوید و ادعایش را هم ندارد.

قفل کنار آدرس چه چیزی را تضمین نمی کند؟

اینکه سایت راستگوست. قفل فقط می گوید مسیر رمز شده است و سروری که جواب می دهد برای همین دامنه گواهی دارد. درباره اینکه پشت آن دامنه چه کسی نشسته، فروشگاه واقعی است یا نه، و پولی که می فرستید کجا می رود، هیچ ادعایی ندارد.

این را از خودمان نمی گوییم. یکی از بزرگ ترین مراجع صدور گواهی رایگان دنیا در توضیح سیاست خودش نوشته است که گواهی اعتبارسنجی دامنه فقط می گوید یک کلید عمومی به یک دامنه تعلق دارد و «چیز دیگری درباره محتوای سایت یا اینکه چه کسی آن را می گرداند نمی گوید»، و اضافه می کند این گواهی ها هیچ اطلاعاتی درباره اعتبار، هویت واقعی یا امن بودن یک سایت در خود ندارند. یعنی خود صادرکننده تصریح می کند که قفل مهر تایید محتوا نیست.

نتیجه عملی اش تلخ و ساده است: یک سایت جعلی هم می تواند در چند دقیقه گواهی معتبر بگیرد و قفل را نشان بدهد. پس اگر ملاک شما برای اعتماد به یک صفحه پرداخت وجود قفل باشد، دقیقا همان چیزی را ملاک گرفته اید که مهاجم به سادگی می تواند فراهم کند.

چیزی که واقعا باید نگاه کنید نام دامنه است، حرف به حرف. در یک نشانی، تنها بخشی که هویت را تعیین می کند همان است که درست قبل از اولین اسلش می آید. هر چیزی می تواند قبل از آن قرار بگیرد. موضع ما این است: به قفل نگاه نکنید، به دامنه نگاه کنید، و اگر لینک از پیامک یا از یک پیام رسان آمده، اصلا رویش کلیک نکنید و نشانی را خودتان تایپ کنید.

یک استثنا هم بگوییم تا کامل باشد: نبودن قفل هنوز هم یک هشدار واقعی است. صفحه ای که در سال جاری فرم ورود یا پرداخت را بدون HTTPS نشان می دهد، بدون هیچ بحث دیگری قابل اعتماد نیست. قفل شرط لازم است و کافی نیست.

آنچه قفل می گوید، و آنچه زیر آب می ماند

مسیر رمز شده است و گواهی برای همین دامنه است

همین و بس. این تنها چیزی است که قفل ادعا می کند.

خط آب: قفل درباره هیچ کدام از اینها حرفی ندارد
  • پشت این دامنه چه کسی نشسته است

    یک سایت جعلی هم در چند دقیقه گواهی معتبر می گیرد.

  • محتوای صفحه راست است یا دروغ

    مرجع صدور، محتوا را نمی خواند و ادعا هم نمی کند که خوانده است.

  • پولی که می فرستید کجا می رود

    یک صفحه پرداخت رمز شده هم می تواند صفحه پرداخت کس دیگری باشد.

  • داده بعد از رسیدن چطور نگه داری می شود

    محافظت این لایه دقیقا در همان لحظه ای تمام می شود که داده به سرور می رسد.

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

سایت را چطور درست روی HTTPS ببریم؟

گواهی گرفتن آسان ترین قسمت کار است و معمولا هاست خودش انجامش می دهد. چیزی که کار را خراب می کند سه تای بعدی است.

اول، هر درخواست HTTP باید با کد 301 به نسخه امن همان نشانی برود، نه به صفحه اول. انتقال همه چیز به صفحه اول ساده ترین راه است و بدترین، چون هر لینک قدیمی را می کشد. دوم، محتوای مخلوط: اگر صفحه امن است ولی یک تصویر یا اسکریپت را از نشانی ناامن صدا می زند، مرورگر یا آن را می بندد یا هشدار می دهد. سوم، هدر HSTS، که به مرورگر می گوید از این به بعد اصلا HTTP را امتحان نکن؛ روی همین سایت مقدارش یک سال است.

یک هزینه که کسی درباره اش حرف نمی زند: هر پرش اضافه یک رفت و برگشت است. روی همین سایت، کسی که نشانی قدیمی rgb.ir/seo/ را بدون https تایپ کند دو پرش می خورد، اول از HTTP به HTTPS و بعد از نشانی قدیم به نشانی تازه، و تازه بعد از آن اولین بایت صفحه می آید. برای یک بازدیدکننده اهمیتی ندارد؛ برای یک لینک که در تبلیغات و منو و امضای ایمیل تکرار می شود، مهم است. قاعده ساده است: در هر جایی که خودتان کنترل دارید، نشانی نهایی را لینک کنید نه نشانی قدیمی را.

و مرزش: HSTS یک تعهد است، نه یک تنظیم قابل بازگشت. مرورگری که این هدر را دیده تا پایان مدتش حاضر نیست با HTTP به دامنه شما وصل شود، حتی اگر گواهی تان منقضی شده باشد. اگر مطمئن نیستید که HTTPS برای همیشه پابرجاست، این هدر را با مدت کوتاه شروع کنید.

وضعیت گواهی و تاریخ انقضای هر دامنه ای را می شود در چند ثانیه دید، بدون نصب هیچ چیزی: ابزار رایگان بررسی SSL همین کار را می کند. برای خود مفهوم گواهی و انواعش هم مقاله SSL چیست نوشته شده و این درس عمدا تکرارش نمی کند.

مسیر سریع با هوش مصنوعی

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

  1. خروجی را خودتان بگیرید، نه از مدل بخواهید. یک خط کافی است: curl -sSIL http://example.com/path/. با http شروع کنید نه https، وگرنه پرش اول را که مهم ترینش است هرگز نمی بینید.
  2. قبل از چسباندن، دو هدر را پاک کنید: Set-Cookie و Authorization. اینها اعتبارنامه زنده اند و در یک دستور بی ضرر به نظر می رسند.
  3. دستور زیر را با خروجی خام بدهید و بخواهید فقط از روی همان جواب بدهد. مدل سریع و ارزان برای این کار کافی است؛ اینجا خواندن است نه قضاوت، و انتخاب امروزی هر رده در مرجع هوش مصنوعی به روز نگه داشته می شود.
  4. جواب را با خروجی تطبیق بدهید. هر هدری که مدل نام برد و در متن شما نبود، یک ساخته است و باید همان جا کنار گذاشته شود.

نسخه آماده کپی

نقش تو کارشناس HTTP است. فقط از روی خروجی زیر قضاوت کن و هیچ چیزی به آن اضافه نکن.

خروجی خام (curl -sSIL، بدون Set-Cookie و Authorization):
{اینجا بچسبانید}

چیزی که می خواهم بدانم: {مثلا چرا لینک قدیمی من کند است}

پنج چیز بنویس:
۱. چند پرش تا پاسخ نهایی، و هر پرش چه کدی داشت و به کدام نشانی رفت.
۲. آیا پرشی فقط برای رفتن از HTTP به HTTPS خرج شده است. اگر بله، بگو چند رفت و برگشت اضافه شده.
۳. آیا هدر Strict-Transport-Security هست، و مدتش چقدر است.
۴. از روی هدرها بگو کدام لایه ها به پاسخ دست زده اند: وب سرور، کش صفحه، شبکه توزیع محتوا. برای هر کدام هدری را که این را نشان می دهد نقل کن.
۵. یک تغییر که خود من می توانم انجام بدهم تا تعداد پرش ها کم شود.

قاعده ها: پاسخ 1xx مثل 103 یک پرش نیست و در شمارش نمی آید. هیچ هدری را که در متن بالا نیست ننویس. اگر برای یکی از بندها داده کافی نیست، بنویس «در این خروجی نیست» و حدس نزن.

قبل از اعتماد به خروجی: دو چیز را خودتان باید تایید کنید. اول، هر هدری که مدل نام می برد باید عینا در خروجی شما باشد؛ این تنها بررسی است که ساختن را می گیرد و ده ثانیه وقت می برد. دوم، اگر جواب پیشنهاد کرد پرشی را حذف کنید، پیش از دست زدن مطمئن شوید آن نشانی قدیمی جایی لینک نشده باشد: حذف یک انتقال، هر لینک قدیمی را به یک ۴۰۴ تبدیل می کند و این کاری است که برگشتش سخت است.

هوش مصنوعی در این کار

برای این موضوع، مدل زبانی در یک کار بسیار خوب است و در یک کار بسیار بد. خوب در خواندن: یک خروجی خام هدر یا یک زنجیره انتقال را می گیرد و در چند ثانیه به فارسی توضیح می دهد که هر خط چه می گوید، کاری که یادگیری اش قبلا هفته ها طول می کشید. بد در قضاوت: به هیچ عنوان نمی تواند بگوید یک سایت قابل اعتماد است یا نه، چون همان دو نشانه ای را می بیند که مهاجم خودش ساخته است.

ابزارهایی که واقعا کمک می کنند

  • Claude برای خواندن خروجی خام دستورها ساخته شده و همین درس هم کاربرد اصلی اش است: هدرها را می چسبانید و می پرسید هر کدام چه می کند. ایران در فهرست کشورهای پشتیبانی شده انتروپیک نیست، پس راه رسمی ثبت نام و پرداخت وجود ندارد.
  • Gemini برای ترجمه اصطلاح های HTTP به فارسی و توضیح مفهوم ها با مثال خوب کار می کند. صفحه خود گوگل می نویسد اپ جمنای در بیش از دویست و سی کشور و منطقه در دسترس است و ایران در آن فهرست نیست.

کجا نتیجه معکوس می دهد

خطر اصلی اینجا آن چیزی نیست که مدل نمی داند، آن چیزی است که با اطمینان کامل می گوید. دو شکل مشخص دارد. اول، از مدل بپرسید «این سایت امن است؟» و برایتان استدلال می کند که چون قفل دارد و دامنه اش معتبر به نظر می رسد احتمالا امن است. هر دو نشانه را مهاجم خودش فراهم کرده و مرجع صدور گواهی هم صریحا می گوید گواهی درباره اعتبار و هویت واقعی سایت هیچ اطلاعاتی ندارد. تشخیص کلاهبرداری کار یک مدل زبانی نیست و اگر جوابی داد، آن جواب یک حدس با لحن مطمئن است. دوم، مدل نام یک هدر یا معنی یک کد وضعیت را می سازد؛ خود انتروپیک این ساختن با اطمینان را در مستنداتش توهم می نامد و راه های کم کردنش را می نویسد، یعنی سازنده هم آن را ضعف واقعی می داند. راه حل هر دو یکی است: مدل فقط اجازه دارد چیزی را توضیح بدهد که خودتان جلویش گذاشته اید.

منبع ها: Let's Encrypt: the CA role in fighting phishing and malware Anthropic: reduce hallucinations Anthropic: supported countries Google: where Gemini Apps are available

حد این توصیه

این درس درباره قرارداد است، نه درباره خرید و نصب گواهی. انتخاب نوع گواهی، صدور و تمدیدش کار دیگری است که مقاله SSL چیست و صفحه گواهی SSL به آن می پردازند و اینجا عمدا تکرار نشده است. دو مرز دیگر هم صریح بگوییم: هر عددی که اینجا آمده از سرور خود ما در اروپا اندازه گیری شده و درباره مسیری که یک بازدیدکننده ایرانی طی می کند چیزی نمی گوید، چون این سرور نمی تواند آن را ببیند. و با اینکه لبه شبکه ما آمادگی HTTP/3 را اعلام می کند، ما یک اتصال کامل روی آن را اندازه نگرفته ایم، پس این درس هیچ ادعایی درباره سرعتش نمی کند.

از تجربه خود ما

چهار چیز از همین سایت که در ۱۶ شهریور ۱۴۰۵ اندازه گرفته شده و هر چهار تا قابل تکرارند. اول، کسی که نشانی قدیمی rgb.ir/seo/ را بدون https تایپ کند دو پرش ۳۰۱ می خورد، اولی از HTTP به HTTPS با همان مسیر و دومی به نشانی تازه، و اولین بایت صفحه بعد از هر دو می آید. دوم، گواهی این سایت را Google Trust Services صادر کرده، برای rgb.ir و هر زیردامنه آن معتبر است و عمرش نود روز است. سوم، اتصال روی TLS 1.3 بسته می شود، صفحه روی HTTP/2 جواب می دهد و هدر HSTS مقدار یک ساله دارد. چهارم، صفحه ۴۰۴ همین سایت یک صفحه کامل است و HTML آن بیش از صد کیلوبایت است؛ برای همین در متن نوشتیم کد وضعیت و ظاهر صفحه دو چیز مستقل اند. خام هر چهار اندازه گیری در گزارش همین جلسه ثبت شده است.

سوال هایی که واقعا پرسیده می شوند

آیا HTTPS سایت را در گوگل بالاتر می برد؟

صورت درست سوال این است: امروز HTTPS یک مزیت نیست، نبودش یک ضرر است. همه سایت های جدی روی آن هستند، پس چیزی که شما را از بقیه جلو بیندازد نیست؛ اما مرورگر نبودش را کنار نشانی به کاربر اعلام می کند و همین به تنهایی روی اعتماد و نرخ خروج اثر می گذارد. اگر سایتی هنوز روی HTTP است، دلیل انتقالش مرورگر است نه رتبه.

کد ۳۰۱ با ۳۰۲ چه فرقی دارد؟

کد ۳۰۱ می گوید این جابه جایی همیشگی است و کد ۳۰۲ می گوید موقتی است. تفاوتش در عمل این است که موتور جستجو با ۳۰۱ نشانی تازه را جایگزین قدیمی می کند و با ۳۰۲ نشانی قدیمی را نگه می دارد چون فرض کرده روزی برمی گردید. قاعده ساده: اگر قرار نیست برگردید، ۳۰۱ بگذارید.

گواهی دارم ولی مرورگر می گوید اتصال کاملا امن نیست؛ چرا؟

در بیشتر موارد محتوای مخلوط است: صفحه روی HTTPS باز شده ولی یک تصویر یا اسکریپت را از نشانی HTTP صدا می زند. دو دلیل بعدی هم شایع اند: گواهی برای دامنه دیگری صادر شده، مثلا برای دامنه بدون www در حالی که کاربر با www آمده؛ یا تاریخش گذشته است. هر سه در چند ثانیه با ابزار بررسی SSL از هم قابل تفکیک اند.