HTTPステータスコードの究極ガイド
HTTPステータスコードは、Webサーバーのリクエスト処理の結果を示します。これらは5つのクラスにグループ化され、各クラスは異なる応答カテゴリを表します。これらのコードを理解することは、Web開発者、API設計者、システム管理者、そしてWeb技術を扱うすべての人にとって不可欠です。ステータスコードにより、ブラウザ、モバイルアプリ、他のサーバーなどのクライアントは、リクエストがどうなったか、次にどう進むべきかを理解できます。
HTTPステータスコードの仕組み
クライアントがHTTPリクエストをサーバーに送信すると、サーバーは3桁のステータスコードとそれに続く人間が読める理由フレーズで応答します。ステータスコードの最初の桁は応答のクラスを定義します。残りの2桁は特定の分類役割を持ちませんが、各クラス内で粒度を提供します。ステータスコードは、RFC文書で公開された仕様に基づいてInternet Assigned Numbers Authority(IANA)によって定義されています。2025年現在、70以上の公式に登録されたHTTPステータスコードがありますが、一般的に使用されているのは約30〜40です。
クイックリファレンス
| クラス | カテゴリ | 意味 |
|---|---|---|
| 1xx | 情報 | リクエストを受信、処理継続中 |
| 2xx | 成功 | リクエストを受信、理解、受理 |
| 3xx | リダイレクト | リクエスト完了にさらなるアクションが必要 |
| 4xx | クライアントエラー | リクエストに不正な構文があるか、処理不可 |
| 5xx | サーバーエラー | サーバーが有効なリクエストの処理に失敗 |
1xx - 情報
これらのコードは、サーバーがリクエストヘッダーを受信し、クライアントが本文の送信を続行すべきこと、またはサーバーが別のプロトコルに切り替えていることを示します。これらは実際の本文コンテンツのない暫定応答です。
| コード | 名前 | 説明 |
|---|---|---|
| 100 | Continue | サーバーがヘッダーを受信、クライアントは本文の送信を続行すべき |
| 101 | Switching Protocols | サーバーがプロトコルを切り替え中(例:WebSocketへのアップグレード) |
| 102 | Processing | サーバーがリクエストを処理中だがまだ応答なし(WebDAV) |
| 103 | Early Hints | サーバーが応答を準備中にリソースをプリロード、パフォーマンス最適化に使用 |
100 Continueステータスは、Expect: 100-continueリクエストヘッダーと組み合わせてよく使用されます。クライアントがこのヘッダーを送信すると、大きなペイロードを送信する前に確認を待ちます。これにより、サーバーがヘッダーだけでリクエストを拒否する場合の帯域幅の無駄を防ぎます。
101 Switching ProtocolsはWebSocket接続の基盤です。クライアントがUpgrade: websocketヘッダーを送信すると、サーバーは101で応答してHTTPからWebSocketへのプロトコル切り替えを確認し、リアルタイム双方向通信を可能にします。
103 Early Hintsは比較的新しい追加(RFC 8297)であり、サーバーが最終応答に必要となる重要なリソース(CSS、JavaScript、フォント)に関するヒントをブラウザに送信できます。これにより、完全な応答が準備できる前にブラウザがこれらのリソースのプリロードを開始でき、認識されるパフォーマンスが向上します。
2xx - 成功
これらのコードは、クライアントのリクエストが正常に受信、理解、受理されたことを示します。すべての開発者が見たいと思うカテゴリです。
| コード | 名前 | 説明 |
|---|---|---|
| 200 | OK | GET、POST、PUTリクエストの標準成功応答 |
| 201 | Created | リソースが正常に作成された、通常はPOSTへの応答 |
| 202 | Accepted | リクエストは処理受理されたが未完了 |
| 203 | Non-Authoritative Info | オリジンサーバーではなく第三者ソースからの応答 |
| 204 | No Content | 成功したが、返す応答本文なし |
| 205 | Reset Content | ブラウザに現在のフォーム/ドキュメントをクリアするよう指示 |
| 206 | Partial Content | 部分リソースを返す、範囲リクエストと再開可能ダウンロードに使用 |
| 207 | Multi-Status | 複数リソースの複数ステータスコード(WebDAV) |
| 208 | Already Reported | リソースは既に報告済み(WebDAV) |
200 OKは最も一般的なステータスコードです。リクエストが成功し、応答本文に要求されたデータが含まれていることを示します。GETリクエストの場合、本文にはリソース表現が含まれます。POSTリクエストの場合、アクションの結果が含まれます。
201 Createdは、POSTまたはPUTリクエストの結果として新しいリソースが作成された場合に返すべきです。応答には、新しく作成されたリソースのURLを指すLocationヘッダーを含めるべきです。例えば、新しいユーザーを作成した後、ユーザーのプロフィールURLをLocationヘッダーに含めて201 Createdを返します。
204 No Contentは、応答本文が空のDELETEリクエストやPUT更新に便利です。操作が成功したが返すものがないことをクライアントに伝えます。ブラウザは現在のドキュメントビューを変更すべきではありません。
3xx - リダイレクト
これらのコードは、クライアントがリクエストを完了するために追加のアクションを取る必要があること、通常は別のURLへのリダイレクトに従うことを示します。
| コード | 名前 | 説明 |
|---|---|---|
| 300 | Multiple Choices | 複数の可能な表現、クライアントが選択すべき |
| 301 | Moved Permanently | リソースに新しい恒久的なURL、ブックマークを更新 |
| 302 | Found | 一時的なリダイレクト、将来は元のURLを引き続き使用 |
| 303 | See Other | GETメソッドを使用して別のURLにリダイレクト |
| 304 | Not Modified | リソースは変更されていない、キャッシュバージョンを使用 |
| 307 | Temporary Redirect | HTTPメソッドを保持する一時リダイレクト |
| 308 | Permanent Redirect | HTTPメソッドを保持する恒久リダイレクト |
301と302の区別はSEOにとって重要です。検索エンジンは301リダイレクトを恒久的なものとして扱い、元のURLのランキングパワーを新しいURLに転送します。302リダイレクトは元のURLが戻ることが期待されるため、SEO値を転送しません。
304 Not Modifiedは、If-Modified-SinceやIf-None-Match(ETags)などの条件付きリクエストヘッダーと組み合わせて使用されます。クライアントがリソースのキャッシュバージョンを持っている場合、サーバーにリソースが変更されたかどうかを尋ねることができます。変更されていない場合、サーバーは本文なしで304を返し、両側の帯域幅を節約します。
307と308は、302や301がPOSTをGETに変更する可能性があるのとは異なり、元のリクエストで使用されたHTTPメソッドを保持します。この区別は、リクエストメソッドの保持が重要なAPIエンドポイントにとって重要です。
4xx - クライアントエラー
これらのコードは、クライアントが問題のあるリクエストを送信したことを示します。エラーはクライアント側にあります。サーバーは正しく動作しています。
| コード | 名前 | 説明 |
|---|---|---|
| 400 | Bad Request | リクエスト構文またはパラメータが無効 |
| 401 | Unauthorized | 認証が必要か、認証に失敗した |
| 402 | Payment Required | 将来の使用のために予約済み、ほとんど実装されていない |
| 403 | Forbidden | クライアントは認証済みだが権限がない |
| 404 | Not Found | 要求されたリソースが存在しない |
| 405 | Method Not Allowed | HTTPメソッドがこのURLでサポートされていない |
| 406 | Not Acceptable | Acceptヘッダーに一致する応答を生成できない |
| 407 | Proxy Authentication | まずプロキシで認証する必要がある |
| 408 | Request Timeout | サーバーがリクエストの待機中にタイムアウト |
| 409 | Conflict | リクエストが現在のサーバー状態と競合 |
| 410 | Gone | リソースは完全に削除され、転送先アドレスなし |
| 411 | Length Required | Content-Lengthヘッダーが必要 |
| 412 | Precondition Failed | 条件付きリクエストヘッダーがfalseと評価された |
| 413 | Payload Too Large | リクエスト本文がサーバー制限を超過 |
| 414 | URI Too Long | URLがサーバーの最大許容長を超過 |
| 415 | Unsupported Media Type | Content-Typeがサーバーでサポートされていない |
| 416 | Range Not Satisfiable | Rangeヘッダーを満たせない |
| 417 | Expectation Failed | Expectヘッダーを満たせない |
| 422 | Unprocessable Entity | リクエスト本文は構文的に正しいが意味的に無効 |
| 423 | Locked | リソースはロックされています(WebDAV) |
| 424 | Failed Dependency | 別のリクエストが失敗したためリクエスト失敗(WebDAV) |
| 426 | Upgrade Required | クライアントは別のプロトコルに切り替えるべき |
| 428 | Precondition Required | オリジンサーバーがリクエストの条件付きを要求 |
| 429 | Too Many Requests | クライアントがレート制限を超過 |
| 431 | Request Header Too Large | ヘッダーが最大サイズを超過 |
| 451 | Unavailable For Legal Reasons | 法的要求によりリソースがブロック |
400 Bad Requestはクライアントエラーのキャッチオールです。不正な構文、無効なクエリパラメータ、不正なリクエスト本文などによりサーバーがリクエストを処理できない場合に使用します。クライアントが問題を修正できるよう、常に応答本文に説明的なエラーメッセージを含めてください。
401 Unauthorizedは、クライアントが有効な認証資格情報を提供していない場合に返されます。応答には、サーバーが期待する認証方式(Basic、Bearer、Digestなど)を示すWWW-Authenticateヘッダーを含めるべきです。
403 Forbiddenは401とは異なり、クライアントは認証済みですが十分な権限を持っていません。例えば、通常のユーザーが管理エンドポイントにアクセスしようとした場合、401ではなく403を返すべきです。
404 Not Foundは最もよく知られているHTTPステータスコードです。サーバーが要求されたリソースを見つけられないことを示します。リソースが存在するが隠されているかどうかを明らかにしないように注意してください。存在しないリソースと forbidden リソースの両方に404を返すことは一般的なセキュリティ慣行です。
409 Conflictは、バージョンの競合がある場合にREST APIに便利です。例えば、PUTリクエストが、クライアントが最後にフェッチしてから別のユーザーによって変更されたリソースを更新しようとする場合です。
429 Too Many RequestsはAPIのレート制限に不可欠です。クライアントが次のリクエストを行うまで待つべき時間を示すRetry-Afterヘッダーを含めるべきです。
5xx - サーバーエラー
これらのコードは、サーバーが有効なリクエストの処理中にエラーが発生したことを示します。問題はサーバー側にあります。
| コード | 名前 | 説明 |
|---|---|---|
| 500 | Internal Server Error | 汎用サーバーエラー、特定の詳細なし |
| 501 | Not Implemented | サーバーが要求された機能をサポートしていない |
| 502 | Bad Gateway | 上流サーバーが無効な応答を返した |
| 503 | Service Unavailable | サーバーが一時的に利用不可(過負荷またはダウン) |
| 504 | Gateway Timeout | 上流サーバーが時間内に応答しなかった |
| 505 | HTTP Version Not Supported | サーバーが使用されたHTTPプロトコルバージョンをサポートしていない |
| 506 | Variant Also Negotiates | コンテンツネゴシエーションのサーバー設定エラー |
| 507 | Insufficient Storage | サーバーが表現を保存できない(WebDAV) |
| 508 | Loop Detected | サーバーが無限ループを検出(WebDAV) |
| 509 | Bandwidth Limit Exceeded | 公式ステータスではない、一部のApacheモジュールで使用 |
| 510 | Not Extended | リクエストにさらなる拡張が必要 |
| 511 | Network Authentication Required | クライアントがネットワークにアクセスするために認証が必要 |
500 Internal Server Errorはサーバー側の障害のキャッチオールです。無効なクライアントリクエストに対して返すべきではありません — それらには4xxコードを使用します。500応答は、サーバーの処理ロジックで何かが間違っていたことを示します。
502 Bad Gatewayは通常、プロキシまたはロードバランサーが上流サーバーから無効な応答を受信したときに発生します。例えば、アプリケーションサーバーがクラッシュしたり不正な応答を返したりすると、リバースプロキシはクライアントに502を返します。
503 Service Unavailableは、サーバーが一時的に過負荷またはメンテナンスのためにダウンしている場合に使用します。クライアントとクローラーがいつ再試行すべきかを知ることができるよう、Retry-Afterヘッダーを含めてください。これはデプロイメントウィンドウやトラフィックスパイク時に一般的に見られます。
504 Gateway Timeoutは、チェーン内の1つのサーバー(例:リバースプロキシがアプリケーションサーバーと通信している)が別のサーバーからタイムリーな応答を受信しない場合に発生します。デフォルトのタイムアウトは通常、インフラストラクチャに応じて30〜120秒です。
ステータスコード使用ガイド
| シナリオ | ステータスコード |
|---|---|
| GETリクエスト成功 | 200 |
| POST成功(作成) | 201 |
| DELETE成功 | 204 |
| フォーム検証失敗 | 422 |
| ユーザーがログインしていない | 401 |
| ユーザーに権限がない | 403 |
| リソースが見つからない | 404 |
| レート制限超過 | 429 |
| サーバークラッシュ | 500 |
| APIエンドポイント未実装 | 501 |
| 一時的なメンテナンス | 503 |
HTTPステータスコード使用のベストプラクティス
状況に最も適した具体的なステータスコードを常に使用してください。503や504の方が適切な場合に汎用的な500エラーを返すと、APIコンシューマーのデバッグが困難になります。応答本文に説明的なエラーメッセージと一意のエラー識別子を含めてデバッグに役立ててください。REST APIの場合は、クライアントがプログラムで処理できる機械可読なエラーコードも含めることを検討してください。最後に、コンテンツネゴシエーションを通じて要求されたコンテンツタイプをエラー応答が尊重することを確認してください。APIクライアントにはJSONを、ブラウザベースのエラーページにはHTMLを返します。
HTTPステータスコードの意味や適切な使用法を思い出す必要がある場合は、HTTPステータスコードリファレンスツールをクイックルックアップに使用してください。