HTTPQUERY
日本語

425 Too Early

使い方

425 Too Early エラーは、HTTPS 接続を確立するのに要する時間に関連します。レイテンシが大きい場合、TLS が安全な接続を確立するのに要する時間は長くなります。最適化の1つは、安全な接続が完全に確立される前の早い段階でクライアントがデータを送信することです。

経路に中間装置が関わる場合、その中間装置は Early-Data: 1 リクエストヘッダーを含めなければなりません。中間装置はこのヘッダーを削除してはなりません。これにより、そのリクエストが early data で送信されたこと、そしてクライアントが 425 Too Early レスポンスを理解していることがサーバーに伝わります。

リクエスト

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

リクエストを最初に発信した側は、このヘッダーを送る必要はありません。データを早期に送信することで、クライアントはその結果を理解しており、425 Too Early レスポンスを適切に処理することを暗に示しています。

状況によっては early data の送信が望ましくなく、サーバーは応答としてこのエラーを返します。リスクは、クライアントのリクエストがリプレイされ、セキュリティを損なう副作用につながることです。

クライアントがこのステータスコードを受け取ると、リクエストは自動的に再試行されます。ハンドシェイクが完了し、安全な接続が確立されたあとに行われます。

SEO への影響

Google のような検索エンジンは、425 のレスポンスステータスを持つ URL をインデックスしません。このステータスコードを返す、以前にインデックスされていた 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 ライブラリは、この再試行を自動的に処理します。

TLS 0-RTT の early data で、冪等でないリクエスト(POST、PUT、DELETE など)を送らないでください。リプレイされても副作用がないため、early data に安全なのは冪等な GET リクエストだけです。

nginx のサーバー側では、ssl_early_data ディレクティブが 0-RTT の挙動を制御します。ssl_early_data off; を設定するとすべての early data が拒否され、このレスポンスは完全になくなります。0-RTT を有効にする場合は、proxy_set_header Early-Data $ssl_early_data; でバックエンドに early data のシグナルを渡し、アプリケーションがリクエストごとに early data を受け入れるか拒否するかを判断できるようにします。

Early-Data: 1 ヘッダーを受け取ったバックエンドのアプリケーションは、副作用を伴うリクエスト(アカウントの変更、支払い、フォーム送信)を 425 で応答して拒否します。安全な読み取り専用のエンドポイントは通常どおり処理を進めます。

クライアントからの early data を転送する中間装置は、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