Можно ли передавать данные для авторизации в заголовках HTTP-запроса?

«Можно ли передавать данные для авторизации в заголовках HTTP-запроса?» — вопрос из категории Безопасность, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, передача авторизационных данных в HTTP-заголовках — это стандартная и широко используемая практика, особенно в REST API. Основные методы:

1. Базовая аутентификация (Basic Auth)

Логин и пароль, разделенные двоеточием, в кодировке Base64. Используйте ТОЛЬКО поверх HTTPS.

// Формирование заголовка на стороне клиента (например, в cURL)
$headers = [
    'Authorization: Basic ' . base64_encode('username:password')
];

// Проверка на стороне сервера (PHP)
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="My API"');
    header('HTTP/1.0 401 Unauthorized');
    exit;
}
$user = $_SERVER['PHP_AUTH_USER'];
$pass = $_SERVER['PHP_AUTH_PW'];

2. Аутентификация по токену (Bearer Token)

Наиболее распространенный способ для JWT (JSON Web Tokens) и OAuth 2.0.

// Клиент отправляет токен
$headers = [
    'Authorization: Bearer eyJhbGciOiJIUzI1NiIs...'
];

// Сервер извлекает и проверяет токен
$authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
if (preg_match('/Bearers+(S+)/', $authHeader, $matches)) {
    $jwtToken = $matches[1];
    // ... валидация и декодирование JWT
}

3. Кастомные заголовки с API-ключами

Часто используется для простого доступа к API.

$headers = [
    'X-API-Key: your-secret-api-key-12345',
    'X-Client-ID: client_app_001'
];

4. Аутентификация на основе хешей (HMAC)

Более безопасный способ, где в заголовке передается подпись запроса.

$apiKey = 'key';
$secret = 'secret';
$timestamp = time();
$payload = http_build_query($data);
$signature = hash_hmac('sha256', $payload . $timestamp, $secret);

$headers = [
    'X-API-Key: ' . $apiKey,
    'X-Signature: ' . $signature,
    'X-Timestamp: ' . $timestamp
];

Критически важные меры безопасности:

  • Всегда используйте HTTPS (TLS) для шифрования трафика.
  • Никогда не передавайте токены, пароли или ключи в URL (например, как GET-параметр), так как они могут остаться в логах серверов и браузеров.
  • Для веб-сессий предпочтительнее использовать защищенные куки с флагами HttpOnly и Secure.
  • Срок действия токенов должен быть ограничен, реализуйте механизм их обновления (refresh tokens).