404・403・500 は何が違う?──HTTPステータスコードの意味と「誰のせい」
HTTPステータスコードは1xx〜5xxの5クラスに分かれます。4xxは『依頼する側(クライアント)の問題』、5xxは『サーバ側の問題』という切り分けを軸に、404・403・500・502・503などの意味と、よくある混同を実例で解きほぐします。
「404 はよく見るけど、403 とどう違うの?」「500 が出たとき、これは自分のミス?それともサーバの故障?」──HTTPステータスコードは3桁の数字なのに、意味と「誰のせい」がわかりにくいまま放置されがちです。
ブラウザやAPIのレスポンスで毎日のように目にするのに、いざ「これは何のエラー?」と聞かれると説明できない。そんな方に向けて、クラス分けと切り分けの軸を一気に整理します。
結論を先に書きます。
3桁の最初の数字でクラスが決まります。そして 4xx は『依頼する側(クライアント/リクエスト)の問題』、5xx は『サーバ側の問題』です。
この一線が引けるだけで、エラー画面を見たときに「自分のリクエストを直すのか、サーバ運用者に連絡するのか」が即座に判断できます。
まず大枠:先頭1桁で5つのクラスに分かれる
HTTPステータスコードは必ず3桁で、先頭の数字がカテゴリを表します。
| クラス | 意味 | ざっくり言うと | 代表コード |
|---|---|---|---|
| 1xx | 情報 | 「処理を続けてOK」の途中経過 | 100 Continue, 101 Switching Protocols |
| 2xx | 成功 | リクエストは正常に処理された | 200 OK, 204 No Content |
| 3xx | リダイレクト | 別の場所を見に行って | 301 Moved Permanently, 302 Found |
| 4xx | クライアント側エラー | 依頼の仕方が間違っている | 400, 401, 403, 404, 429 |
| 5xx | サーバ側エラー | サーバが処理に失敗した | 500, 502, 503, 504 |
この表だけ覚えておけば、未知のコードに出くわしても「4で始まるなら自分のリクエスト、5で始まるならサーバ」と当たりがつきます。全コードを色分けして一覧で確認したいときは HTTPステータスコードを整える が早いです。
1xx・2xx:成功系はシンプル
1xx 情報
処理の途中経過を伝えるクラスで、通常はブラウザが裏で処理するため目にすることは少ないです。大きなアップロード前に 100 Continue でサーバの受け入れ可否を確認する、といった使われ方をします。
2xx 成功
- 200 OK:最も一般的な成功。リクエストが正常に処理され、本文(HTMLやJSON)が返る
- 204 No Content:成功したが返す本文がない。フォーム送信後やDELETE成功時など、「処理は終わった、表示するものはない」場面で使う
2xx が返っていれば、その通信は成功しています。
3xx:リダイレクト、301と302の違いがSEOを左右する
3xx は「目的のものは別の場所にあります」という案内です。ここで重要なのが 301 と 302 の違い。
| コード | 意味 | 性質 | SEOへの影響 |
|---|---|---|---|
| 301 | Moved Permanently | 恒久的な移転 | 旧URLの評価を新URLに引き継ぐ |
| 302 | Found | 一時的な移転 | 評価は旧URLに残る(引き継がない) |
ページを完全に引っ越したのに 302 を使ってしまうと、検索エンジンは「元の場所にいずれ戻る」と解釈し、新URLに評価が移りません。サイトリニューアルやドメイン移転では、恒久移転=301 を使うのが鉄則です。逆に、メンテナンス中だけ別ページへ飛ばすなど一時的な転送には 302 が適切です。
「移転は永久(301)か、それとも仮(302)か」を意識するだけで、SEO上の事故を防げます。
4xx:クライアント側=「依頼の仕方」を直す
ここからが本題です。**4xx はすべて「リクエストを送った側に原因がある」**クラスです。
| コード | 名前 | 意味 |
|---|---|---|
| 400 | Bad Request | リクエストの形式が壊れている(不正なパラメータなど) |
| 401 | Unauthorized | 未認証。ログインしていない/資格情報がない |
| 403 | Forbidden | 認証済みだが権限がない。アクセスを禁止されている |
| 404 | Not Found | 指定したURLのリソースが存在しない |
| 429 | Too Many Requests | リクエストが多すぎる(レート制限) |
4xx が返ったら、まず疑うのは自分のリクエストです。URLは正しいか、ログインしているか、送信データの形式は合っているか──サーバを責める前に手元を確認します。
401 と 403 の違い(最も混同される2つ)
- 401 Unauthorized = 「あなたが誰だかわからない」。まだログインしていない、トークンが無効。→ ログインすれば解決する可能性がある
- 403 Forbidden = 「あなたが誰かはわかった。でも権限がない」。ログイン済みだが、その操作・ページへのアクセス権を持っていない。→ ログインし直しても無駄。権限の付与が必要
名前は「Unauthorized(401)」なのに意味は『未認証』、というねじれが混乱の元です。401=認証していない、403=認証したが認可されていないと覚えると整理できます。
403 と 404 の違い(あえて隠すケースがある)
本来「権限がなくて見られない」なら 403 が正確です。しかしセキュリティ上、リソースの存在自体を隠したいとき、あえて 404 Not Found を返す設計があります。
たとえば非公開の管理画面に 403 を返すと「ここに何か存在する」と攻撃者に教えてしまう。そこで「そもそも存在しない(404)」と装い、URLの推測を防ぐわけです。404 だからといって本当に存在しないとは限らない、というのは知っておくと良い知識です。
5xx:サーバ側=「運用・上流」を見る
**5xx はすべて「サーバ側が処理に失敗した」**クラスです。リクエストが正しくても起こり得るため、利用者側でできることは限られます。
| コード | 名前 | 意味 | 主な原因 |
|---|---|---|---|
| 500 | Internal Server Error | サーバ内部のエラー | アプリのバグ、未処理の例外 |
| 502 | Bad Gateway | ゲートウェイが不正な応答を受けた | 上流サーバが落ちている/応答が壊れている |
| 503 | Service Unavailable | サービス利用不可(一時的) | メンテナンス中、過負荷 |
| 504 | Gateway Timeout | ゲートウェイがタイムアウト | 上流サーバの応答が遅すぎる |
500 と 502/504 と 503 の切り分け
- 500 Internal Server Error:そのサーバ自身のプログラムが落ちた。アプリのバグや設定ミス。サーバのログを見るのが第一歩
- 502 Bad Gateway / 504 Gateway Timeout:手前のサーバ(リバースプロキシ/ロードバランサ)が、その先の上流サーバとうまく通信できていない。502は「壊れた応答」、504は「応答が来ない(タイムアウト)」。上流の生死を疑う
- 503 Service Unavailable:一時的な利用不可。メンテナンスや急なアクセス集中。多くの場合、時間をおけば回復する
5xx を見たら、自分のリクエストではなくサーバ・運用・上流の状態を確認します。利用者なら「少し待つ」「運用者に連絡する」が基本対応です。
「誰のせい」フレームでまとめる
迷ったら、この一線に立ち返ってください。
- 4xx → リクエストを直す(依頼する側の問題)。URL・ログイン・送信データ・呼び出し頻度を見直す
- 5xx → サーバ/運用側を見る(受ける側の問題)。アプリのログ・上流サーバ・メンテ状況を確認する
「4で始まったら手元、5で始まったら向こう」。この切り分けができれば、エラーへの一次対応の方向を間違えません。
全コードを検索するには
ステータスコードは100種類以上あり、すべてを暗記する必要はありません。「このコード、何だっけ?」となったら HTTPステータスコードを整える でコード番号・名前から検索できます。
- 番号・名前・キーワードで全コードを検索
- クラス(1xx〜5xx)ごとに色分けされた一覧で俯瞰
- 各コードの意味・代表的な原因・対処の方向をその場で確認
「301 だっけ 302 だっけ」「502 と 504 どっちが上流タイムアウト?」のような、覚えきれないけれど現場で頻出する判断に、そのまま使えます。
関連ツールとのシナジー
- メソッド(GET/POST/PUT/DELETE)やヘッダーの意味を確認するなら → HTTPメソッド・ヘッダーを整える
- そもそもサイトに到達できない・名前解決から失敗している切り分けには → DNSレコードの種類を整える(5xx以前に、DNSやネットワーク層を疑うべき場面)
- ステータスコードそのものの検索・色分けは → HTTPステータスコードを整える
「ステータスコードが返ってきた(4xx/5xx)」のか、「そもそも繋がらない(DNS・ネットワーク)」のかを分けて考えると、トラブルの切り分けが一段速くなります。
まとめ
- HTTPステータスコードは3桁で、先頭1桁でクラスが決まる(1xx情報・2xx成功・3xxリダイレクト・4xxクライアント・5xxサーバ)
- 最重要の軸は 4xx=依頼する側の問題、5xx=サーバ側の問題
- 301(恒久)と302(一時) の違いはSEOに直結。移転は原則301
- 401=未認証、403=認証済みだが権限なし。403の代わりに存在を隠すため404を返すこともある
- 500=サーバ内部、502/504=上流ゲートウェイ、503=一時的(メンテ・過負荷)
- 「誰のせい」が分かれば、リクエストを直すのか、サーバを見るのかの一次対応を間違えない
- コードの意味を引くなら HTTPステータスコードを整える が早い
3桁の数字を「ただのエラー番号」ではなく「クラスと責任の所在」として読めるようになると、Webのトラブル対応が一気に落ち着いて進められます。