ぱんだツールズぱんだツールズ

技術背景

HTTP ステータスコード完全ガイド — 400・401・403・404・500の違いと対処法

約8分

「404エラーのページを見たことがない人はいない」と言っても過言ではありませんが、 200番台と300番台の違いをすらすら説明できる人はそれほど多くありません。 HTTP(HyperText Transfer Protocol)のステータスコードはWebの根幹をなす仕様ですが、 番号が多く似たものも多いため、開発中にどれを返すべきか迷う場面は誰にでもあります。 この記事では、1xx〜5xxの体系から実務でよく見るコードの意味・使い分け・対処法まで、 開発者とWebサイト運営者の両方の視点で解説します。

HTTPステータスコードの体系 — 1xx〜5xx

HTTPステータスコードは3桁の数字で、先頭の1桁がカテゴリを表します。 RFC(Request for Comments)7231をはじめとする一連の仕様で定義されています。

カテゴリ意味代表的なコード特徴
1xx情報(Informational)100, 101処理続行中。WebSocketアップグレード時に101が使われる
2xx成功(Success)200, 201, 204リクエスト成功。最もよく使われるカテゴリ
3xxリダイレクト(Redirection)301, 302, 304追加の処理が必要。URLが変わったことを伝える
4xxクライアントエラー(Client Error)400, 401, 403, 404リクエスト側の問題。修正が必要なのはクライアント
5xxサーバーエラー(Server Error)500, 502, 503, 504サーバー側の問題。リクエスト自体は正しい

2xx 成功レスポンス — 使い分けが意外と難しい

「成功したら200を返せばいい」と思いがちですが、REST APIの設計では意味の違いを使い分けることで APIの意図が明確になります。

コード名称意味・使いどころ
200OKGETの取得成功・PUTやPATCHの更新成功。汎用的な成功コード
201CreatedPOSTでリソースを新規作成した。Locationヘッダーで作成先URLを返す
204No ContentDELETEの成功など、レスポンスボディが不要な場合。ボディは空にする
206Partial Content動画ストリーミング・ファイルの範囲取得(Rangeヘッダーと組み合わせて使用)

REST APIの慣習

POST(作成)→ 201、PUT/PATCH(更新)→ 200、DELETE(削除)→ 204がよく使われる組み合わせです。 すべてに200を返すAPIも多いですが、201と204を使うとAPIクライアント側でレスポンスの意味が明確になります。

3xx リダイレクト — SEOへの影響を知る

3xxはブラウザ(またはクローラー)に「別のURLを見てください」と伝えるコードです。 選ぶコードによってSEO評価の引き継ぎ方が変わります。

コード名称SEO評価の引き継ぎ使いどころ
301Moved Permanently転送される(推奨)URLの恒久的な変更、HTTP→HTTPSへの移行
302Found(一時リダイレクト)転送されないA/Bテスト、ログイン前のリダイレクト
304Not Modifiedキャッシュが有効(ETagで判定)。ボディなしで返す
307Temporary Redirect転送されない302と同義だがHTTPメソッドを変えない(POSTがそのままPOSTで飛ぶ)
308Permanent Redirect転送される301と同義だがHTTPメソッドを変えない(POSTがそのままPOSTで飛ぶ)

ドメイン変更やURL体系の変更には必ず301を使いましょう。302を使うと検索エンジンが古いURLを保持し続け、リンク評価が新URLに移りません。 また302は仕様上HTTPメソッドをGETに変更してリダイレクトする実装が多いため、 POSTをリダイレクトしたい場合は307/308が適切です。

4xx クライアントエラー — 原因はリクエスト側にある

4xxはリクエスト側に問題があるコードです。サーバーを再起動しても解決しません。 特に401と403は混同されやすいため、丁寧に解説します。

400 Bad Request

HTTPリクエスト自体が不正な場合です。JSONの構文エラー・無効なクエリパラメータ・ 必須ヘッダーの欠落などが該当します。バリデーション違反には422を使うケースも多いですが、 400を広く使うAPIも多く、どちらかに統一することが重要です。

401 Unauthorized — 「誰?」

名前は「Unauthorized(認可されていない)」ですが、意味は「認証されていない」です。 Authorizationヘッダーがない・トークンが無効・期限切れなど、 「あなたが誰かわからない」状態のときに返します。

クライアントは再認証(ログインやトークン再取得)を試みることが期待されます。 レスポンスには WWW-Authenticate ヘッダーを付けることが推奨されています(RFC 7235)。

403 Forbidden — 「誰かはわかるが、ダメ」

認証済みだが権限がない状態です。ログインしている一般ユーザーが管理者専用ページにアクセスした場合や、 IP制限にかかった場合などに返します。

401 vs 403 まとめ

  • 未ログイン状態でAPIを叩いた → 401(再ログインで解決できるかもしれない)
  • ログイン済みだが管理者権限が必要なページ → 403(再ログインしても変わらない)

404 Not Found

指定したURLのリソースが存在しない場合です。「存在しないのか、アクセス権がないのかを教えたくない」 セキュリティ上の理由から、403の代わりに404を返す実装もあります(存在すること自体を隠す)。 削除済みリソースを明示したい場合は410 Goneを検討してください。

その他のよく使う4xxコード

コード名称使いどころ
405Method Not AllowedGETしか許可していないエンドポイントにPOSTした場合など
408Request Timeoutクライアントがリクエストを送りきれずタイムアウト
409Conflictすでに存在するメールアドレスで登録しようとした場合など
410Goneリソースが永久に削除された(クローラーへのインデックス削除を促す)
422Unprocessable EntityJSON形式は正しいがバリデーション失敗(必須フィールドなし・型違い等)
429Too Many Requestsレートリミット超過。Retry-Afterヘッダーと組み合わせて使う

5xx サーバーエラー — 問題はサーバー側にある

5xxはリクエスト自体は正しいが、サーバー側で問題が発生したコードです。 nginx・Docker・クラウド環境でよく遭遇するものを中心に解説します。

コード名称よく見る状況
500Internal Server Errorアプリケーションの未処理例外・バグ・設定ファイルのエラー
502Bad Gatewaynginxの背後のアプリサーバーがクラッシュ・Dockerコンテナが落ちている
503Service Unavailableデプロイ中・メンテナンス中・負荷が高すぎてリクエストをさばけない
504Gateway Timeoutバックエンドへのリクエストがタイムアウト(DBが遅い・外部API応答待ちなど)

500と502の見分け方:500はアプリサーバー自体がエラーを返しています(エラーログにスタックトレースあり)。 502はプロキシ(nginx等)がバックエンドから応答を得られなかった場合で、 nginxのエラーログにupstream connect() failedなどが記録されます。

503と504の見分け方:503は「サービスが使えない」、504は「タイムアウトした」です。 504が頻発する場合は、DBのスロークエリやN+1問題を疑いましょう。

シーン別早見表 — どのコードを使うか迷ったとき

実務でよく迷う場面を3カテゴリに分けて整理します。 エラーコードの意味をさらに深掘りしたいときはエラーコード横断検索ツールでHTTPステータスコード・SQLStateなどを横断検索できます。

REST API設計

シナリオ推奨コード
GETでデータ取得成功200
POSTで新規リソース作成成功201 + Locationヘッダー
DELETEで削除成功(ボディなし)204
リクエストボディのバリデーション失敗422
重複レコードの作成を試みた409
レートリミット超過429 + Retry-After

Webアプリケーション開発

シナリオ推奨コード
ページが存在しない404
削除したコンテンツのURL410(SEO観点で301より有効な場面も)
ログインが必要なページ(未ログイン)401(またはログインページへ302)
権限不足のページ(ログイン済み)403
URLが恒久的に変わった301

インフラ運用

状況コード調査ポイント
アプリが落ちた・バグで例外発生500アプリのエラーログ・スタックトレース
nginxの裏でNode.js/Pythonが落ちた502nginxエラーログ・コンテナの起動状態
デプロイ中・計画メンテナンス503Retry-Afterヘッダーで再試行時間を告知する
DBのスロークエリ・外部API遅延504DBのスロークエリログ・外部API応答時間

まとめ

  • 1xx〜5xxはカテゴリを示す。4xxはクライアントの問題・5xxはサーバーの問題
  • 401は「誰かわからない(未認証)」、403は「誰かわかるが権限なし(認証済み・認可なし)」
  • POSTの成功は201、DELETEでボディ不要なら204を使うとAPIの意図が明確になる
  • 301はSEO評価を転送する恒久的リダイレクト、302はSEO評価を転送しない一時的リダイレクト
  • 422はJSONとしては正しいがアプリレベルのバリデーション失敗に使う
  • 502はプロキシのバックエンド接続失敗、503は意図的なサービス停止、504はタイムアウト
  • 429が返ってきたらRetry-Afterヘッダーを確認し、指数バックオフでリトライする
  • 削除したURLには404より410を返すとクローラーへのインデックス削除を促せる

よくある質問

401 Unauthorizedと403 Forbiddenの違いは何ですか?

401は「認証されていない」、403は「認証済みだが権限がない」という違いです。401は「ログインしていない or トークンが無効」で、再ログインすれば解決する可能性があります。403は「ログインしているが、そのリソースへのアクセス権がない」状態です。たとえば一般ユーザーが管理者専用ページにアクセスした場合は403が正しく、ログインしていない状態でAPIを叩いた場合は401が正しいです。混同すると「なぜ再ログインしても解決しないのか」という混乱を招くため、実装時に意識して使い分けることが重要です。

502 Bad Gatewayと503 Service Unavailableの違いは何ですか?

502は「リバースプロキシ(nginx等)の背後にあるアプリサーバーが不正なレスポンスを返した or 応答しなかった」状態です。nginxがNode.jsやPythonアプリにプロキシしようとしたが、アプリが落ちているときによく出ます。503は「サーバーが一時的にリクエストを処理できない」状態で、デプロイ中のダウンタイムやスケールアップ待ちのときに使います。どちらも「サービスが使えない」ですが、502は「バックエンドへの接続失敗」、503は「意図的or一時的なサービス停止」というニュアンスです。

404 Not Foundと410 Goneの違いは?どちらを返すべきですか?

404は「リソースが存在しない(あるかどうかわからない)」で、410は「リソースが永久に削除された(戻ってこない)」という違いです。記事を削除した場合、410を返すとGoogleなどの検索エンジンにインデックス削除を促せます。一方、404ではクローラーがしばらく再訪問を続けます。削除したコンテンツに404を返すのは技術的に誤りではありませんが、意図的に削除したことを明示したいなら410がSEO上望ましいです。多くのフレームワークはデフォルトで404を返すため、コスト対効果を考慮して使い分けてください。

422 Unprocessable Entityはいつ使いますか?

422は「リクエストの形式は正しい(JSON構文エラーなし)が、内容が処理できない」ときに使います。たとえばJSON形式は正しいが、必須フィールドがない・型が違う・バリデーション違反などが該当します。400 Bad Requestとの違いは、400が「HTTPリクエスト自体が不正(形式エラーや無効なヘッダー等)」であるのに対し、422はHTTPとしては正しいがアプリケーションレベルでのバリデーションに失敗した場合です。REST APIではバリデーションエラーに422を使うのが慣習になっています。

429 Too Many Requestsが返ってきたらどうすればいいですか?

429はレートリミット(単位時間あたりのリクエスト数制限)に達したことを意味します。対処法は3つあります。①レスポンスヘッダーの `Retry-After` または `X-RateLimit-Reset` を確認し、指定秒数後に再試行する。②指数バックオフ(1秒→2秒→4秒と待機時間を増やす)でリトライする。③APIの利用プランをアップグレードする。自分のAPIで429を実装する場合も同様に `Retry-After` ヘッダーを付けることが推奨されます(RFC 6585)。

5xxエラーが続くときの切り分け方は?

5xxエラーはサーバー側の問題ですが、原因は多岐にわたります。切り分けの手順は次のとおりです。①500なら、まずサーバーのエラーログを確認(スタックトレースが出ているはず)。②502/504ならnginx等のプロキシログとバックエンドアプリのログを両方確認。③503なら、アプリが起動しているか・ヘルスチェックエンドポイントが応答しているか確認。④タイムアウト系(504)なら、DBクエリの実行時間・外部API呼び出しのレスポンスタイムを疑う。特定のエンドポイントだけで発生するなら、そのエンドポイントのロジックに問題がある可能性が高いです。複数のエラーコードを素早く調べるには、ぱんだツールズの<Link href="/tools/error-code-search" className="text-blue-600 hover:underline">エラーコード横断検索ツール</Link>も活用できます。

301と302リダイレクトはSEOに影響しますか?

301は「恒久的なリダイレクト」でページランク(被リンクの評価)がほぼ転送されます。302は「一時的なリダイレクト」でページランクは転送されません。URL変更・ドメイン移転には必ず301を使い、Googleにリダイレクト先をインデックスさせます。302はA/Bテストやメンテナンス中の一時的な切り替えに使います。301を使うべき場面で302を使うと、古いURLにリンク評価が残り続けてSEO的に非効率です。また、HTTPからHTTPSへのリダイレクトも301で設定するのがベストプラクティスです。

REST APIで「作成成功」のステータスコードは200と201どちらが正しいですか?

POSTリクエストでリソースを新規作成した場合は201 Createdが正しいです。200 OKはリクエストが成功したことを示しますが、「何が成功したか」の意味が弱いです。201は「新しいリソースが作成された」という意味で、Locationヘッダーに作成されたリソースのURLを付けることが推奨されます。一方、PUTやPATCHで更新成功した場合は200、更新したがレスポンスボディが不要な場合は204 No Contentを返すのが一般的なREST APIの慣習です。

この記事で紹介したツール