💬

HTTPステータスコード302と307の違い

2024/11/02に公開

疑問

HTTPステータスコードの3xx系はリダイレクトを表すが、いまいちどういう違いなのか分からない

経緯

AWSの公式トップページ(https://aws.amazon.com/jp/) にアクセスしてみました。
開発者ツールのネットワークタブを確認すると、200 OKが返ります。

次に、https://aws.amazon.com のように末尾の/jpを取ったかたちでアクセスしてみます。
すると、今度は302 Foundが返り、先ほどの/jpのサイトにリダイレクトされました。
おそらくですが、リクエスト元のIPアドレスやブラウザの言語設定などから判断して適切な地域・言語のサイトにリダイレクトしているのだと思われます(こちらご存じの方がいらっしゃったら教えていただきたいです)

最後に、http://aws.amazon.com のように、httpsではなくhttpでアクセスしてみました。
すると今度はhttpsのサイトにリダイレクトされましたが、返ってきたステータスコードは302 Foundではなく307 Internal Redirectでした。

なぜこのような違いがあるのか気になったので調べました。

3xx系ステータスコード一覧

まずは、3xx系のステータスコード一覧を見てみましょう。

ステータスコード 名前 説明
300 Multiple Choices リクエストに対する複数の選択肢が存在する。クライアントが選択する必要がある。
301 Moved Permanently リクエストしたリソースが恒久的に別のURLに移動した。検索エンジンはリダイレクト先を記憶する。
302 Found リクエストしたリソースが一時的に別のURLに移動している。HTTP/1.0では一時的リダイレクトを示す。
303 See Other リクエストしたリソースが別のURLにあることを示し、GETメソッドでリダイレクトを行う。
304 Not Modified キャッシュされたリソースが更新されていないため、クライアントはキャッシュを利用すべきである。
305 Use Proxy リクエストしたリソースにアクセスするためにはプロキシを使用する必要がある。
306 (Unused) 現在は使用されていない。将来の利用のために予約されている。
307 Temporary Redirect リクエストしたリソースが一時的に別のURLに移動している。HTTPメソッドを保持する。
308 Permanent Redirect リクエストしたリソースが恒久的に別のURLに移動している。HTTPメソッドを保持したままリダイレクト。

Chromeでは307 Internal Redirectとなっていましたが、調べると正式な名前は307 Temporary Redirectのようでした(理由は不明)

302と307の違い

上記表の説明のように、302、307はどちらも一時なリダイレクトを表します。
調べたところ、違いは「307の方はHTTPメソッドを保持する」ということのみのようです。

なぜこのような差分を持つ2つのステータスコードが生まれたのでしょうか。

もともと302 Foundは、HTTP/1.0の時代から存在するコードで、一時的なリダイレクトを示すために使用されていました。しかし、HTTP/1.0での仕様は曖昧だったため、一部のクライアントが302を受け取った際、POSTリクエストをGETリクエストに変換してしまうなど、不正確な動作が発生しました。

そこで、HTTP/1.1が登場した際に、上記の解決するために新しいステータスコード307 Temporary Redirectが導入されたようです。

なぜ302と307が混在しているのか

しかし、結局AWSの公式トップページでなぜ2つのステータスコードが混在しているのかは不明でした。

リダイレクトが設定された時期が違うのではないかと思いましたが、AWSが2006年から存在するサービスなのに対して、HTTP/1.1は1997年には既にRFC2068として公開されています。

理由をご存じの方がいらっしゃったらぜひ教えていただきたいです。

Discussion