HTTP ステータスコード

HTTP レスポンスの結果を 3 桁の数値で表す標準コードで、1xx〜5xx の 5 カテゴリに分類される

HTTPAPI

HTTP ステータスコードとは

HTTP ステータスコードは、サーバーがクライアントに返す 3 桁の数値で、リクエストの処理結果を表す。1xx〜5xx の 5 カテゴリに分類される。

カテゴリ

カテゴリを以下にまとめる。

カテゴリ意味
1xx情報100 Continue
2xx成功200 OK, 201 Created
3xxリダイレクト301 Moved Permanently, 304 Not Modified
4xxクライアントエラー400 Bad Request, 404 Not Found
5xxサーバーエラー500 Internal Server Error, 503 Service Unavailable

よく使うステータスコード

よく使うステータスコードを以下にまとめる。

コード意味使い方
200OKGET の成功
201CreatedPOST でリソース作成
204No ContentDELETE の成功 (ボディなし)
301Moved PermanentlyURL の恒久的な移動
304Not Modifiedキャッシュが有効
400Bad Requestバリデーションエラー
401Unauthorized認証が必要
403Forbidden権限がない
404Not Foundリソースが存在しない
409Conflict競合 (楽観ロック失敗)
429Too Many Requestsレート制限
500Internal Server Errorサーバー内部エラー
502Bad Gateway上流サーバーのエラー
503Service Unavailable一時的に利用不可

401 を返すときは、RFC 9110 が WWW-Authenticate ヘッダーの送信を必須としている。どの認証方式で出し直せばよいかをクライアントに伝えるためだ。認証は通っているが権限が足りない場合は 403 で、こちらにヘッダーの要求はない。

API Gateway のステータスコード

API Gateway では、Lambda が返したコードとは別に、API Gateway 側の事情で決まるコードがある。まず統合タイムアウト (既定 29 秒) を超えると 504 になる。これは Lambda 自身のタイムアウトではなく API Gateway の制限なので、関数側のタイムアウトを 900 秒に設定していても 29 秒で切られる。次に Lambda プロキシ統合では、関数が未処理例外を投げた場合や statusCode を含む所定の JSON 形式以外を返した場合に 502 になる。加えてスロットリング時は 429、Cognito ユーザープールオーソライザーでトークンが欠落・無効なら 401 だ。障害調査では、アプリのバグと API Gateway の制約のどちらを見ているのかを最初に切り分ける。

リダイレクトの使い分け

恒久的な URL 移動には 301、一時的な移動には 302 を使う。301 なら移転先が正規の URL であることを検索エンジンにも伝えられる。

落とし穴はメソッドの扱いだ。RFC 9110 は 301 と 302 について、歴史的な理由からクライアントが後続リクエストのメソッドを POST から GET に変えてもよいと注記している。つまり POST のリダイレクトでボディが失われ得る。メソッドとボディを保ったままリダイレクトさせたい場合は、一時的なら 307、恒久的なら 308 を使う。この 2 つはメソッドの変更を禁じており、301 / 302 の曖昧さを解消するために用意されたものだ。

リトライの判断

429 (レート制限)、503 (一時的に利用不可)、502 と 504 (上流や統合の異常) はリトライ対象だ。429 と 503 では Retry-After ヘッダーが再試行までの待ち時間を示すので、自前の指数バックオフより優先して尊重する。400 (バリデーションエラー) や 404 (リソースなし) はリクエスト自体を直さない限り何度送っても同じ結果になる。

判断が難しいのは 500 だ。サーバー側の処理がどこまで進んだか分からないため、リトライの可否はメソッドの冪等性で決まる。GET・PUT・DELETE や冪等キーを添えた POST なら送り直してよいが、冪等でない POST を機械的にリトライすると二重登録・二重課金を生む。

HTTP ステータスコードを扱う関連書籍も多い。

この記事は役に立ちましたか?

関連用語

関連する記事