302 FOUND
と307 TEMPORARY REDIRECT
HTTPレスポンスの違いは何ですか?
W3仕様 は、両方が一時的なリダイレクトに使用されていることを示しているようで、応答で特に許可されない限り、どちらもキャッシュできません。
違いは、POST
、PUT
、およびDELETE
リクエストのリダイレクトと、ユーザーエージェントの動作に対するサーバーの期待値に関するものです( RFC 2616
):
注:RFC 1945およびRFC 2068は、クライアントがリダイレクトされた要求のメソッドを変更することを許可しないことを指定しています。ただし、ほとんどの既存のユーザーエージェント実装は、302を303応答であるかのように処理し、元の要求メソッドに関係なくLocationフィールド値でGETを実行します。ステータスコード303および307は、クライアントにどのような反応が期待されるかを明確にしたいサーバーに追加されました。
また、 xリダイレクトコード に関するWikipediaの記事を読んでください。
307は、ユーザーエージェントが302応答を受信してGETリクエストを送信するPOSTリクエストを取得するde facto動作として採用されたために登場しましたLocation応答ヘッダーへ。
それは不正動作—only303はPOSTをGETに変換するはずです。ユーザーエージェントは、元のPOSTリクエストが302を返した場合、新しいURLをリクエストするときにPOSTメソッドに固執する必要があります(固執しないでください)。
307は、サーバーがユーザーエージェントに対して、Location応答ヘッダーを追跡するときにクライアントがメソッドの変更notを行う必要があることを明確にするために導入されました。
307 Internal Redirect
アクションの良い例は、Google ChromeがStrict Transport Securityを必要とすることがわかっているドメインへのHTTP呼び出しに遭遇したときです。
ブラウザは、元の呼び出しと同じメソッドを使用してシームレスにリダイレクトします。
302の期待:リダイレクトは、NEW_URLで同じリクエストメソッドPOSTを使用します
CLIENT POST OLD_URL -> SERVER 302 NEW_URL -> CLIENT POST NEW_URL
302、303の実際:変更要求メソッドをPOSTからNEW_URLのGETにリダイレクトします
CLIENT POST OLD_URL -> SERVER 302 NEW_URL -> CLIENT GET NEW_URL (redirect uses GET)
CLIENT POST OLD_URL -> SERVER 303 NEW_URL -> CLIENT GET NEW_URL (redirect uses GET)
307の実際:リダイレクトは、NEW_URLで同じ要求メソッドPOSTを使用します
CLIENT POST OLD_URL -> SERVER 307 NEW_URL -> CLIENT POST NEW_URL
/register-form.html
からsignup-form.html
に移動しました。/register.php
に送信した場合、次に(GET)/success.html
をロード(GET)します。/register.php
に送信した場合、これはPOST at /signup.php
。RFC 7231(2014年から) は非常に読みやすく、過度に冗長ではありません。正確な答えを知りたい場合は、お読みください。他のいくつかの回答では、1999年からRFC 2616を使用していますが、何も変わっていません。
RFC 7238 は、308ステータスを指定します。これは実験的なものと見なされていますが、2016年にはすでに すべての主要なブラウザーでサポートされています でした。
また、サーバー管理者にとって、307リダイレクトを使用すると、ブラウザーがユーザーにプロンプトを表示する場合があることに注意することが重要です。
たとえば、FirefoxとOperaはユーザーにリダイレクトの許可を求めますが、Chrome、IEおよびSafariは透過的にリダイレクトを行います。
* per Bulletproof SSL and TLS (192ページ)。
いくつかの使用例では、攻撃者が307リダイレクトを悪用して被害者の資格情報を学習する場合があります。
詳細情報は、セクション3.1の OAuth 2.0の包括的な形式的セキュリティ分析 にあります。
上記の論文の著者は次のことを提案しています。
修正。OAuth標準の現在の文言に反して、リダイレクトの正確な方法は実装の詳細ではなく、 OAuthのセキュリティ。 HTTP標準( RFC 7231 )では、303リダイレクトのみが明確に定義され、HTTP POSTリクエストの本文が削除されます。最も一般的に使用される302を含む他のすべてのHTTPリダイレクトステータスコードは、POSTリクエストとフォームデータを保持するオプションをブラウザに残します。実際には、ブラウザは通常、GETリクエストに書き換えて、307リダイレクトを除き、フォームデータをドロップします。したがって、OAuth規格では、この問題を解決するために、上記の手順で303リダイレクトが必要です。