代表的な面接トピック

一般面接:APIはHTTP 414 URI Too Longにどう対応すべきか?

一般普通
Offer.cc 編集チーム公開日 更新日

質問

ユーザーが多数のフィルターを追加した後、検索エンドポイントが断続的に414を返します。ルーティングやセキュリティの問題を隠蔽することなく、肥大化の原因を特定し、リクエストを再設計するにはどうすればよいですか?

プロンプトと状況設定

URIが設定された制限値を超えているため、サーバーがrequest-targetの解釈を拒否しています。この障害はクライアントのシリアライズ、リダイレクトループ、Cookie、またはプロキシ境界に起因する可能性があるため、サーバー単体の制限値を引き上げるだけでは解決しない場合があります。

面接官がテストするポイント

  • どのホップの制限をどのリクエストコンポーネントが超えたかを特定できるか。
  • URIからbodyへデータを移行する際に、HTTPメソッドのセマンティクスを維持できるか。
  • 任意のURLを無制限に受け入れるのではなく、境界が定められオブザーバビリティを持つクエリコントラクトを設計できるか。

回答前に確認すべき明確化の質問

  • 長過の原因はpath、query、リダイレクト先、エンコードされたクライアント状態のblobのいずれにありますか?
  • どのホップが414を返していますか:ブラウザ、CDN、ロードバランサー、ゲートウェイ、オリジンのいずれですか?
  • その操作は安全(safe)かつキャッシュ可能(cacheable)ですか、それとも状態を変更(mutate)しますか?
  • クライアントはフィルターセットに対して、共有可能なURL、ブックマーク機能、またはプライバシーを必要としていますか?

30秒の回答フレームワーク

request-targetの長さと414を生成したホップを捕捉し、リダイレクト、Cookie、エンコーディング、およびフィルターのシリアライズを調査します。フィルターセットが過大になった読み取り専用検索の場合、上限を設けたPOST検索エンドポイントまたは有効期間の短いサーバーサイドのクエリトークンを採用し、制限事項を文書化して認証・認可を維持します。すべてのホップをテストし、ログやキャッシュへの影響を確認することなく、単一のプロキシ制限を安易に引き上げることはしません。

ステップごとの詳細解説

1. 実際のrequest-targetを計測する

機密性の高いクエリ値をロギングすることなく、安全な長さのメトリクス、ルートテンプレート、リダイレクト回数、相関ID(correlation ID)を記録します。ブラウザ、CDN、ゲートウェイ、オリジンの制限を比較します。Base64状態blob、重複パラメータ、または偶発的なリダイレクトループによって、アプリケーションコードが実行される前にURIが肥大化することがあります。

2. メソッドとキャッシュのセマンティクスを維持する

GETは安全で自然にキャッシュ可能ですが、URLは無制限のデータ転送手段ではありません。大規模なフィルターセットをPOSTに移行するとキャッシュやブックマークの挙動が変わるため、明示的なエンドポイント、レスポンスキャッシュポリシー、および冪等性の期待値を定義します。検索ルートの背後で状態変更を隠すためだけにPOSTを使用してはなりません。

3. フィルターの制限と正規化

述語(predicate)の数、値の長さ、ネストの深さ、およびエンコードされた総バイト数に上限を設定します。不正な形式や重複したパラメータは一貫して拒否します。等価なフィルターを正規化(canonicalize)し、些細な順序の違いによってキャッシュや署名が別のリクエストとして扱われないようにします。

4. 共有可能性が重要な場合はクエリトークンを使用する

正規化されたフィルターオブジェクトを、短いTTL、テナントおよびユーザー認可、ワンタイムまたはスコープ制限された取得条件とともにサーバーサイドに保存します。URLに含めることができる短いトークンを返します。トークンやクエリ文字列にシークレットや未加工の個人データを絶対に含めないようにし、有効期限と失効(revocation)を適用します。

5. 414を運用シグナルとして扱う

ルート、クライアントバージョン、プロキシホップごとの発生率に対してアラートを設定します。リダイレクトチェーンやシリアライズを変更するデプロイの変更を追跡します。安全なフォールバックとしては、ユーザーにフィルターの削減を促すか、bodyエンドポイント経由でフォームを送信させることが挙げられます。条件を暗黙的に切り捨ててはなりません。

質の高い回答例

「まずターゲットの長さを計測して414を発生させたホップを特定し、リダイレクト、Cookie、エンコーディング、重複フィルターを調査します。フィルターセットがURLの制限を超える読み取り専用検索については、明示的なキャッシュおよび監査セマンティクスを備えた、制限付きPOST検索エンドポイントまたは認可された有効期間の短いクエリトークンを追加します。述語やエンコードバイト数に上限を設け、サイレントに切り捨てることはせず、ルートやクライアントバージョンごとの414発生率を監視します。プロキシ制限の引き上げは、すべてのホップにわたる調整とテストを伴う変更としてのみ実施します。」

よくある間違い

  • オリジンの制限のみを引き上げる → CDNやゲートウェイが依然として拒絶する可能性がある → すべてのホップを計測して設定する。
  • キャッシュ可能性を議論せずにデータをPOSTへ移行する → クライアントが期待されるセマンティクスを失う → キャッシュ、共有、冪等性の挙動を定義する。
  • 過大なフィルターを切り捨てる → 結果がユーザーのクエリと一致しなくなる → 明確に拒否するか、制限付きの代替エンドポイントを使用する。
  • クエリトークンにシークレットを含める → URLがログやリファラー経由で漏洩する → 不透明(opaque)トークンにスコープを設定し、有効期限と認可を設ける。

フォローアップの質問と回答

414はクエリ文字列によってのみ発生しますか?

いいえ。request-targetにはパスとクエリが含まれ、リダイレクトによってもターゲットが過大になることがあります。CookieはURI自体ではなくヘッダーの制限に影響を与えるため、診断では拒絶された正確なコンポーネントを特定する必要があります。

すべての大規模なGETをPOSTに変更すべきですか?

いいえ。通常の安全でキャッシュ可能な読み取りにはGETを維持します。リクエスト表現が実用的なURI制限に収まらない場合にのみ、意図的に定義された検索コントラクトとしてPOSTを使用し、変更されたキャッシュや共有の挙動を文書化します。

すべての制限を大幅に引き上げてはいけないのはなぜですか?

巨大なターゲットはパーサー、ロギング、キャッシュ、セキュリティのリソースを消費し、ホップ間で制限値の不整合を引き起こす可能性があります。制限の引き上げは、計測された必要性、協調的な設定、および悪用テスト(abuse testing)を実施した上でのみ行うべきです。

公開情報ソース

関連する質問