Как работает HTTP/HTTPS? Что такое TLS?
HTTP (HyperText Transfer Protocol) — протокол прикладного уровня (L7) для передачи данных в Интернете, основанный на модели «запрос-ответ»: клиент отправляет запрос, сервер возвращает ответ.
HTTPS (HTTP Secure) — HTTP, обёрнутый в шифрование TLS, обеспечивающее конфиденциальность, целостность и аутентификацию.
TLS (Transport Layer Security) — криптографический протокол, обеспечивающий защищённую передачу данных поверх TCP.
Аналогия из жизни: HTTP — это открытка, которую может прочитать любой почтальон по дороге. HTTPS — это письмо в запечатанном конверте с печатью: никто не может его прочитать, изменить или подделать отправителя. TLS — это сам процесс запечатывания и проверки печати.
Структура HTTP-запроса
Пример
GET /api/users HTTP/1.1 ← Метод, путь, версия протокола
Host: example.com ← Заголовки (headers)
Content-Type: application/json
Authorization: Bearer token123
← Пустая строка (разделитель)
{"name": "John"} ← Тело (body, для POST/PUT/PATCH)
Структура HTTP-ответа
Пример
HTTP/1.1 200 OK ← Версия, код статуса, описание
Content-Type: application/json ← Заголовки
Content-Length: 27
← Пустая строка
{"id": 1, "name": "John"} ← Тело ответа
Почему HTTP небезопасен
HTTP передаёт данные открытым текстом (plaintext). Это означает:
- Любой узел на пути (Wi-Fi точка, провайдер, маршрутизатор) может прочитать данные — пароли, cookies, персональные данные
- Данные можно изменить на лету (MITM — Man-in-the-Middle)
- Невозможно проверить, что сервер — тот, за кого себя выдаёт
HTTPS = HTTP + TLS
HTTPS обеспечивает три гарантии:
| Гарантия | Что даёт |
|---|---|
| Конфиденциальность | Данные зашифрованы, третьи лица не могут их прочитать |
| Целостность | Данные не могут быть незаметно изменены при передаче |
| Аутентификация | Сертификат подтверждает, что сервер — тот, за кого себя выдаёт |
По умолчанию HTTPS использует порт 443.
TLS Handshake (TLS 1.2, упрощённо)
Пример
Клиент Сервер
|--- ClientHello ---------------------->| Версия TLS, поддерживаемые шифры, client random
|<-- ServerHello -----------------------| Выбранный шифр, server random
|<-- Certificate -----------------------| Сертификат сервера (X.509)
|<-- ServerHelloDone -------------------|
|--- ClientKeyExchange ---------------->| Pre-master secret (зашифрован публичным ключом сервера)
|--- ChangeCipherSpec ----------------->| Переключаюсь на шифрование
|--- Finished ------------------------->| Зашифрованное подтверждение
|<-- ChangeCipherSpec ------------------| Сервер тоже переключается
|<-- Finished --------------------------| Зашифрованное подтверждение
| |
|====== Зашифрованный HTTP-трафик ======|
В TLS 1.3 handshake упрощён до 1 RTT (round-trip time), что быстрее:
- Клиент сразу отправляет свои параметры ключа в ClientHello
- Сервер может ответить зашифрованными данными уже во втором сообщении
- Поддерживается 0-RTT для повторных подключений (ценой ослабления защиты от replay-атак)
Сертификат X.509
- Содержит: доменное имя, публичный ключ сервера, срок действия, имя издателя (CA)
- Подписан удостоверяющим центром (CA — Certificate Authority): Let’s Encrypt, DigiCert, Comodo
- Клиент (браузер) проверяет подпись сертификата по цепочке доверия до корневого CA, встроенного в ОС/браузер
- Если цепочка нарушена или сертификат просрочен — браузер показывает предупреждение
Для Java-разработчика
- Spring Boot HTTPS: настройка через
server.ssl.*вapplication.properties - Java хранит доверенные CA-сертификаты в truststore (
$JAVA_HOME/lib/security/cacerts) - Для добавления самоподписанного сертификата:
keytool -importcert -file cert.pem -keystore cacerts RestTemplate,WebClient,HttpClient— поддерживают HTTPS из коробки- Типичная production-конфигурация: TLS-терминация на Nginx/ALB, а не в самом Spring Boot
Вывод
HTTP — основа веб-коммуникации, но без TLS он небезопасен. HTTPS (HTTP + TLS) стал стандартом де-факто: браузеры помечают HTTP-сайты как небезопасные, поисковики снижают их рейтинг. TLS обеспечивает шифрование, целостность и аутентификацию через механизм сертификатов.
На собеседовании: часто просят описать, что происходит при вводе
https://example.comв браузере. Важно упомянуть DNS-разрешение → TCP handshake → TLS handshake → HTTP-запрос. Также спрашивают разницу между TLS 1.2 и 1.3 (1.3 быстрее — 1 RTT vs 2 RTT, удалены устаревшие шифры).