HTTPステータスコード一覧 — 200・301・400・401・403・404・500の意味と使い分け
この章の目次開く
HTTPレスポンスの先頭には、3桁の ステータスコード が必ず含まれます。これは「リクエストがどうなったか」をクライアントに伝える番号です。
この章では、ステータスコードの体系的な分類と、実務でよく遭遇するコードの意味を整理します。すべてを暗記する必要はありません。まずは先頭の数字でカテゴリを判断し、よく使うコードだけ意味と使い分けを押さえるのが実務のやり方です。
学習者200 と 404 はなんとなく分かるけど、401 と 403 の違いとか 500 番台とか…正直あいまい。
ステータスコードの5つのカテゴリ
| カテゴリ | 意味 | 覚え方 |
|---|---|---|
| 1xx | 情報(処理中) | ほぼ見かけない |
| 2xx | 成功 | OK |
| 3xx | リダイレクト | 別の場所を見て |
| 4xx | クライアント側のエラー | リクエストが間違っている |
| 5xx | サーバー側のエラー | サーバーが壊れている |
最も重要なのは 4xxと5xxの区別 です。「リクエストを送った側の問題か、受けた側の問題か」を切り分けるのが、トラブルシューティングの第一歩です。
よく使うステータスコード早見表
まずは次のコードを読めれば、ブラウザのNetworkタブやAPIレスポンスの調査で困る場面が大きく減ります。
| コード | 意味 | 使う場面 |
|---|---|---|
| 200 OK | 成功 | データ取得、更新成功 |
| 201 Created | 作成成功 | POSTで新しいデータを作成 |
| 204 No Content | 成功、本文なし | DELETE成功、返すデータがない更新 |
| 301 Moved Permanently | 恒久移転 | URLを今後ずっと変更する |
| 302 Found | 一時移動 | ログイン後の一時的な遷移 |
| 304 Not Modified | 変更なし | キャッシュ済みのデータを再利用 |
| 400 Bad Request | リクエスト不正 | JSONの形式不正、必須項目不足 |
| 401 Unauthorized | 未認証 | ログインしていない、トークンがない |
| 403 Forbidden | 権限なし | ログイン済みだが操作権限がない |
| 404 Not Found | 見つからない | URLやリソースIDが存在しない |
| 405 Method Not Allowed | メソッド不許可 | GETしかないURLにPOSTした |
| 409 Conflict | 競合 | 既に存在するメールアドレス、更新競合 |
| 422 Unprocessable Entity | 入力値エラー | 形式は正しいがバリデーションに失敗 |
| 429 Too Many Requests | 回数制限 | 短時間にAPIを呼びすぎた |
| 500 Internal Server Error | サーバー内部エラー | 未処理例外、アプリケーションのバグ |
| 502 Bad Gateway | 上流サーバー異常 | プロキシがアプリサーバーへ接続できない |
| 503 Service Unavailable | 一時利用不可 | メンテナンス、過負荷 |
| 504 Gateway Timeout | タイムアウト | 上流サーバーの応答が遅すぎる |
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層構造がフロントエンドにとって扱いやすいレスポンス設計です。
Next.jsで実際にJSONレスポンスやエラーレスポンスを返す実装は、Route HandlersとAPI Routeで扱っています。この章で整理したステータスコードを、NextResponse.json(..., { status }) にどう落とし込むかを確認できます。
DevToolsでステータスコードを確認する
Chrome DevToolsのNetworkタブを開くと、各リクエストの Status 列にステータスコードが表示されます。色分けされているので、一目でエラーの有無がわかります。
| 色 | 意味 |
|---|---|
| 緑/黒 | 2xx成功、3xxリダイレクト |
| 赤 | 4xxクライアントエラー、5xxサーバーエラー |
| 灰色 | キャンセルされたリクエスト |
実務でよくある調査フロー
APIの呼び出しがうまくいかないとき、DevToolsで確認する順番は決まっています。
fetchでステータスコードをハンドリングする
fetch はHTTPエラー(4xx、5xx)でも 例外を投げない 点に注意が必要です。ネットワークエラー(サーバーに繋がらない等)でのみ例外が発生します。
const response = await fetch('/api/users/1');
// fetchはHTTPエラーでもrejectしない — 明示的なチェックが必要
if (!response.ok) {
// response.ok は status が 200-299 の場合に true
if (response.status === 404) {
console.error('ユーザーが見つかりません');
} else if (response.status === 401) {
console.error('ログインが必要です');
// ログイン画面にリダイレクトする等の処理
} else {
console.error(`APIエラー: ${response.status}`);
}
return;
}
const user = await response.json();まとめ
- ステータスコードは 先頭の数字 でカテゴリが決まる(2=成功、3=リダイレクト、4=クライアントエラー、5=サーバーエラー)
- 401は未認証、403は権限なし — 混同しやすいが意味が違う
- 4xxはリクエスト側の問題、5xxはサーバー側の問題 — この切り分けがデバッグの起点
- エラーレスポンスには ステータスコード + ボディの詳細 の2層で情報を返す
次の章では、リクエストとレスポンスに含まれる ヘッダーとCookie の仕組みを見ていきます。