Lesson 23 of 26

Урок 23 — HTTP vs HTTPS

Название: HTTP vs HTTPS — открытый и защищённый протокол
Описание: Разбираем разницу между HTTP и HTTPS, как работает TLS-шифрование, что такое SSL-сертификат, как проверять HTTPS в браузере и какие риски несёт HTTP.
Почему это важно для QA: Тестировщик должен понимать разницу между HTTP и HTTPS, уметь проверять корректность сертификатов, правильность редиректов и настройки безопасных заголовков.


1. Что такое HTTP

HTTP (HyperText Transfer Protocol) — протокол передачи данных между клиентом (браузером) и сервером. Данные передаются в открытом виде — любой, кто находится «между» клиентом и сервером, может прочитать их.

Аналогия для HTTP

Ты пишешь письмо и отправляешь его открыткой без конверта. Почтальон, сосед, любой случайный человек может прочитать его содержимое. Это HTTP.


2. Что такое HTTPS

HTTPS (HyperText Transfer Protocol Secure) — это HTTP с добавлением шифрования через TLS (Transport Layer Security). Данные между клиентом и сервером зашифрованы и защищены от перехвата.

Аналогия для HTTPS

Ты кладёшь письмо в конверт, запечатываешь его особым замком. Только получатель, у которого есть ключ от этого замка, может вскрыть конверт. Даже почтальон не может прочитать содержимое. Это HTTPS.


3. Как работает HTTPS (TLS Handshake)

Клиент (браузер)                    Сервер
      |                               |
      |─── ClientHello ──────────────→|  (поддерживаемые алгоритмы, версия TLS)
      |                               |
      |←── ServerHello ───────────────|  (выбранный алгоритм + сертификат)
      |                               |
      |  [Браузер проверяет сертификат]
      |  [Сертификат валиден? Подписан доверенным CA?]
      |                               |
      |─── Pre-Master Secret ────────→|  (зашифровано публичным ключом сервера)
      |                               |
      |  [Оба генерируют Session Key на основе Pre-Master Secret]
      |                               |
      |─── Finished (зашифровано) ───→|
      |←── Finished (зашифровано) ────|
      |                               |
      |═══════════ HTTPS ═════════════|  (все данные зашифрованы)

Весь этот процесс происходит автоматически за доли секунды.


4. SSL-сертификат

SSL/TLS сертификат — это цифровой документ, который:

  1. Подтверждает, что сервер — это именно тот, за кого себя выдаёт
  2. Содержит публичный ключ для шифрования
  3. Подписан доверенным Certificate Authority (CA) — например, Let's Encrypt, DigiCert, Comodo

Что содержит сертификат

Домен:         example.com
Владелец:      Example Corp
Выдан:         Let's Encrypt Authority
Действителен:  с 01.01.2026 по 01.04.2026 (обычно 90 дней)
Публичный ключ: RSA 2048-bit

Виды сертификатов

ТипЧто проверяетПример использования
DV (Domain Validation)Только доменБольшинство сайтов
OV (Organization Validation)Домен + организацияКорпоративные сайты
EV (Extended Validation)Расширенная проверка компанииБанки, финансовые сервисы
WildcardДомен + все поддомены (*.example.com)CDN, множество поддоменов
SANНесколько доменов в одном сертификатеexample.com + app.example.com

5. HTTP vs HTTPS — сравнение

КритерийHTTPHTTPS
Порт80443
ШифрованиеНетTLS/SSL
Целостность данныхНетДа (HMAC)
Аутентификация сервераНетДа (сертификат)
SEOХужеЛучше (Google предпочитает HTTPS)
ПроизводительностьНемного быстрееHTTP/2 компенсирует накладные расходы
Браузер показывает«Небезопасно» ⚠️Замок 🔒

6. Что шифрует HTTPS

ШИФРУЕТСЯ:
✅ Тело запроса (Body) — логин, пароль, данные карты
✅ Заголовки запроса (Headers) — Cookie, токены
✅ URL-параметры (Query String) — /search?q=секретный-запрос

НЕ ШИФРУЕТСЯ:
❌ IP-адрес сервера (провайдер знает, с каким сервером ты общаешься)
❌ Доменное имя (через SNI в TLS Handshake)
❌ Объём данных (можно анализировать размер пакетов)

7. Тестирование HTTPS

Что проверять при тестировании

7.1 Редирект HTTP → HTTPS

✓ http://example.com → 301 Redirect → https://example.com
✓ http://www.example.com → https://www.example.com
✓ После редиректа страница работает корректно

7.2 Сертификат

✓ Сертификат валиден (не истёк)
✓ Сертификат выдан для правильного домена
✓ Сертификат подписан доверенным CA
✓ Цепочка сертификатов корректна (intermediate CA)
✓ Браузер показывает замок 🔒 без предупреждений

7.3 Смешанный контент (Mixed Content)

Проблема: страница загружена по HTTPS, но ресурсы (изображения, JS) загружаются по HTTP

Тест: открыть Console в DevTools → искать:
"Mixed Content: The page at 'https://...' was loaded over HTTPS,
but requested an insecure resource 'http://...'"

Результат: браузер блокирует HTTP-ресурсы → сломанный сайт

7.4 Заголовки безопасности

HTTP/1.1 200 OK

# HSTS — браузер всегда использует HTTPS для этого домена
Strict-Transport-Security: max-age=31536000; includeSubDomains

# Защита от XSS
X-XSS-Protection: 1; mode=block

# Запрет встраивания в iframe
X-Frame-Options: DENY

# Политика источников контента
Content-Security-Policy: default-src 'self'

Как проверить сертификат в браузере

1. Нажать на замок 🔒 в адресной строке
2. «Соединение защищено» → «Подробнее»
3. Или: DevTools → Security → Certificate

Что смотрим:
✓ Certificate: Valid
✓ Issued to: example.com
✓ Valid from: дата
✓ Valid to: дата (не истёк!)
✓ Certificate chain: все элементы доверенны

Проверка через curl

bashbash
# Проверить сертификат
curl -I https://example.com

# Посмотреть детали сертификата
curl -v https://example.com 2>&1 | grep -A 10 "Server certificate"

# Проверить редирект HTTP → HTTPS
curl -I http://example.com
# Ожидаем: HTTP/1.1 301 Moved Permanently + Location: https://example.com

8. Распространённые проблемы HTTPS

Истёкший сертификат

Браузер показывает: «Ваше подключение не защищено»
ERR_CERT_DATE_INVALID

Что делает пользователь: уходит с сайта
Что это значит для бизнеса: потеря трафика, доверия, денег

Сертификат для другого домена

Сайт: shop.example.com
Сертификат: example.com (нет wildcard *.example.com)

Браузер: «Сертификат не соответствует доменному имени»
ERR_CERT_COMMON_NAME_INVALID

Самоподписанный сертификат

Staging-сервер часто использует self-signed сертификат
(сервер сам себя подписал — не через CA)

Браузер: «Сертификат не заслуживает доверия»

Для тестирования:
Playwright: use: { ignoreHTTPSErrors: true }  ← только для тестов!
Postman: Settings → SSL certificate verification → OFF (только для тестов!)

9. HTTPS в Playwright

typescripttypescript
import { test, expect } from "@playwright/test";

// Тест: проверка редиректа HTTP → HTTPS
test("HTTP редиректит на HTTPS", async ({ page }) => {
  const response = await page.goto("http://shop.example.com", {
    waitUntil: "networkidle",
  });

  expect(page.url(), "Должен быть редирект на HTTPS").toMatch(/^https:/);
  expect(response?.status(), "Должен быть 200 после редиректа").toBe(200);
});

// Тест: нет Mixed Content
test("страница не содержит Mixed Content", async ({ page }) => {
  const mixedContentErrors: string[] = [];

  page.on("console", (msg) => {
    if (msg.type() === "error" && msg.text().includes("Mixed Content")) {
      mixedContentErrors.push(msg.text());
    }
  });

  await page.goto("https://shop.example.com/");
  await page.waitForLoadState("networkidle");

  expect(
    mixedContentErrors,
    `Mixed Content ошибки: ${mixedContentErrors.join(", ")}`
  ).toHaveLength(0);
});

// playwright.config.ts: для staging с самоподписанным сертификатом
export default defineConfig({
  use: {
    ignoreHTTPSErrors: true,  // ТОЛЬКО для тестового окружения!
  },
});

10. HTTP/2 и HTTP/3

ВерсияОсобенности
HTTP/1.1Один запрос за раз на соединение
HTTP/2Мультиплексирование (много запросов в одном соединении), требует HTTPS
HTTP/3Основан на QUIC (UDP), ещё быстрее, требует HTTPS

HTTP/2 и HTTP/3 работают только поверх HTTPS — ещё одна причина использовать HTTPS везде.


Итог

HTTP
├── Порт: 80
├── Шифрование: нет
├── Браузер: ⚠️ «Небезопасно»
└── Использовать: никогда в production

HTTPS
├── Порт: 443
├── Шифрование: TLS (ранее SSL)
├── Браузер: 🔒 Замок
└── Использовать: всегда, везде

ЧТО ТЕСТИРОВАТЬ:
✓ HTTP → HTTPS редирект (301)
✓ Сертификат не истёк
✓ Сертификат для правильного домена
✓ Нет Mixed Content (HTTP-ресурсов на HTTPS-странице)
✓ Заголовки безопасности (HSTS, CSP, X-Frame-Options)