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

Какие части запроса шифруются при передаче по HTTPS?

1.7 Middle🔥 201 комментариев
#Браузер и сетевые технологии

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

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

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

HTTPS и Шифрование Запроса: Какие Части Защищены

Это критически важный вопрос о безопасности веб-приложений. Ответ: в HTTPS шифруется всё, кроме доменного имени сервера.

Структура HTTPS запроса

Запрос состоит из нескольких частей:

https://api.example.com:443/api/users?search=john
│       │                 │   │         │
│       │                 │   │         └─ Query параметры (ШИФРУЮТСЯ)
│       │                 │   └─ Path (ШИФРУЕТСЯ)
│       │                 └─ Port (ШИФРУЕТСЯ)
│       └─ Домен (НЕ ШИФРУЕТСЯ - видна в SNI)
└─ Протокол

Что шифруется в HTTPS

1. Тело запроса (Body) - ШИФРУЕТСЯ

// Пример POST запроса
fetch('https://api.example.com/login', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    email: 'user@example.com',
    password: 'secret123', // ШИФРУЕТСЯ полностью
  }),
});

// Перехватчик не может прочитать:
// ✓ email: user@example.com
// ✓ password: secret123

Что именно шифруется:

  • JSON данные
  • XML данные
  • Форм-данные (application/x-www-form-urlencoded)
  • Бинарные данные (файлы)
  • Всё содержимое body

2. Query параметры - ШИФРУЮТСЯ

// HTTPS
fetch('https://api.example.com/search?q=password&limit=10');
// Перехватчик видит только:
// URL: https://api.example.com/search?
// Query параметры (q=password&limit=10) ШИФРУЮТСЯ

// HTTP (не защищено!)
fetch('http://api.example.com/search?q=password&limit=10');
// Перехватчик видит ВСЁ:
// http://api.example.com/search?q=password&limit=10

Поэтому НИКОГДА не передавай токены в query параметрах:

// ❌ ПЛОХО - видна в URL
fetch('https://api.example.com/data?token=abc123def456');

// ✅ ХОРОШО - в заголовке
fetch('https://api.example.com/data', {
  headers: {
    'Authorization': 'Bearer abc123def456',
  },
});

3. HTTP Заголовки - ШИФРУЮТСЯ

fetch('https://api.example.com/users', {
  headers: {
    'Authorization': 'Bearer token123', // ШИФРУЕТСЯ
    'X-API-Key': 'secret-key', // ШИФРУЕТСЯ
    'Content-Type': 'application/json', // ШИФРУЕТСЯ
    'User-Agent': 'Mozilla/5.0', // ШИФРУЕТСЯ
    'Accept': 'application/json', // ШИФРУЕТСЯ
    'X-Custom-Header': 'sensitive-data', // ШИФРУЕТСЯ
  },
});

// Перехватчик не может прочитать заголовки

4. HTTP метод - ШИФРУЕТСЯ

fetch('https://api.example.com/users', {
  method: 'POST', // ШИФРУЕТСЯ
});
fetch('https://api.example.com/users/1', {
  method: 'DELETE', // ШИФРУЕТСЯ
});
fetch('https://api.example.com/users/1', {
  method: 'PUT', // ШИФРУЕТСЯ
});

Что НЕ шифруется в HTTPS

1. Доменное имя (DNS) - НЕ ШИФРУЕТСЯ

// Даже при HTTPS:
fetch('https://api.example.com/data');

// Перехватчик видит:
// - Что ты подключаешься к api.example.com
// - В какое время
// - Сколько данных отправляешь/получаешь
// - НО НЕ видит PATH и QUERY

Решение: использовать DNS over HTTPS (DoH)

// Браузер поддерживает DoH (в современных версиях)
// Это шифрует даже DNS запросы
// Настраивается на уровне браузера/ОС

2. IP адрес сервера - НЕ ШИФРУЕТСЯ

// Перехватчик всегда видит:
// - IP адрес сервера (например 93.184.216.34)
// - Порт 443
// - Но НЕ видит, какой домен это на самом деле
// (если не использовать SNI)

3. Размер данных (примерно) - НЕ ШИФРУЕТСЯ

fetch('https://api.example.com/large-file', {
  method: 'POST',
  body: largeData, // 5 MB
});

// Перехватчик видит:
// - Примерно 5 MB данных передаётся
// - НО НЕ видит сами данные
// - Используется для атак анализом трафика

4. SNI (Server Name Indication) - ПОЛУПРИВАТНА

// При подключении к https://api.example.com
// Браузер отправляет SNI (Server Name Indication)
// который содержит доменное имя

// Это нужно потому, что один IP может хостить много доменов
// Перехватчик видит доменное имя в SNI

// Решение: Encrypted SNI (ESNI) — пока экспериментально

Как работает HTTPS (упрощённо)

1. TLS Handshake (установление безопасного соединения)
   Client -------Hello-----> Server
   Client <--- Certificate --- Server (сертификат видна доменное имя)
   Client & Server устанавливают общий encryption key

2. Encrypted Communication (обмен данными)
   Client -------[ENCRYPTED DATA]------> Server
   Server -------[ENCRYPTED DATA]------> Client
   
   Все данные шифруются этим ключом

Практический пример: Что видит перехватчик

// Запрос
fetch('https://api.example.com:443/api/users?filter=admin', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer token123',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'John Doe',
    role: 'admin',
  }),
});

// Перехватчик видит:
// ✓ Соединение к IP 93.184.216.34 порт 443
// ✓ SNI: api.example.com (может видеть доменное имя)
// ✓ Приблизительный размер трафика
// ✓ Примерное время запроса

// Перехватчик НЕ видит:
// ✗ /api/users (path)
// ✗ ?filter=admin (query параметры)
// ✗ Authorization: Bearer token123 (заголовки)
// ✗ Content-Type: application/json (заголовки)
// ✗ { name: 'John Doe', role: 'admin' } (body)
// ✗ HTTP метод POST

Сравнение HTTP vs HTTPS

ЭлементHTTPHTTPS
IP адресВиднаВидна
DNS запросВиднаВидна (кроме DoH)
Доменное имяВидноВ SNI видно
Path (/api/users)ВидноШифруется
Query параметрыВидныШифруются
ЗаголовкиВидныШифруются
Body (данные)ВидноШифруется
HTTP методВиденШифруется

Безопасность в фронтенд приложении

// ✅ ПРАВИЛЬНО - всё чувствительное шифруется в HTTPS
const loginUser = async (email: string, password: string) => {
  const response = await fetch('https://api.example.com/auth/login', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ email, password }), // ШИФРУЕТСЯ
  });
  
  const { token } = await response.json();
  
  // Сохраняем токен безопасно
  sessionStorage.setItem('token', token);
  // HttpOnly cookie было бы лучше, но sessionStorage приемлемо
};

// ✅ ПРАВИЛЬНО - токен в Authorization заголовке
const fetchUserData = async () => {
  const token = sessionStorage.getItem('token');
  const response = await fetch('https://api.example.com/user', {
    headers: {
      'Authorization': `Bearer ${token}`, // ШИФРУЕТСЯ в HTTPS
    },
  });
  
  return response.json();
};

// ❌ НЕПРАВИЛЬНО - токен в URL (если переделать на HTTP)
const badFetch = async () => {
  const token = sessionStorage.getItem('token');
  await fetch(`https://api.example.com/user?token=${token}`);
  // Хотя HTTPS, это всё ещё хуже практика
  // Токены должны в Authorization заголовке
};

На собеседовании

Полный ответ должен показать:

  • Полное понимание — что шифруется, что нет
  • Практические примеры — какие данные где передавать
  • Security Best Practices — как правильно работать с HTTPS
  • Ограничения HTTPS — что остаётся видно (IP, SNI)
  • Frontend безопасность — хранение токенов, работа с данными
  • Атаки — анализ трафика, DDoS, что можно сделать перехватчику