ステータスコードを深掘りする — 404、500、401、403で何が起きているか

バイブコーディング入門 — 第8回

前回までのおさらいと、今回のテーマ

前回(第7回)では、HTTPメソッド(GET・POST・PUT・DELETE)を学んだ。サーバーに送る手紙の「用件」がメソッドだという話だった。GETは「見せてください」、POSTは「新しく作ってください」、PUTは「書き換えてください」、DELETEは「消してください」。

手紙を送ったら、返事が来る。その返事に必ず含まれているのがステータスコードだ。

第6回でDevToolsのNetworkタブを学んだとき、ステータスコードに少し触れた。200は成功、404は見つからない、500はサーバーエラー。この3つだけでもかなり役に立つが、実際にバイブコーディングでアプリを作っていると、もう少し多くのステータスコードに出会う。

401、403、422、429 — これらの数字がDevToolsに表示されたとき、「何が起きているか」を自分で判断できるようになると、AIへのエラー報告の精度がさらに上がる。

今回は、バイブコーディングでよく遭遇するステータスコードを網羅的に解説する。すべてを暗記する必要はない。「こういう番号が出たら、こういう種類の問題だ」というパターンを掴むことが目的だ。

ステータスコードの「百の位」ルール

ステータスコードは3桁の数字だが、最初の1桁(百の位)を見るだけで、返事の種類が分かる。これがステータスコードの最も重要なルールだ。

200番台は「成功」。リクエストが問題なく処理された。

300番台は「転送」。要求されたものは別の場所に移動した。ブラウザが自動的に新しい場所にアクセスし直すので、普段は気にしなくてよい。

400番台は「クライアントエラー」。クライアントとは、リクエストを送った側(ブラウザやアプリ)のことだ。つまり「あなたが送ったリクエストに問題がある」という意味。URLが間違っている、ログインしていない、権限がない、送ったデータの形式がおかしい、などが原因だ。

500番台は「サーバーエラー」。サーバー側で何か問題が起きた。コードにバグがある、データベースに接続できない、サーバーが過負荷状態、などが原因だ。

バイブコーディングでエラーに遭遇したとき、まず百の位を見る。400番台なら「リクエストの送り方に問題がある」、500番台なら「サーバー側のコードに問題がある」。この判断だけで、AIに伝えるべき情報が変わってくる。

200番台 — 成功

200番台はすべて「うまくいった」という意味だ。バイブコーディングでよく見る200番台は3つある。

200 OK

最も基本的な成功コード。リクエストが正常に処理され、データが返ってきた。GETでデータを取得したとき、POSTで新しいデータを作成したとき、PUTでデータを更新したとき — ほとんどの成功レスポンスが200だ。

DevToolsのNetworkタブで、Status列が200の行は問題なく処理された通信だ。緑色で表示されることが多い。

201 Created

POSTリクエストで新しいデータが作成されたときに返されることがある。200と同じ「成功」だが、「新しく何かを作りました」というニュアンスが加わる。

たとえば、新しいユーザーを登録したとき、サーバーが201を返す。「あなたの登録リクエストを受け付けて、新しいアカウントを作成しました」という意味だ。

200と201の違いを気にする必要はほとんどない。どちらも「成功」だ。

204 No Content

前回のDELETEの例で登場した。「成功したが、返すデータはない」という意味だ。データを削除したとき、サーバーは「消しました」とだけ伝えればよく、返すデータがない。そういうときに204が使われる。

DevToolsで204が表示されていたら、「成功したんだな、データは返ってこないけど問題ない」と判断できる。

300番台 — 転送

300番台は「このページは別の場所に移動しました」という意味だ。バイブコーディングで直接目にすることは少ないが、知っておくと混乱しない。

301 Moved Permanently

「このURLは恒久的に別のURLに移動しました」という意味だ。古いURLにアクセスすると、ブラウザが自動的に新しいURLに移動する。

たとえば、サイトのURL構造を変更したとき(/blog/123 を /articles/123 に変えたとき)、古いURLにアクセスした人を新しいURLに転送するために使う。

302 Found(一時的な転送)

「今は別の場所にあるので、そちらを見てください」という意味だ。301が「永久に引っ越し」なのに対して、302は「一時的に別の場所」だ。

ログインが必要なページにログインせずにアクセスすると、ログインページに302で転送されることが多い。

300番台はブラウザが自動的に処理してくれるので、DevToolsに表示されていても問題ないことがほとんどだ。

400番台 — クライアントエラー

400番台は「リクエストを送った側に問題がある」エラーだ。バイブコーディングで最もよく遭遇するカテゴリであり、自分で原因を判断できることが多い。

400 Bad Request

「リクエストの形式がおかしい」という意味だ。サーバーが理解できない形式でデータを送ったときに返される。

よくある原因:

  • JSON形式が壊れている(カッコの閉じ忘れ、カンマの付け忘れなど)
  • 必須項目が送られていない
  • 数値を期待しているところに文字列が送られている

AIへの伝え方: 「POST /api/tasks に送信すると400エラーが返ります。送信データの形式に問題があるかもしれません。Payloadタブの内容は {...} です」

401 Unauthorized

「認証が必要です」という意味だ。ログインしていない状態で、ログインが必要なページやAPIにアクセスしたときに返される。

「Unauthorized」は「認可されていない」と訳されることが多いが、実際の意味は「認証されていない(誰なのか分からない)」だ。

よくある原因:

  • ログインしていない
  • ログインセッションの有効期限が切れた
  • APIキー(サービスを利用するための鍵)が設定されていない、または間違っている

AIへの伝え方: 「GET /api/profile にアクセスすると401が返ります。ログイン状態の確認か、認証トークンの送信処理を見てもらえますか」

403 Forbidden

「アクセスが禁止されている」という意味だ。401との違いは、403は「誰であるかは分かっているが、権限がない」ということだ。

会社で例えると、401は「社員証を持っていないので入れません」、403は「社員証は確認しましたが、この部屋に入る権限がありません」だ。

よくある原因:

  • ログインはしているが、その操作を行う権限がない
  • 管理者専用のページに一般ユーザーでアクセスした
  • データベースのアクセス権限(RLS)が正しく設定されていない

AIへの伝え方: 「DELETE /api/users/5 にリクエストすると403が返ります。ログインはしていますが、この操作の権限設定を確認してもらえますか」

401と403の使い分け早見表

404 Not Found

おそらく最も有名なステータスコードだ。「見つからない」という意味。リクエストしたURLに対応するページやデータが存在しない。

よくある原因:

  • URLのスペルミス(/api/taks と打っている。正しくは /api/tasks)
  • APIのファイルが正しい場所に置かれていない
  • IDが存在しないデータにアクセスした(/api/tasks/999 だが、ID 999のタスクは存在しない)
  • ファイル名やフォルダ名が間違っている

AIへの伝え方: 「GET /api/tasks にアクセスすると404が返ります。app/api/tasks/route.ts ファイルが存在するか確認してもらえますか」

バイブコーディングで404が出たときは、まずURLのスペルを確認する。それが正しければ、APIのファイルが正しい場所に作られているかをAIに確認してもらう。

405 Method Not Allowed

「そのHTTPメソッドは使えません」という意味だ。たとえば、GETしか対応していないURLにPOSTリクエストを送ったときに返される。

前回学んだHTTPメソッドの知識と組み合わせると、原因がすぐ分かる。「DELETE /api/tasks/1 で405が返る」なら、APIにDELETE用の関数が定義されていない可能性がある。

AIへの伝え方: 「DELETE /api/tasks/[id] に送ると405が返ります。route.tsにDELETE関数が定義されていないかもしれません」

409 Conflict

「競合が発生した」という意味だ。同じメールアドレスで2回ユーザー登録しようとしたときなどに返される。「そのデータは既に存在します」というニュアンスだ。

422 Unprocessable Entity

「データの形式は正しいが、内容に問題がある」という意味だ。400との違いは微妙だが、422は「形式は合っているがバリデーション(入力チェック)に引っかかった」場合に使われることが多い。

たとえば、メールアドレスのフィールドに「abc」と入力して送信した場合、JSON形式としては正しいが、メールアドレスとしては不正だ。こういうときに422が返される。

AIへの伝え方: 「POST /api/users で422が返ります。バリデーションエラーのようです。Responseタブには 'email must be a valid email address' と出ています」

429 Too Many Requests

「リクエストが多すぎます」という意味だ。短時間に大量のリクエストを送ると、サーバーが制限をかけて429を返す。これをレート制限(rate limiting)と呼ぶ。

外部APIを使っているときに遭遇することが多い。Claude APIやOpenAI APIなど、AIサービスのAPIには利用回数の制限がある。制限を超えると429が返される。

対処法は「少し待ってからやり直す」ことだ。レスポンスヘッダーに「Retry-After」という項目があれば、何秒後にリトライすればよいかが書いてある。

500番台 — サーバーエラー

500番台は「サーバー側で問題が起きた」エラーだ。400番台が「リクエストの送り方が悪い」のに対して、500番台は「サーバー側のコードやインフラに問題がある」。

500 Internal Server Error

最も一般的なサーバーエラー。サーバー側のコードで例外(予期しないエラー)が発生したときに返される。

バイブコーディングで500が出たら、サーバー側のコードにバグがある可能性が高い。DevToolsのResponseタブにエラーメッセージが含まれていることが多いので、そのメッセージをAIに伝えるのが最も効果的だ。

よくある原因:

  • データベースのテーブルやカラムが存在しない
  • 環境変数(APIキーなど)が設定されていない
  • コードの中で null(データなし)に対して操作しようとしている
  • 外部サービスへの接続に失敗している

AIへの伝え方: 「POST /api/tasks が500を返します。Responseに 'relation tasks does not exist' と出ています。データベースのテーブルが作成されていないかもしれません」

502 Bad Gateway

「中継サーバーがエラーを受け取った」という意味だ。アプリの前段にあるプロキシサーバー(中継役のサーバー)が、アプリ本体のサーバーからエラーの返事を受け取ったときに出る。

Vercel や Render(レンダー)などのホスティングサービスにアプリを公開しているとき、アプリが起動に失敗すると502が出ることがある。

503 Service Unavailable

「サービスが一時的に利用できない」という意味だ。サーバーがメンテナンス中、または一時的に過負荷状態のときに返される。

自分で作ったアプリで503が出ることは比較的少ない。外部サービス(SupabaseやClaudeのAPIなど)が一時的に停止しているときに見ることがある。

504 Gateway Timeout

「中継サーバーがタイムアウトした」という意味だ。アプリの処理に時間がかかりすぎて、中継サーバーが「もう待てない」と判断したときに返される。

データベースから大量のデータを取得する処理や、外部APIの応答が遅い場合に起きやすい。

AIへの伝え方: 「GET /api/reports が504を返します。レポートデータの取得に時間がかかりすぎているかもしれません。クエリの最適化か、タイムアウト設定の変更を見てもらえますか」

ステータスコード早見表

バイブコーディングでよく遭遇するステータスコードをまとめる。この表を覚える必要はない。DevToolsで見慣れない数字が出たときに、ここに戻って確認すればよい。


200番台(成功):

  • 200 OK — 成功。データが返ってきた
  • 201 Created — 成功。新しいデータが作成された
  • 204 No Content — 成功。返すデータはない

300番台(転送):

  • 301 — 恒久的な転送。URLが変わった
  • 302 — 一時的な転送。ログイン画面への転送など

400番台(クライアントエラー):

  • 400 Bad Request — リクエストの形式が不正
  • 401 Unauthorized — 認証が必要(ログインしていない)
  • 403 Forbidden — 権限がない(ログイン済みだが禁止)
  • 404 Not Found — URLに対応するものが存在しない
  • 405 Method Not Allowed — そのHTTPメソッドは非対応
  • 409 Conflict — データの競合(既に存在するなど)
  • 422 Unprocessable Entity — バリデーションエラー
  • 429 Too Many Requests — リクエスト回数制限

500番台(サーバーエラー):

  • 500 Internal Server Error — サーバー側のバグ
  • 502 Bad Gateway — 中継サーバーのエラー
  • 503 Service Unavailable — サービス一時停止
  • 504 Gateway Timeout — 処理のタイムアウト

DevToolsでステータスコードを確認する実践

実際のエラー調査の流れを、ステップバイステップで確認しよう。

ステップ1: DevToolsを開く

F12キー(MacはCommand + Option + I)でDevToolsを開き、Networkタブを選ぶ。「Fetch/XHR」フィルターをかけておく。

ステップ2: 赤い行を探す

エラーのある通信は赤く表示される。赤い行があったら、それがエラーの原因だ。

ステップ3: ステータスコードを確認する

赤い行のStatus列を見る。400番台か500番台かで、問題の所在が分かる。

  • 400番台 → リクエストの送り方に問題がある。URLやデータを確認する
  • 500番台 → サーバー側のコードに問題がある。サーバーのログを確認する

ステップ4: エラーメッセージを読む

赤い行をクリックして、Responseタブを開く。エラーの詳細メッセージが表示されていることが多い。このメッセージがエラー解決の最大の手がかりだ。

ステップ5: AIに伝える

ステータスコード、URL、HTTPメソッド、エラーメッセージをAIに伝える。


テンプレート: (症状)〇〇の操作をすると△△が起きる。 (DevToolsの情報)[メソッド] [URL] が [ステータスコード] を返している。 (レスポンスの内容)エラーメッセージは「□□□」。

具体例: (症状)ユーザー登録フォームで送信すると、エラーが表示される。 (DevToolsの情報)POST /api/users が422を返している。 (レスポンスの内容)「email must be a valid email address」。


この伝え方をすれば、AIは「フロントエンドのフォームでメールアドレスのバリデーションが足りていない」か「バックエンドのバリデーションが厳しすぎる」かを即座に判断できる。

よくある不安と答え

ステータスコードの番号を全部覚えないといけないか

覚える必要はない。大事なのは「百の位のルール」だけだ。2xxは成功、4xxはリクエスト側の問題、5xxはサーバー側の問題。この3つのパターンを覚えておけば、具体的な番号はこの記事の早見表を見て確認すればよい。

400番台と500番台、どちらが深刻か

一概には言えないが、500番台のほうが深刻なことが多い。400番台は「送り方を直せば解決する」ことが多いのに対して、500番台は「サーバー側のコードにバグがある」ことが多いからだ。ただし、どちらもAIに的確に伝えれば解決できる。

エラーのステータスコードが出ても、アプリが動いているように見えることがあるが

ある。広告や外部の解析ツールの通信がエラーになっていても、アプリ自体は正常に動作していることがある。自分のアプリのURL(/api/ で始まるものなど)の通信に注目すれば、本当に問題のあるエラーを見分けられる。

0や net::ERR_ で始まるエラーはステータスコードではないのか

ステータスコードではない。これはサーバーに手紙が届く前の段階で問題が起きていることを示す。ネットワーク接続の問題、サーバーが起動していない、CORSエラー(クロスオリジンリソースシェアリング、異なるドメイン間のアクセス制限)などが原因だ。これらのエラーが出たときは「サーバーにリクエストが届いていません」とAIに伝えると、適切な調査をしてくれる。

まとめ

ステータスコードは3桁の数字で、サーバーからの返事の種類を教えてくれる。百の位がすべてだ。2xxは成功、3xxは転送、4xxはリクエスト側の問題、5xxはサーバー側の問題。400番台ではURLやデータの送り方を確認し、500番台ではサーバー側のコードを確認する。DevToolsで赤い行を見つけたら、ステータスコードとResponseタブのエラーメッセージをAIに伝える。この2つの情報があれば、ほとんどのエラーは解決の糸口が見つかる。

次回は「HTTPヘッダの基本 — Content-TypeとAuthorizationで何をやりとりしているか」。手紙の封筒に書かれている「差出人情報」や「荷物の種類」にあたるHTTPヘッダについて解説する。

参考リファレンス

  • MDN Web Docs「HTTPレスポンスステータスコード」— Mozilla が提供するステータスコードの公式リファレンス
  • 前回: 第7回「HTTPメソッドの使い分け — GET・POST・PUT・DELETEで何が変わるか」(/articles/vc-007)
  • 次回: 第9回「HTTPヘッダの基本 — Content-TypeとAuthorizationで何をやりとりしているか」(/articles/vc-009)
  • バイブコーディング入門 カリキュラム(/vibe-coding)