← Назад к вопросам
Какие части запроса шифруются при передаче по 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
| Элемент | HTTP | HTTPS |
|---|---|---|
| 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, что можно сделать перехватчику