Slate Errors

Client Error

425

Too Early

— 早すぎます

まずは確認: よくある原因 TOP3

  1. TLS 1.3 の 0-RTT (Early Data) で送ったリクエスト
    リプレイ攻撃のリスクがあるため、サーバー側で受け付けを保留
  2. セッション再開時のレース条件
    ハンドシェイク完了前にデータが届いている
  3. クライアントの自動最適化
    HTTP クライアントが安全でないリクエストにも 0-RTT を使っている

何が起きたのか?

425 は「まだ授業が始まってもいないのに先生に質問をしてしまった」というサインです。 教室で言えば、先生が教室に入って黒板の準備をしている途中、生徒が先回りして質問を始めてしまった——そんな場面に近いです。サーバーは「もう少し進んでから受け付けます」と返しています。

実務では TLS 1.3 の 0-RTT (Early Data) と呼ばれる高速化機能で起きます。ハンドシェイクの完了を待たずに送られたデータは、悪意のある第三者にコピーされて再送される可能性があるため、サーバーは安全のためにいったん拒否することがあります。

黒板からのひとこと

授業前の慌ただしい時間に質問を投げると、先生は「ちょっと待って、まずは出席を取ってからね」と返すことがあります。先生が冷たいわけではなく、まずは授業の枠組みが整ってから受け付けたい、という気持ちです。

425 もそれと同じで、サーバーは「正規のハンドシェイクが終わってから受け付ける」と言っています。クライアントは少し待って通常のフローでやり直せば、たいてい通ります。

解決への歩み

大丈夫、次はこうしてみよう:

  1. 0-RTT を使わずに再送:通常のハンドシェイク後にリクエストを送り直す
  2. HTTP クライアント設定を確認:early data の利用条件を見直す
  3. リクエストの冪等性を確認:副作用のある操作には 0-RTT を使わない
  4. TLS 設定を整理(管理者向け):0-RTT を許可するエンドポイント、許容するメソッドを明確化

実際にはこう見える

$ リクエスト

curl -i https://example.com/some/path

↓ レスポンス

HTTP/1.1 425 Too Early
Content-Type: text/html; charset=utf-8

<!DOCTYPE html>
<html><body><h1>425 Too Early</h1></body></html>

似ているケース

もっと知りたい