合同会社小村ソフト
第 3 章

HTTP ステータスコード — 3 桁で結果を読む

ステータスコードは百の位で 5 つに分類してから下 2 桁を読む。成功の 200/201/204、リダイレクトの 301/302/308、クライアント側の 401/403/404、サーバ側の 500/502/503 を切り分ける。

「404 と 403 の違いは?」に詰まらないために

エラー画面のスクリーンショットが送られてきて「これ直せますか」と聞かれる。404 なのか 403 なのか 503 なのかで原因も直し方もまったく違うのに、数字の顔つきだけではどれも同じに見える — ステータスコードは、暗記しようとすると数十個あって挫折する分野です。

暗記は要りません。ステータスコードは百の位で 5 つに分類してから、よく会う下 2 桁だけ読むのが正しい付き合い方です。3 点セットの 2 つ目「結果はどうだったか」は、まず百の位が答えてくれます。

1xx — 処理の途中です
途中経過の連絡。日常の開発で目にする機会は少ない
2xx — 成功しました
頼みごとは受理され、処理された
3xx — 別の場所へどうぞ
答えは別の URL にある。転送先は Location ヘッダに書かれる
4xx — あなたの頼み方に問題があります
クライアント側の問題。存在しないパス、認証不足、権限不足など
5xx — こちらの処理でしくじりました
サーバ側の障害。リクエストは正しくても起きる

調査の初手はこの分類で決まります。4xx ならまずリクエスト側(URL・認証・送った内容)を疑い、5xx ならサーバ側(アプリのログ・後段のサービス)を疑う。この向きを取り違えないだけで、原因調査の半分は終わっています。

HTTP ステータスコードを百の位で 1xx から 5xx の 5 つに分類し、それぞれの意味と代表コードを示したチャート

百の位で 5 つに分類し、各クラスの中で「よく会う数個」だけ読み分ける — これがステータスコードの地図です。矢印の先の代表コードが、この章で扱うすべてです。

2xx — 成功にも使い分けがある

成功は 200 だけではありません。よく会う 3 つを並べます。

200 OK
成功の汎用形。頼まれたもの(HTML・JSON など)をボディに入れて返す
201 Created
成功し、新しいリソースが作られた。POST での作成成功の定番で、作られたものの URL を Location ヘッダに添えることが多い
204 No Content
成功したが、返す本文はない。削除や更新の成功報告にぴったり

API を作る側になったとき、この 3 つを使い分けられるかどうかで、返事の読みやすさが変わります。「成功した」だけでなく「成功して、何がどうなったか」まで 3 桁で伝えるのが 2xx の使いこなしです。

小問 3-1 — 百の位で分類する

まず百の位で大分類し、成功系の下 2 桁を読み分けます。

Q1. ステータスコードの百の位の読み方として正しいものはどれですか。

Q2. POST /orders で新しい注文の作成に成功したとき、意味として最も的確なステータスコードはどれですか。

Q3. DELETE /orders/7 が成功し、サーバは返すべき本文を特に持っていません。このとき自然なステータスコードはどれですか。

3xx — 「別の場所へどうぞ」の使い分け

3xx のレスポンスは「答えはここにはありません。Location ヘッダに書いた URL へどうぞ」という案内状です。ブラウザはこれを受け取ると自動で転送先にリクエストし直します。よく会うのは次の 3 つで、違いは 2 つの軸で読めます。

301 Moved Permanently — 恒久
「今後ずっとあちらです」。ブラウザは転送をキャッシュでき、検索エンジンは新 URL を正として登録し直す(SEO の評価が引き継がれる)。http から https への移転などに
302 Found — 一時
「いまだけあちらです」。キャッシュも登録の書き換えもされない。メンテナンス中の一時退避などに
308 Permanent Redirect — 恒久 + メソッド保存
301 と同じ恒久だが、POST を POST のまま転送することを保証する。(一時 + メソッド保存は 307)

2 軸目の「メソッド保存」は歴史的経緯の産物です。301/302 では、古い実装との互換のために POST が GET に書き換えられて転送されることが許容されています。HTML ページの移転なら実害はほぼありませんが、API の POST が GET に化けると頼みごと自体が変わってしまう。そこで「メソッドを変えない」ことを明示した 307/308 が後から用意されました。恒久か一時か × メソッドを保存するか — この 2 軸で 4 つのコードは整理できます。

4xx と 5xx — 誰の問題かを言い当てる

4xx の中では、似て見える 3 兄弟の言い分けが重要です。

401 Unauthorized
まだ認証されていません。名乗ってください」。名前に反して未認証の意味。ログインや認証情報の付与で通る可能性がある
403 Forbidden
「誰かは分かりましたが、権限がありません」。正しくログインしていても、その操作が許されていない
404 Not Found
「そのパスにリソースが見つかりません」。URL の打ち間違い、削除済み、公開前など

5xx の中では、この 3 つを切り分けられると障害対応の初手が変わります。

500 Internal Server Error
アプリケーション内部の想定外のエラー。まず見るのはアプリのログ
502 Bad Gateway
手前の中継役(リバースプロキシなど)が、後ろのサーバから正常な応答を得られなかった。疑うのは中継役の後ろ側
503 Service Unavailable
過負荷やメンテナンスで一時的に応答できない。「壊れた」ではなく「今は無理」の表明

502 が読めると強いのは、現代の Web サーバの多くが「中継役(nginx など)+ 後ろのアプリ」という 2 段構成だからです。502 は中継役は生きていて、後ろが倒れていることまで教えてくれています。数字 1 つで、調べる場所が 1 段絞れるのです。

小問 3-2 — リダイレクトとエラーを切り分ける

3xx の使い分けと、4xx・5xx の中の切り分けです。実務での調査の初手が変わります。

Q4. サイトを http://example.com から https://example.com へ恒久的に移転しました。301 を選ぶ理由として正しいものはどれですか。

Q5. 308 Permanent Redirect が 301 と別に用意されている理由として正しいものはどれですか。

Q6. 管理画面 https://example.com/admin にログイン済みの一般ユーザがアクセスしたところ、拒否されました。「ページが存在しないのではなく、認証は済んでいるが権限が足りない」ことを表す最も的確なコードはどれですか。

この章で持ち帰ること

  • ステータスコードは百の位で 5 分類 — 途中経過 / 成功 / 転送 / クライアント側の問題 / サーバ側の障害。調査の初手はここで決まる
  • 成功の使い分け: 200 汎用 / 201 作られた / 204 成功したが本文なし
  • リダイレクトは恒久か一時か × メソッドを保存するかの 2 軸 — 301・302・308(と 307)。恒久はキャッシュされ SEO 評価も引き継がれる
  • 401 未認証 / 403 権限不足 / 404 不存在500 アプリ内部 / 502 後ろが倒れている / 503 一時的に無理を言い分ける

結果の読み方が身についたので、次章は 3 点セットの 3 つ目 — 往復書簡に添えられる「条件と補足」、ヘッダを読みます。