HTTPステータスコード — 200・404・500の意味と実務での読み方
HTTPレスポンスの先頭には、3桁の ステータスコード が必ず含まれます。これは「リクエストがどうなったか」をクライアントに伝える番号です。
この章では、ステータスコードの体系的な分類と、実務でよく遭遇するコードの意味を整理します。すべてを暗記する必要はなく、先頭の数字でカテゴリを判断し、詳細は都度調べる のが実務のやり方です。
学習者200 と 404 はなんとなく分かるけど、401 と 403 の違いとか 500 番台とか…正直あいまい。
ステータスコードの5つのカテゴリ
| カテゴリ | 意味 | 覚え方 |
|---|---|---|
| 1xx | 情報(処理中) | ほぼ見かけない |
| 2xx | 成功 | OK |
| 3xx | リダイレクト | 別の場所を見て |
| 4xx | クライアント側のエラー | リクエストが間違っている |
| 5xx | サーバー側のエラー | サーバーが壊れている |
最も重要なのは 4xxと5xxの区別 です。「リクエストを送った側の問題か、受けた側の問題か」を切り分けるのが、トラブルシューティングの第一歩です。
2xx — 成功系
| コード | 名前 | 意味 | よくある使い方 |
|---|---|---|---|
| 200 | OK | 正常に処理された | GET、PUT、PATCHの成功 |
| 201 | Created | リソースが作成された | POSTでの作成成功 |
| 204 | No Content | 成功したがボディなし | DELETEの成功 |
GET /api/users/1 → 200 OK + ユーザーデータ
POST /api/users → 201 Created + 作成されたユーザー
DELETE /api/users/1 → 204 No Content
3xx — リダイレクト系
| コード | 名前 | 意味 | よくある使い方 |
|---|---|---|---|
| 301 | Moved Permanently | 恒久的に移転 | ドメイン変更、URL変更 |
| 302 | Found | 一時的にリダイレクト | ログイン後のリダイレクト |
| 304 | Not Modified | 変更なし(キャッシュを使え) | 条件付きリクエスト |
301と302の違いは 恒久的か一時的か です。
- 301: 「このURLは永遠に使わない。新しいURLをブックマークして」 → 検索エンジンもインデックスを書き換える
- 302: 「今だけ別の場所に行って。元のURLはまた使う」 → 検索エンジンのインデックスは変えない
4xx — クライアントエラー系

クライアント(リクエストを送った側)に問題がある場合のコードです。
| コード | 名前 | 意味 |
|---|---|---|
| 400 | Bad Request | リクエストの形式が不正 |
| 401 | Unauthorized | 認証が必要(未ログイン) |
| 403 | Forbidden | 認証済みだが権限がない |
| 404 | Not Found | リソースが存在しない |
| 405 | Method Not Allowed | そのメソッドは許可されていない |
| 409 | Conflict | 現在の状態と矛盾する操作 |
| 422 | Unprocessable Entity | バリデーションエラー |
| 429 | Too Many Requests | レートリミット超過 |
401と403の違い
この2つは混同されやすいですが、明確に違います。
// 401 — 「あなた誰?」(認証されていない)
GET /api/admin/users
Authorization: (なし)
→ 401 Unauthorized
// 403 — 「あなたは知ってるけどダメ」(権限がない)
GET /api/admin/users
Authorization: Bearer <一般ユーザーのトークン>
→ 403 Forbidden
| 401 Unauthorized | 403 Forbidden | |
|---|---|---|
| 認証状態 | 未認証 | 認証済み |
| 意味 | ログインしてください | 権限がありません |
| 対処 | 認証情報を付けて再送 | 別の権限を持つユーザーで試す |
400と422の使い分け
| 400 Bad Request | 422 Unprocessable Entity | |
|---|---|---|
| 問題 | リクエストの構文が壊れている | 構文は正しいがバリデーションに失敗 |
| 例 | JSONが不正、必須ヘッダーがない | メールアドレスの形式が不正、文字数超過 |
実務では400で統一しているAPIも多いですが、フロントエンドがエラーの種類を判別してUIに出し分ける必要がある場合、422を使うと便利です。
5xx — サーバーエラー系
サーバー側の問題でリクエストを処理できなかった場合のコードです。
| コード | 名前 | 意味 |
|---|---|---|
| 500 | Internal Server Error | サーバー内部のエラー |
| 502 | Bad Gateway | 上流サーバーから不正なレスポンス |
| 503 | Service Unavailable | 一時的に利用不可 |
| 504 | Gateway Timeout | 上流サーバーからの応答がタイムアウト |
実務での5xxの読み方
500 → アプリケーションコードのバグ(未処理の例外など)
502 → リバースプロキシ(Nginx等)がアプリサーバーに繋がらない
503 → メンテナンス中、またはサーバーが過負荷
504 → アプリサーバーの処理が遅すぎてプロキシがタイムアウト
502と504は リバースプロキシ(NginxやCloudflare)が返す ことが多いです。アプリサーバーのプロセスが落ちていれば502、処理に時間がかかりすぎれば504が出ます。
APIレスポンスの設計指針
ステータスコードは「正しく返す」だけでなく、エラーレスポンスのボディにも詳細を含める のが良いAPIの条件です。
// よくないエラーレスポンス
{ "error": "Bad Request" }
// 良いエラーレスポンス
{
"error": {
"code": "VALIDATION_ERROR",
"message": "メールアドレスの形式が不正です",
"field": "email"
}
}ステータスコードで「何が起きたか」の大枠を伝え、ボディで「具体的に何が問題か」を伝える。この2層構造がフロントエンドにとって扱いやすいレスポンス設計です。
まとめ
- ステータスコードは 先頭の数字 でカテゴリが決まる(2=成功、3=リダイレクト、4=クライアントエラー、5=サーバーエラー)
- 401は未認証、403は権限なし — 混同しやすいが意味が違う
- 4xxはリクエスト側の問題、5xxはサーバー側の問題 — この切り分けがデバッグの起点
- エラーレスポンスには ステータスコード + ボディの詳細 の2層で情報を返す
次の章では、リクエストとレスポンスに含まれる ヘッダーとCookie の仕組みを見ていきます。