HTTP レスポンスコードを自分なりに整理してみる

REST API ベースで整理するので、使わないものについては省略

200番台
200 OK
サーバーがレスポンスの生成に成功した場合に返却する。
200番台で適切なレスポンスコードがなければ、これを使用する。後述の204が明示的にボディが存在しないことを示すため、こちらをレスポンスとして使用する場合は、レスポンスボディが存在するものとして扱わせたほうが良い。
201 Created
サーバーがリソースの作成に成功した場合に返却する。
APIにおいては、POSTにてリソースの新規作成をリクエストされ、これが成功した際に返却するレスポンスコードとなる。
204 No Content
成功したが、サーバーから返却するコンテンツ(ボディ)がない。
特定リソースに対して、削除(DELETE)リクエストを行いこれが成功した特に返却する場合がある。あくまで、リクエストに対して返却するものがないことを示すため、削除状況に関する情報を返却するのであれば、200 を返すべき。
特にDELETEリクエストの場合、以下の関数に近いレスポンスを行うのであれば204を返却すべきである。
function delete(resourceId: string): void { /* 処理 */ }
以下の関数に近いレスポンスとするのであれば、200を返却するべきである。
function delete(resourceId: string): boolean { /* 処理 */ }

300番台(リダイレクト)
リダイレクトについては、ブラウザのリダイレクト処理が走る場合があり、予期せぬバグになるため実装は避けたほうが良い。
304 Not Modified
リソースが変わっていないなどの理由により、レスポンスデータを再送する必要がない場合に使用する。レスポンスボディは含まなくなる。前提として、 If-Modified-Since ヘッダーや、If-None-Match ヘッダーをリクエストに含める必要がある。
ブラウザのキャッシュを活用して、サーバーから送信するデータを少なくすることができるため、可能な限り実装すべき返答である。

400番台(クライアントエラー)
クライアントからのリクエストを原因として、200番台のコードを返せない場合に使用する。
400 Bad Request
クライアントのリクエストに問題がある場合に使用するレスポンスコード。特に、400番台のほかのコードに適切なものがない場合に使用する。(逆に適切なものがあればそちらを使用すべきである。)
一般的には、必須となるリクエストボディや、リクエストのパース時のエラーに使用する。
401 Unauthorized
認証に問題がある場合に使用するレスポンスコード。具体的な事例としては、認証ヘッダーがない、認証メゾットが不正、トークン切れなどが想定される。
402 Payment Required
支払いが必要な場合に使用することができるコード。後述の 403 の詳細内容として使用できる。
コンテンツの存在自体は認めることになるため、存在を認めたうえで有料コンテンツであることを明示する場合にのみ使用できる。
ブラウザでの動作が保証されていないため、ブラウザへのWEBページの返答には使用すべきではない。
403 Forbidden
サーバーがリクエストを正常に理解したが、そのレスポンスを送信することを拒否した場合に使用する。
認証失敗時に 401 、認証通過後にアクセス不可、操作不可などの場合に 403 を返却することが多いが、あくまで拒否レスポンスのため、認証の問題であることに限らない。
認証の場合に限っては、403 を返すこと自体がリソースの存在を認めることとなる。これは、攻撃者に対する情報となる場合もあるので、セキュリティー面から確認する必要がある。筆者の推奨は、無権限は 404 を返し、一部権限不足は 403 を返すのが適切と考える。
しかしながら、UUID の採用などリソースIDを予測できない環境においては、403 でも問題が生じにくいため、一律に 403 に問題があるわけではない。(アクセス権を要求できる環境においては、 403 を返却することはより良い選択肢となりうる。)
404 Not Found
リソースが見つからなかった場合に返却する。
セキュリティ面から、リソースは存在するがリクエストユーザーが全く権限を持たない場合は、404 を返すことも検討すべきである。
406 Not Acceptable
リクエストで要求する条件と、レスポンスで返却できる条件を満たせない場合に使用する。(コンテンツネゴシエーションに失敗した場合)
Web APIとしては、サーバーは json のボディを必要とする場合にリクエストが xml であった場合などに使用することとなる。