HTTPステータスコードリファレンス

HTTPステータスコード一覧

1xx 1xx 情報

100
Continue
Server received request headers, client should proceed
101
Switching Protocols
Server is switching protocols as requested
102
Processing
Server is processing the request (WebDAV)
103
Early Hints
Used to return response headers before final response

2xx 2xx 成功

200
OK
Request succeeded
201
Created
Request succeeded, new resource created
202
Accepted
Request accepted for processing
203
Non-Authoritative Information
Metadata from third-party copy
204
No Content
No content to send, headers may be useful
205
Reset Content
Reset the document that sent this request
206
Partial Content
Partial resource due to Range header
207
Multi-Status
Multiple status codes (WebDAV)
208
Already Reported
DAV binding already reported (WebDAV)

3xx 3xx リダイレクト

300
Multiple Choices
Multiple options for the resource
301
Moved Permanently
Resource moved permanently to new URL
302
Found
Resource temporarily moved to different URL
303
See Other
Response found at another URI using GET
304
Not Modified
Resource not modified since last request
307
Temporary Redirect
Temporary redirect, keep HTTP method
308
Permanent Redirect
Permanent redirect, keep HTTP method

4xx 4xx クライアントエラー

400
Bad Request
Server cannot process due to client error
401
Unauthorized
Authentication required
402
Payment Required
Reserved for future use
403
Forbidden
Server refuses to authorize
404
Not Found
Resource not found
405
Method Not Allowed
HTTP method not allowed
406
Not Acceptable
No content conforming to Accept headers
407
Proxy Authentication Required
Proxy authentication needed
408
Request Timeout
Server timed out waiting for request
409
Conflict
Request conflicts with server state
410
Gone
Resource permanently deleted
411
Length Required
Content-Length header required
412
Precondition Failed
Precondition in headers not met
413
Payload Too Large
Request entity too large
414
URI Too Long
URI too long for server
415
Unsupported Media Type
Media format not supported
416
Range Not Satisfiable
Range specified can't be fulfilled
417
Expectation Failed
Expect header cannot be met
418
I'm a teapot
Server refuses to brew coffee with teapot
422
Unprocessable Entity
Request well-formed but has semantic errors
423
Locked
Resource is locked (WebDAV)
424
Failed Dependency
Request failed due to previous request
425
Too Early
Server unwilling to risk early request
426
Upgrade Required
Client should switch protocols
428
Precondition Required
Request must be conditional
429
Too Many Requests
Rate limited, too many requests
431
Request Header Fields Too Large
Headers too large
451
Unavailable For Legal Reasons
Blocked for legal reasons

5xx 5xx サーバーエラー

500
Internal Server Error
Generic server error
501
Not Implemented
Server does not support functionality
502
Bad Gateway
Invalid response from upstream server
503
Service Unavailable
Server not ready, often overloaded
504
Gateway Timeout
Gateway did not get response in time
505
HTTP Version Not Supported
HTTP version not supported
506
Variant Also Negotiates
Content negotiation error
507
Insufficient Storage
Server unable to store (WebDAV)
508
Loop Detected
Infinite loop detected (WebDAV)
510
Not Extended
Further extensions required
511
Network Authentication Required
Network authentication needed

ステータスコードは飾りではなくプロトコルの契約

HTTP ステータスコードは機械が読む制御フローであり、インターネットの半分がそこで分岐します。ブラウザはリダイレクトを追うかエラーページを出すかを決め、キャッシュと CDN はレスポンスを保存するかを決め、検索クローラは URL をインデックスに残すか消すかを決め、HTTP クライアントライブラリは再試行するかを決め、監視システムは誰かを呼び出すかを決めます。JSON ボディにエラーメッセージを入れて 200 を返す — 最もよくあるステータスコードのアンチパターン — は、それらすべてを一度に打ち負かします。エラーはキャッシュされ、クローラはそれをインデックスし、クライアントライブラリは成功を報告し、障害の最中もエラー率のダッシュボードは緑のままです。 権威ある定義は RFC 9110 "HTTP Semantics"(2022)にあります。旧来の RFC 7231 一族を統合・置換したものです。最初の桁が契約を担います。1xx は情報、2xx は成功、3xx はリダイレクト、4xx はクライアントの誤り、5xx はサーバーの誤り。この分類が重要なのは、仕様に明示的なルールがあるからです: 認識できないコードを受け取ったクライアントは、そのクラスの x00 として扱わなければならない。429 を知らないクライアントは汎用の 400 として処理し、未知の 599 は 500 として扱われます。これこそが、新しいコードが配備済みのソフトウェアを壊さずに生態系へ入れる仕組みであり — 間違ったクラスに私製コードを発明すること(たとえば「成功」を 470 で報告)が、あなたの制御できない中間装置を壊す理由でもあります。4xx/5xx の境界は責任の割り当てでもあります — 誰が呼び出されるかを決めるのです。

リダイレクトを正しく — 301・302・303・307・308

リダイレクトコードが 5 つあるのは、仕様とブラウザの間の 20 年来の不和のせいです。HTTP/1.0 は 301 と 302 をメソッド保存として定義しました。302 でリダイレクトされた POST は、新しい場所へ再 POST されるべきだったのです。ブラウザはこれを無視してメソッドを GET に書き換え、その挙動は広まりすぎて直せませんでした。HTTP/1.1 は争う代わりに現実を成文化しました。「あちらのリソースを GET しに行け」を意味する 303 See Other が作られ(リロード時のフォーム再送信を防ぐ POST-redirect-GET パターンの背骨)、307 Temporary Redirect が本来の厳密な意味 — 同じメソッド、同じボディ、保証付き — を復元し、RFC 7538 が 2015 年に 301 のメソッド保存版の双子である 308 Permanent Redirect でマス目を完成させました。 メンタルモデルは 2x2 の行列です。恒久か一時か、メソッド変更許容かメソッド保存必須かの掛け合わせ。301 と 302 はレガシーの隅(メソッドが GET に変わりうる)、308 と 307 は厳密な隅です。POST・PUT・DELETE を受ける API エンドポイントでは、この区別は飾りではありません — アップロードを 301 でリダイレクトすると、多くのクライアントでボディなしの GET へ静かに変換され、リクエストデータは蒸発します。 恒久性には牙があります。ブラウザは 301 と 308 を積極的に、しばしば無期限にキャッシュします。誤った恒久リダイレクトは、サーバーが送信をやめた後もローカルキャッシュから発火し続けます — ユーザーには、あなたが遠隔で起こせないキャッシュ削除が必要になります。定石はこうです: 危険なリダイレクトはまず 302/307 で配備し、様子を見てから 301/308 へ昇格させる。検索エンジンは 301/308 を「ランキングシグナルを新 URL へ移転」と扱うため、ドメイン移行や HTTPS 化の正解であり、理想的には数か月維持します。
                 method may → GET   method preserved
permanent        301 Moved           308 Permanent Redirect
temporary        302 Found           307 Temporary Redirect
after POST       303 See Other  →  always GET (PRG pattern)

# Verify what a redirect really does:
curl -si -X POST https://example.com/old | head -3
HTTP/1.1 301 Moved Permanently
Location: https://example.com/new
# many clients will now GET /new — the POST body is gone

401 対 403 対 404 — 認証・認可・隠蔽

名前が意味を裏切っています。401 のラベルは "Unauthorized" ですが、実際の意味は未認証です — サーバーはあなたが誰か知らないのです。RFC 9110 はこの意図を構造で表します。401 レスポンスは、どの認証方式を使うべきかをクライアントに伝える WWW-Authenticate ヘッダーを必ず伴わなければなりません。401 は行き止まりではなく、資格情報を添えて再挑戦せよという招待だからです。ブラウザが Basic チャレンジ付きの 401 にログインダイアログで応じるのはそのためで、よくできた API クライアントが 401 を、期限切れアクセストークンの更新と 1 回だけのリクエスト再送のトリガーとして扱うのもそのためです。 403 Forbidden は逆の状況です。認証は成功し、身元も判明していて、それでも答えはノーです。トークンは有効だがスコープが足りない。ユーザーは実在するが管理者ではない。リソースは存在するが他人のものです。運用上の決定的な違いは、同じ資格情報で 403 を再試行しても無意味だということです — 403 で発火するトークン更新ループは、認証サーバーを無駄に叩くバグです。 仕様が明示的に認める第三の選択肢があります。嘘です。あるリソースへの 403 はそのリソースの存在を裏付けますが、存在こそが秘密のこともあります — プライベートリポジトリの名前、ユーザーアカウントの有無、内部の管理パス。RFC 9110 は、リソースを隠したいサーバーが 403 の代わりに 404 を返すことを許しており、GitHub が閲覧権限のないプライベートリポジトリにまさにこれを行うのは有名です。代償はデバッグ性です(権限が欠けた正当なユーザーが、困惑する「not found」を見ることになります)。だからこの選択はセキュリティ対サポート性の本物のトレードオフであり、意図的に決めるのが最善です。

リトライとレート制限 — 429・503・Retry-After

429 Too Many Requests(コア仕様ではなく RFC 6585 で定義)は、プロトコルのバックプレッシャー弁です。リクエストは理解された、ただクライアントが速く送りすぎているだけ。行儀のよい 429 は Retry-After ヘッダーを伴います。形式は 2 つ — デルタ秒(Retry-After: 30)か絶対時刻の HTTP-date — で、クライアントは自分の勝手なスケジュールで再試行するのではなく、これを尊重すべきです。実際の API の多くはクォータのテレメトリヘッダー(X-RateLimit-Limit / Remaining / Reset の一族。RateLimit フィールドとして標準化が進行中)を添えて、クライアントが壁にぶつかった後ではなく、ぶつかる前に自らペースを整えられるようにしています。 そもそも再試行すべきかは 3 つの問いで決まります。この失敗は再試行可能か? 5xx は概ねイエス、4xx は概ねノー — リクエスト自体が欠陥だからで、例外は 408、429、そして(慎重にであれば)425。このメソッドは繰り返しても安全か? GET・PUT・DELETE は冪等と定義されています。送信途中でタイムアウトした POST は見えないところで成功していたかもしれず、盲目的な POST 再試行は二重課金の危険があります — 決済 API が冪等性キーを追加する理由です。再試行の間隔は? ジッター付きの指数バックオフです。同じ固定スケジュールで再試行するクライアントの群れは波として再同期し、回復途上のサーバーを再び押し潰します。 インシデント対応では、5xx の三兄弟がトリアージの地図になります。502 Bad Gateway: プロキシはアップストリームに到達したがゴミが返ってきた — アプリのプロセスを見る(クラッシュ、OOM)。503 Service Unavailable: 意図的な拒否 — 過負荷、メンテナンス、ヘルスチェック失敗。Retry-After を含むことがあります。504 Gateway Timeout: アップストリームが時間内に応答しなかった — 遅いクエリ、デッドロック、枯渇したコネクションプールを見る。
HTTP/1.1 429 Too Many Requests
Retry-After: 30
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1751414460

Retry decision cheat sheet:
408, 429, 5xx  → retry with exponential backoff + jitter
other 4xx      → do not retry; fix the request
POST           → only retry with an idempotency key

backoff: 1s → 2s → 4s → 8s (+ random jitter each step)

ステータスコードとキャッシュ — 304・ETag・既定でキャッシュ可能なリスト

304 Not Modified は、存在意義のすべてが帯域の節約にある唯一のステータスコードです。流れは条件付き再検証です。サーバーはレスポンスに検証子(validator)— ETag(不透明なバージョン識別子)か Last-Modified の日時 — を付け、キャッシュされたコピーが期限切れになると、クライアントは If-None-Match または If-Modified-Since を添えて再び尋ねます。リソースが変わっていなければ、サーバーはボディなしの 304 で答え、キャッシュは手元のコピーを再び新鮮なものとしてマークし、ペイロードはワイヤを渡りません。ETag には 2 つの強度があります — 弱い検証子(W/ 接頭辞)は意味的な等価性を、強い検証子はバイト単位の同一性を約束し、Range リクエストには後者が必須です — そして古典的な落とし穴: ファイルの inode メタデータから導出される既定の ETag は、ロードバランサーの背後のサーバーごとに異なり、再検証を静かに壊します。 あまり知られていない、より危険な事実: 一部のステータスコードは既定でキャッシュ可能です。RFC 9110 は 200、203、204、206、300、301、308、404、405、410、414、501 をヒューリスティックにキャッシュ可能と定めています — Cache-Control ヘッダーがまったくなくても、キャッシュは Last-Modified からの経過時間の 10 分の 1 といったヒューリスティックで鮮度を推測して保存してよいのです。そう、404 もリストに入っています。本番の障害モード: デプロイが終わる前にリクエストが到着し、CDN が 404 をキャッシュし、ファイルが存在するようになった後も 404 が出続ける — 誰かがパージするまで。一方、302 と 307 はヒューリスティックなキャッシュの対象外です。一時リダイレクトが安全な実験で、恒久リダイレクトが誓約である正確な理由です。 教訓は、既定値に頼らないこと。エラーを含むすべてのレスポンスに明示的な Cache-Control を送りましょう — 404 には 60 秒の TTL、5xx には no-store といった設定が、ミスを短命にしてくれます。
# First request — server tags the response
HTTP/1.1 200 OK
ETag: "v42-a1b2c3"
Cache-Control: max-age=3600

# One hour later — conditional revalidation
GET /app.js HTTP/1.1
If-None-Match: "v42-a1b2c3"

HTTP/1.1 304 Not Modified        ← no body: bytes saved
ETag: "v42-a1b2c3"

# Cacheable WITHOUT any Cache-Control header (RFC 9110):
# 200 203 204 206 300 301 308 404 405 410 414 501
最終更新:

ツールについて

HTTP ステータスコードの検索可能なリファレンス。1xx〜5xx を分類別に表示し、正式名と簡単な説明付きで「422 とは?」「401 と 403 のどちら?」を即座に確認できます。

使い方

  1. Type a code (404), partial name (gateway), or keyword (auth) into the search box.
  2. Browse the filtered list grouped by status class.
  3. Read the canonical name and one-line description for the matching codes.
  4. Use the colour coding to quickly spot 4xx (client error) vs 5xx (server error).
  5. Reference the result in your API design, log analysis, or error handling code.

主な使用例

  • Choosing the right status code for a new REST API endpoint.
  • Investigating a strange status code (e.g., 418, 451) you saw in a server log.
  • Deciding between 401 Unauthorized and 403 Forbidden for an auth flow.
  • Documenting expected error responses in an OpenAPI / Swagger spec.
  • Understanding why a CDN returned 503 vs 504 during an outage.
  • Mapping HTTP errors to user-facing error messages with consistent semantics.

よくある質問

Q. When should I return 401 vs 403?

A. 401 means "not authenticated, present credentials"; 403 means "authenticated but not allowed". If the client has no valid session, send 401. If they are logged in but lack permission, send 403.

Q. Is 422 the same as 400?

A. Both are 4xx, but 400 means the request itself is malformed (bad JSON, missing header) while 422 means the request is well-formed but semantically invalid (validation failed).

Q. Should I always use 200 for successful POSTs?

A. 201 Created is more precise when you create a new resource and 204 No Content when you succeed but return no body. 200 is correct when you do return a representation.

Q. What does 429 mean for rate limiting?

A. 429 Too Many Requests signals the client should slow down. Pair it with a Retry-After header so clients know when to try again.