HTTPQUERY
Русский

425 Too Early

Применение

Ошибка 425 Too Early связана со временем, необходимым для установления защищённого HTTPS-соединения. При значительных задержках время, которое требуется TLS для создания защищённого соединения, становится заметным. Одна из оптимизаций — отправка клиентом данных на раннем этапе, до того как защищённое соединение полностью установлено.

Если в цепочке участвует промежуточный узел, он обязан добавить запросу заголовок Early-Data: 1. Промежуточный узел не должен удалять этот заголовок. Так сервер узнаёт, что запрос был отправлен в ранних данных и что клиент понимает ответ 425 Too Early.

Запрос

GET /tech-news HTTP/1.1
Host: example.com
Early-Data: 1

Исходному инициатору запроса отправлять этот заголовок не нужно. Отправляя данные заранее, клиент тем самым подтверждает, что осознаёт последствия и корректно обработает ответ 425 Too Early.

В некоторых ситуациях отправка ранних данных нежелательна, и в ответ сервер возвращает эту ошибку. Риск состоит в том, что запрос клиента может быть воспроизведён повторно, что приведёт к побочным эффектам, подрывающим безопасность.

Когда клиент получает этот код состояния, запрос повторяется автоматически. После того как рукопожатие завершено и защищённое соединение установлено.

Влияние на SEO

Поисковые системы вроде Google не индексируют URL с кодом ответа 425. Ранее проиндексированные URL, возвращающие этот код состояния, удаляются из результатов поиска.

Пример

Клиент запрашивает ресурс, и сервер отвечает кодом 425 Too Early, предписывая клиенту дождаться полного установления соединения, прежде чем повторять запрос.

Запрос

GET /tech-news HTTP/1.1
Host: example.com
Content-Type: application/xml
Content-Length: 225

<Message includes early data>

Ответ

HTTP/1.1 425 Too Early

Как исправить

Повторите запрос после полного завершения рукопожатия TLS. Клиент дожидается установления защищённого соединения и только затем отправляет запрос заново. Большинство браузеров и HTTP-библиотек выполняют такой повтор автоматически.

Избегайте отправки неидемпотентных запросов (таких как POST, PUT или DELETE) в ранних данных TLS 0-RTT. Для ранних данных безопасны только идемпотентные запросы GET, поскольку их повторное воспроизведение не даёт побочных эффектов.

На стороне сервера в nginx поведением 0-RTT управляет директива ssl_early_data. Задайте ssl_early_data off;, чтобы отклонять все ранние данные и полностью исключить такой ответ. Если 0-RTT включён, передавайте сигнал о ранних данных на бэкенд с помощью proxy_set_header Early-Data $ssl_early_data;, чтобы приложение само решало по каждому запросу, принимать ранние данные или отклонять.

Бэкенд-приложения, получившие заголовок Early-Data: 1, отклоняют запросы с побочными эффектами (изменения учётной записи, платежи, отправка форм), отвечая кодом 425. Безопасные конечные точки только для чтения обрабатываются обычным образом.

Промежуточные узлы, пересылающие ранние данные от клиента, обязаны сохранять заголовок Early-Data: 1. Удаление этого заголовка лишает сервер-источник возможности обнаружить риск повторного воспроизведения.

Примеры кода

.NET

HttpStatusCode.TooEarly

Rust

http::StatusCode::TOO_EARLY

Rails

:too_early

Go

http.StatusTooEarly

Symfony

Response::HTTP_TOO_EARLY

Python3.9+

http.HTTPStatus.TOO_EARLY

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_TOO_EARLY

Angular

@angular/common/http/HttpStatusCode.TooEarly