307 Temporary Redirect

HTTPのステータスコード3xxといえば、Redirectionなのですが、
300,301,302,303,304,305,306,307といろいろあります。

302,303,304はよく見かけるのですが
最近、HTTPのステータスコードを見かけて気になったので
307を調べたのでそのときのメモ。

w3c.orgのサイトでは、307はTemporary Redirectionとなっている。
HTTP/1.1 Status Code Definitions - w3.org
これなにかというと、サーバからリダイレクト要求が行われた時に、メソッドと本文が変更されないことが保証されるものです。
たとえばHTTPサーバAに何かしらのデータをPOSTしたときに, HTTPサーバBへのリダイレクト要求(307)を返したとします。それを受け取ったHTTPクライアントは、HTTPサーバAにPOSTしたデータと同じものをHTTPサーバBへPOSTします。

よくあるサイトの1つとして、更新処理をするとトップ画面に遷移する的なものがあり、302が多いのですが、302はリダイレクト先にアクセスする際のメソッドを変更してはならない(GETだったらGET, POSTだったらPOSTでリダイレクト先にリクエストする)ものなのですが、その実装を守っていないクライアントがあって303,307が追加されたようです。

307の挙動を確認

307の挙動を見たいので下記のコードをPHPで作成しました。

このコードを配置したサーバに対してPOSTメソッドでアクセスし307が返却された場合に、POSTメソッドと本文を保持したままリダイレクト先にPOSTメソッドでアクセスします。

リダイレクト元 リダイレクト先

303の挙動を確認

ちなみにPOSTメソッドでアクセスして303が返却されると、リダイレクト先はGETメソッドでアクセスします。

リダイレクト元 リダイレクト先

雑感

307はメソッドと本文を変更することが禁止されているため、リダイレクト元と同様のリクエストをリダイレクト先に送信することができます。
303はリダイレクト元にPOSTでアクセスすると、リダイレクト先ではGETメソッドでアクセスします。
※ ただしHTTPクライアントが実装できてるかどうかは別の話です。

ちなみにcurlで303リダイレクトすると、リダイレクト先も本文つかないけどPOSTメソッドでアクセスしちゃうし、 BurpSuiteのRepeaterだと307はリダイレクト先をGETメソッドでアクセスしちゃう。。。

HTTPクライアント全てが303,307を意図した挙動で動作させるわけでもないみたい。 (実装が悪いのか僕の使い方が悪いのかはわかんないけど)

おしまい。