Gymterview
junior

Как работает 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, удалены устаревшие шифры).