サーバーは、リプレイされる可能性のあるリクエストを処理するリスクを冒しません。
使いどころ
TLS の早期データ(0-RTT)。
よくある原因と対処法
425 は TLS 1.3 の early data(0-RTT とも呼ばれます)に関係します。再接続するクライアントは最初のハンドシェイクパケットと一緒にリクエストを送れますが、攻撃者がそのデータをリプレイできてしまいます。副作用のあるリクエストを early data で受け取ったサーバーや CDN は 425 を返すことができ、クライアントはハンドシェイクの完了後にそれを再送します。プロキシはそうしたリクエストに Early-Data: 1 ヘッダーを付けます。
ブラウザーが自動で再試行するため、自分で処理することはまずありません。重要になるのは、nginx の ssl_early_data on などで 0-RTT を有効にしたときです。proxy_set_header Early-Data $ssl_early_data でフラグを転送し、POST リクエストや状態を変更する GET に対してアプリが 425 を返すようにしてください。それを保証できないなら、0-RTT はオフのままにしておきましょう。
クライアントエラー (4xx)
4xx はクライアントエラーです。リクエスト自体が誤っている、認証されていない、または存在しないものを指しています。同じリクエストを再試行しても解決しません。
レスポンスでの表示
HTTP/1.1 425 Too Early返し方
| Node.js / Express | res.status(425).end() |
|---|---|
| Python / Flask | return '', 425 |
| nginx | return 425; |
確認方法
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/