← Назад к вопросам

В чем разница между HTTP и HTTPS?

1.2 Junior🔥 201 комментариев
#REST API и HTTP#Безопасность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

HTTP vs HTTPS: безопасность в веб-коммуникациях

HTTPS (HTTP Secure) — это расширение HTTP с добавлением шифрования TLS/SSL. Это критически важно для защиты данных при передаче по интернету.

Основная разница

АспектHTTPHTTPS
Порт80443
Шифрование❌ Нет✅ TLS/SSL
СертификатНе требуетсяТребуется
СкоростьНемного быстрееНемного медленнее (шифрование)
БезопасностьОчень слабаяСильная
БраузерыПредупреждениеЗелёный замок

HTTP — Незащищённый протокол

При HTTP вся информация передаётся в открытом виде (plain text). Каждый, кто имеет доступ к сети, может перехватить и прочитать данные.

# Пример HTTP запроса (всё в открытом виде)
GET /api/login HTTP/1.1
Host: example.com
Content-Type: application/json

{"username": "john", "password": "secret123"}

# Любой перехватчик видит пароль!

HTTPS — Защищённый протокол

HTTPS использует TLS (Transport Layer Security), который шифрует всю информацию. Даже если её перехватить, она останется неразборчивой без ключа.

# Пример HTTPS запроса (всё зашифровано)
GET /api/login HTTP/1.1
Host: example.com
Content-Type: application/json

[ЗАШИФРОВАННЫЕ ДАННЫЕ]
Перед отправкой данные преобразуются в нечитаемый формат.

Как работает TLS/SSL: handshake

Когда браузер подключается к HTTPS серверу, происходит TLS handshake — процесс установления защищённого соединения.

Шаг 1: Client Hello

Браузер -> Сервер:
"Привет! Я поддерживаю TLS 1.3 и вот список шифров, которые я знаю"

Шаг 2: Server Hello

Сервер -> Браузер:
"Привет! Я выбираю TLS 1.3 и этот конкретный шифр"

Шаг 3: Certificate Exchange

Сервер -> Браузер:
"Вот мой SSL/TLS сертификат, который подписан доверенным CA (Certificate Authority)"

Браузер проверяет сертификат:

  • Подпись корректна
  • Домен совпадает
  • Срок действия не истек

Шаг 4: Key Exchange

Браузер и сервер обмениваются информацией для генерирования
сеансового ключа (session key) — уникального ключа для этого соединения.

Шаг 5: Finished

Оба стороны отправляют зашифрованное сообщение "Finished",
подтверждая, что соединение готово к работе.

Весь handshake занимает миллисекунды, но именно этого стоит задержка HTTPS.

Практический пример: Python requests

import requests

# HTTP — данные видны в открытом виде
response = requests.get('http://httpbin.org/get')
print(response.text)  # Может быть перехвачено

# HTTPS — данные шифруются
response = requests.get('https://httpbin.org/get')
print(response.text)  # Безопасно

Практически, Python автоматически использует HTTPS, если указан https:// в URL.

Шифрование данных

Асимметричное шифрование (RSA) — для handshake:

Сервер имеет пару ключей:
- Public key (открытый): видят все
- Private key (закрытый): только сервер

Браузер шифрует сеансовый ключ с помощью Public key.
Только сервер может расшифровать с Private key.

Симметричное шифрование (AES) — для данных:

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

Практические примеры в разработке

FastAPI с HTTPS:

from fastapi import FastAPI
from fastapi.security import HTTPBearer, HTTPAuthCredentials
import uvicorn

app = FastAPI()
security = HTTPBearer()

@app.get("/api/secure-data")
async def get_secure_data(credentials: HTTPAuthCredentials = None):
    # HTTPS гарантирует, что credentials зашифрованы при передаче
    return {"data": "sensitive information"}

if __name__ == "__main__":
    # Запуск с SSL сертификатом
    uvicorn.run(
        app,
        host="0.0.0.0",
        port=443,
        ssl_keyfile="/path/to/key.pem",
        ssl_certfile="/path/to/cert.pem"
    )

Перенаправление с HTTP на HTTPS:

from fastapi import FastAPI
from fastapi.middleware import Middleware
from starlette.middleware.https import HTTPSRedirectMiddleware

app = FastAPI()
app.add_middleware(HTTPSRedirectMiddleware)

# Все запросы на HTTP будут автоматически перенаправлены на HTTPS

Проверка сертификата при запросе:

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.ssl_ import create_urllib3_context

# Кастомная проверка сертификата
session = requests.Session()

# По умолчанию проверяется, но можно настроить
response = session.get(
    'https://api.github.com',
    verify=True  # Проверить сертификат (по умолчанию)
)

# Опасно! Отключение проверки сертификата
response = session.get(
    'https://api.github.com',
    verify=False  # НЕ ДЕЛАЙ ТАК В ПРОДАКШЕНЕ!
)

Сертификаты: типы и выпуск

Самоподписанные сертификаты (Self-signed):

Генерируются локально, не подписаны доверенным CA.

# Генерация самоподписанного сертификата
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes

Используются только для разработки. Браузер будет ругаться.

Сертификаты от Certificate Authority (CA):

Подписаны доверенным центром сертификации (Let's Encrypt, Comodo, etc.).

# Let's Encrypt (бесплатно):
# Используется Certbot для автоматического получения и обновления
# certbot certonly --standalone -d example.com

Почему HTTPS критична сегодня

1. Защита от перехвата (Man-in-the-Middle attack)

Без HTTPS хакер в той же Wi-Fi сети может перехватить пароли и куки.

2. Защита паролей и приватных данных

Всё шифруется, даже если сеть скомпрометирована.

3. Проверка подлинности сервера

Цифровой сертификат подтверждает, что ты действительно подключаешься к api.github.com, а не к поддельному серверу.

4. Требование браузеров и поисковых систем

  • Chrome показывает "Not Secure" для HTTP
  • Google понижает рейтинг HTTP сайтов в поиске
  • Многие браузеры блокируют HTTP для критичных операций

Производительность

HTTPS медленнее ли HTTP?

На 2-5% медленнее из-за:

  • TLS handshake (~50-100ms в первый раз)
  • Расходы на шифрование/дешифрирование

Но современные оптимизации (TLS 1.3, session resumption) свели разницу к минимуму.

Практические улучшения:

# HTTP/2 поверх HTTPS (обычно быстрее HTTP/1.1)
https://www.example.com  # Если сервер поддерживает HTTP/2

# Session resumption (переиспользование сеанса)
# Сокращает handshake со 100ms до 1-2ms

Чеклист для Python разработчика

  • ✅ Всегда используй HTTPS в продакшене
  • ✅ Используй актуальный протокол TLS 1.2 или выше
  • ✅ Проверяй сертификаты при запросах (verify=True)
  • ✅ Используй HSTS (HTTP Strict Transport Security) для принуждения HTTPS
  • ✅ Обновляй сертификаты до истечения срока
  • ✅ Защищай приватные ключи сертификатов
  • ❌ Никогда не отключай проверку сертификатов в продакшене
  • ❌ Не используй самоподписанные сертификаты в продакшене

Вкратце: HTTPS — это стандарт безопасности для всех веб-приложений. Без HTTPS твои данные могут быть перехвачены, и сегодня это просто неприемлемо.