Gernar
HTTP, API и сеть

Что такое Preflight запрос

Разбор вопроса «Что такое Preflight запрос» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.

Вопрос

Что такое Preflight запрос

Профессия

Frontend Developer

Что хочет услышать интервьюер

Интервьюер хочет убедиться, что кандидат понимает механизм CORS и роль Preflight запросов в обеспечении безопасности веб-приложений. Также важно, чтобы кандидат мог объяснить, в каких ситуациях такие запросы возникают и как они работают.

Ключевые тезисы

  • Preflight запрос — это автоматический запрос, отправляемый браузером перед основным запросом, если он соответствует определенным критериям сложности.
  • Этот запрос использует метод OPTIONS и проверяет, поддерживает ли сервер запрашиваемый метод и заголовки.
  • Preflight запросы возникают при кросс-доменных запросах (CORS), если запрос использует нестандартные методы (например, PUT, DELETE) или заголовки.
  • Цель Preflight запроса — обеспечить безопасность, предотвращая отправку потенциально опасных запросов на сервер.
  • Пример: если клиент отправляет запрос с пользовательским заголовком, браузер сначала отправит Preflight запрос для проверки разрешений.

Подробный ответ

Preflight запрос — это механизм, используемый браузерами для обеспечения безопасности при выполнении кросс-доменных запросов (CORS). Когда клиентское приложение отправляет запрос на сервер, находящийся в другом домене, браузер может сначала отправить Preflight запрос, чтобы проверить, поддерживает ли сервер запрашиваемый метод и заголовки. Этот запрос использует метод HTTP OPTIONS и отправляется автоматически, если запрос соответствует определенным критериям сложности. Например, если запрос использует нестандартные методы (PUT, DELETE) или содержит пользовательские заголовки, браузер отправит Preflight запрос. Основная цель этого механизма — предотвратить отправку потенциально опасных запросов на сервер, что повышает безопасность веб-приложений. Preflight запросы возникают только при кросс-доменных запросах и не используются при запросах в пределах одного домена. Это важный аспект безопасности, который необходимо учитывать при разработке веб-приложений, особенно при работе с API.

Практические примеры

Пример 1

Предположим, клиентское приложение отправляет запрос на сервер с использованием метода PUT и пользовательского заголовка 'X-Custom-Header'. Браузер сначала отправит Preflight запрос методом OPTIONS с заголовками 'Access-Control-Request-Method: PUT' и 'Access-Control-Request-Headers: X-Custom-Header'. Сервер должен ответить соответствующими заголовками, указывающими, поддерживает ли он такие запросы.

Пример 2

Если сервер поддерживает запросы с методом PUT и заголовком 'X-Custom-Header', он вернет ответ с заголовками 'Access-Control-Allow-Methods: PUT' и 'Access-Control-Allow-Headers: X-Custom-Header'. После этого браузер отправит основной запрос.

Частые ошибки

  • Типичная ошибка — игнорирование необходимости корректной обработки Preflight запросов на сервере. Например, если сервер не возвращает ожидаемые заголовки 'Access-Control-Allow-Methods' и 'Access-Control-Allow-Headers', браузер блокирует основной запрос, что приводит к ошибкам в приложении.
  • Еще одна ошибка — попытка избежать Preflight запросов без понимания последствий. Например, использование только простых методов (GET, POST) и стандартных заголовков может снизить функциональность приложения.

Связанные темы

  • CORS (Cross-Origin Resource Sharing)
  • HTTP методы (GET, POST, PUT, DELETE)
  • Заголовки HTTP (Access-Control-Allow-Origin, Access-Control-Allow-Methods)
  • Безопасность веб-приложений

Follow-up вопросы

Как браузер определяет, нужно ли отправлять Preflight запрос?

Уровень: basic

Браузер отправляет Preflight запрос, если запрос является кросс-доменным и использует нестандартные методы (например, PUT, DELETE) или пользовательские заголовки. Также это происходит, если запрос отправляет данные в формате, отличном от текстового или JSON.

Какие заголовки используются в Preflight запросе и ответе?

Уровень: intermediate

В Preflight запросе используются заголовки, такие как Access-Control-Request-Method и Access-Control-Request-Headers, чтобы указать метод и заголовки основного запроса. В ответе сервер отправляет Access-Control-Allow-Methods и Access-Control-Allow-Headers, чтобы подтвердить разрешения.

Можно ли избежать Preflight запросов? Если да, то как?

Уровень: intermediate

Да, можно избежать Preflight запросов, если использовать простые запросы, такие как GET или POST с определенными ограничениями (например, без пользовательских заголовков и с использованием стандартных типов контента, таких как application/x-www-form-urlencoded или multipart/form-data).

Как влияет Preflight запрос на производительность приложения?

Уровень: advanced

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

Как сервер должен обрабатывать Preflight запросы?

Уровень: advanced

Сервер должен корректно обрабатывать Preflight запросы, проверяя заголовки Access-Control-Request-Method и Access-Control-Request-Headers, и возвращать соответствующие разрешения в заголовках Access-Control-Allow-Methods и Access-Control-Allow-Headers. Также важно указать Access-Control-Max-Age для кэширования ответа.

Содержание