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

Что такое заголовок в протоколах http и https?

2.0 Middle🔥 111 комментариев
#Сети и протоколы

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

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

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

HTTP/HTTPS Заголовки: метаинформация запросов и ответов

Заголовки (Headers) в HTTP/HTTPS — это пары "ключ: значение", которые передают метаинформацию о запросе или ответе. Они находятся между строкой запроса и телом сообщения, разделены символом CRLF (\r\n).

Анатомия HTTP запроса

GET /api/users/123 HTTP/1.1\r\n              ← Строка запроса
Host: api.example.com\r\n                    ← 
Content-Type: application/json\r\n             ← Заголовки
Authorization: Bearer token123\r\n             ←
User-Agent: MyApp/1.0\r\n                    ←
\r\n                                            ← Пустая строка
{"name": "John"}                              ← Тело (body)

Анатомия HTTP ответа

HTTP/1.1 200 OK\r\n                          ← Строка ответа
Content-Type: application/json\r\n             ← 
Content-Length: 27\r\n                        ← Заголовки
Cache-Control: max-age=3600\r\n                ←
Set-Cookie: session=abc123\r\n                ←
\r\n                                            ← Пустая строка
{"id": 123, "name": "John"}                    ← Тело ответа

Категории заголовков

1. Заголовки запроса (Request Headers)

Отправляют информацию о клиенте и требованиях:

// Примеры основных заголовков запроса
Host: api.example.com                          // Хост и порт сервера
User-Agent: Mozilla/5.0 (Windows NT 10.0)     // Информация о клиенте
Accept: application/json, text/plain           // Какой формат ответа принимаем
Accept-Language: en-US, ru-RU                  // Предпочитаемые языки
Accept-Encoding: gzip, deflate, br             // Поддерживаемые сжатия
Authorization: Bearer eyJhbGc...              // Аутентификация
Cookie: session_id=abc123; user_id=456        // Куки для сессии
Referer: https://example.com/page              // Откуда перешли
X-Requested-With: XMLHttpRequest               // Признак AJAX запроса
Content-Type: application/json                 // Формат тела запроса
Content-Length: 27                             // Размер тела
Cache-Control: no-cache                        // Указание на кэширование

2. Заголовки ответа (Response Headers)

Отправляют информацию о сервере и содержимом:

Content-Type: application/json; charset=utf-8 // Тип содержимого
Content-Length: 1024                           // Размер тела
Content-Encoding: gzip                         // Применённое сжатие
Cache-Control: max-age=3600, public            // Правила кэширования
ETag: "123abc456"                             // Уникальный идентификатор версии
Last-Modified: Wed, 21 Oct 2024 07:28:00 GMT  // Дата последнего обновления
Set-Cookie: session=xyz789; Path=/; Max-Age=7200  // Установка куки
Cors: Access-Control-Allow-Origin: *           // CORS разрешения
Strict-Transport-Security: max-age=31536000   // HTTPS enforcement
X-Content-Type-Options: nosniff                // Защита от MIME sniffing
X-Frame-Options: DENY                          // Защита от clickjacking
Location: /api/users/456                       // Новое местоположение ресурса
Set-Cookie: auth=token; HttpOnly; Secure      // Безопасная кука

Практический пример: обработка заголовков в C++

#include <iostream>
#include <map>
#include <string>
#include <curl/curl.h>

// Парсинг заголовков запроса
std::map<std::string, std::string> parseHeaders(const std::string& rawHeaders) {
    std::map<std::string, std::string> headers;
    std::istringstream stream(rawHeaders);
    std::string line;
    
    while (std::getline(stream, line)) {
        if (line.empty()) break;  // Пустая строка указывает конец заголовков
        
        size_t colonPos = line.find(':');
        if (colonPos != std::string::npos) {
            std::string key = line.substr(0, colonPos);
            std::string value = line.substr(colonPos + 2);  // Пропускаем ": "
            headers[key] = value;
        }
    }
    return headers;
}

// Создание запроса с заголовками
class HttpClient {
public:
    void makeRequest(const std::string& url) {
        CURL* curl = curl_easy_init();
        
        // Создаём структуру заголовков
        struct curl_slist* headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: application/json");
        headers = curl_slist_append(headers, "Authorization: Bearer mytoken123");
        headers = curl_slist_append(headers, "X-Custom-Header: MyValue");
        headers = curl_slist_append(headers, "Accept-Encoding: gzip");
        
        // Устанавливаем заголовки
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        
        // Выполняем запрос
        CURLcode res = curl_easy_perform(curl);
        
        // Очищаем
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    }
};

Важные заголовки для backend разработчика

1. Content-Type

// Указывает формат тела запроса/ответа
Content-Type: application/json              // JSON данные
Content-Type: application/x-www-form-urlencoded  // Форма
Content-Type: multipart/form-data           // Загрузка файлов
Content-Type: text/html; charset=utf-8      // HTML
Content-Type: image/jpeg                    // Изображение
Content-Type: application/octet-stream      // Бинарные данные

2. Authorization

// Аутентификация
Authorization: Basic dXNlcjpwYXNz             // Base64(user:pass)
Authorization: Bearer eyJhbGciOiJIUzI1NiJ... // JWT токен
Authorization: ApiKey sk_live_123456         // API ключ

3. Cache-Control

// Управление кэшированием
Cache-Control: public, max-age=3600          // Кэшируй 1 час, публичный
Cache-Control: private, max-age=60           // Кэшируй 1 мин, только приватный
Cache-Control: no-cache, no-store             // Не кэшируй
Cache-Control: max-age=0                     // Всегда проверяй актуальность

4. CORS заголовки

// Контроль доступа между доменами
Access-Control-Allow-Origin: *                // Разреши всем
Access-Control-Allow-Origin: https://example.com  // Разреши конкретному домену
Access-Control-Allow-Methods: GET, POST, PUT  // Разреши методы
Access-Control-Allow-Headers: Content-Type, Authorization  // Разреши заголовки
Access-Control-Allow-Credentials: true       // Разреши куки

5. Безопасность

Strict-Transport-Security: max-age=31536000 // Используй HTTPS
X-Content-Type-Options: nosniff              // Не угадывай тип
X-Frame-Options: DENY                        // Защита от clickjacking
X-XSS-Protection: 1; mode=block              // Защита от XSS
Content-Security-Policy: default-src 'self'  // Контроль источников

Пример полного HTTP обмена

=== ЗАПРОС ===
POST /api/users HTTP/1.1
Host: api.example.com:8080
Content-Type: application/json
Content-Length: 27
Authorization: Bearer token123
User-Agent: MyApp/1.0

{"name": "John Doe"}

=== ОТВЕТ ===
HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: 42
Location: /api/users/123
Set-Cookie: session=xyz; Path=/; Max-Age=3600
ETag: "v1"
Cache-Control: no-cache

{"id": 123, "name": "John Doe"}

Обработка заголовков в современном backend

FastAPI (Python)

from fastapi import FastAPI, Header
from typing import Optional

app = FastAPI()

@app.post("/api/users")
async def create_user(
    x_token: str = Header(...),                    # Требуемый заголовок
    user_agent: Optional[str] = Header(None),      # Опциональный
    authorization: str = Header(None)
):
    return {"token_received": x_token}

Express.js (Node.js)

app.post('/api/users', (req, res) => {
    const token = req.get('authorization');        // Получить заголовок
    const contentType = req.get('content-type');
    
    res.set('X-Custom-Header', 'value');           // Установить заголовок
    res.json({success: true});
});

Итог

Заголовки HTTP/HTTPS — это критически важный механизм передачи метаинформации. Для backend разработчика необходимо понимать:

  • Основные типы заголовков и их назначение
  • Безопасность (Authorization, CORS, CSP)
  • Производительность (Cache-Control, ETag, Encoding)
  • Правильная обработка в коде
  • Взаимодействие между клиентом и сервером

Неправильное использование заголовков может привести к проблемам с безопасностью, производительностью и совместимостью.