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