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 сертификат — это цифровой документ, который:
- Подтверждает, что сервер — это именно тот, за кого себя выдаёт
- Содержит публичный ключ для шифрования
- Подписан доверенным 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 — сравнение
| Критерий | HTTP | HTTPS |
|---|---|---|
| Порт | 80 | 443 |
| Шифрование | Нет | 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
# Проверить сертификат
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.com8. Распространённые проблемы 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
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)