Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: HTTP headers, CORS, Authorization, browser security, fetch API

Почему нельзя напрямую передать заголовки (например Authorization) при скачивании файла через обычную ссылку?

Этот вопрос проверяет понимание ограничений браузера при работе с HTTP-запросами и различий между пользовательскими и программными запросами.

Короткий ответ

Браузер не позволяет напрямую передавать кастомные заголовки (как Authorization) при скачивании файла по обычной ссылке или через window.location, потому что это действие инициируется пользователем, а не скриптом. Браузеры строго контролируют заголовки, которые могут быть установлены в таких запросах, чтобы предотвратить утечку чувствительных данных или подделку запросов. Для передачи заголовков необходимо использовать программные запросы, например, через Fetch API или XMLHttpRequest, где вы полностью контролируете HTTP-запрос.

Длинный ответ

Когда пользователь кликает на обычную ссылку или вы используете window.location.href для перехода, браузер создаёт простой GET-запрос, в который он сам добавляет стандартные заголовки (User-Agent, Accept и т.д.). Добавить произвольные заголовки, такие как Authorization: Bearer <token>, в этот запрос невозможно, потому что это нарушило бы модель безопасности браузера.

Почему браузер это запрещает?

  • Безопасность: Если бы любая страница могла добавлять заголовки к любым запросам (включая переходы на другие сайты), это позволило бы злоумышленникам подделывать запросы с учётными данными пользователя.
  • Контроль происхождения: Браузер следует политике одного источника (Same-Origin Policy) и CORS. Заголовки вроде Authorization считаются "заголовками, требующими предварительной проверки" (preflight), и их отправка в кросс-доменном контексте требует явного разрешения сервера.
  • Разделение ответственности: Обычные навигационные запросы управляются браузером от имени пользователя, а программные запросы (через API) управляются кодом страницы.

Как правильно скачать файл с заголовком Authorization?

Нужно использовать JavaScript для создания программного запроса, получить данные как Blob, а затем создать ссылку для скачивания.

async function downloadFileWithAuth(url, token) {
  const response = await fetch(url, {
    headers: {
      'Authorization': `Bearer ${token}`
    }
  });
  if (!response.ok) throw new Error('Download failed');
  const blob = await response.blob();
  const downloadUrl = window.URL.createObjectURL(blob);
  const link = document.createElement('a');
  link.href = downloadUrl;
  link.download = 'file.pdf'; // имя файла
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
  window.URL.revokeObjectURL(downloadUrl);
}

Этот метод безопасен, потому что заголовки контролируются в контексте текущей страницы и подчиняются правилам CORS.

Где это применяется?

Такой подход необходим в современных SPA-приложениях (React, Angular, Vue), где аутентификация происходит через JWT-токены, а API требует передачи токена в заголовке Authorization для доступа к защищённым ресурсам, включая файлы.

Вывод: Используйте Fetch API (или аналоги) для скачивания файлов, требующих авторизации, так как только программные запросы позволяют полностью контролировать HTTP-заголовки, соблюдая при этом политики безопасности браузера.

Уровень

  • Рейтинг:

    3

  • Сложность:

    4

Навыки

  • JavaScript

    JavaScript

  • Networks

Ключевые слова

#HTTP headers

#CORS

#Authorization

#browser security

#fetch API

Подпишись на React Developer в телеграм