web-dev-qa-db-ja.com

302リダイレクトと307リダイレクトの違いは何ですか?

302 FOUND307 TEMPORARY REDIRECT HTTPレスポンスの違いは何ですか?

W3仕様 は、両方が一時的なリダイレクトに使用されていることを示しているようで、応答で特に許可されない限り、どちらもキャッシュできません。

186
Zach Hirsch

違いは、POSTPUT、およびDELETEリクエストのリダイレクトと、ユーザーエージェントの動作に対するサーバーの期待値に関するものです( RFC 2616 ):

注:RFC 1945およびRFC 2068は、クライアントがリダイレクトされた要求のメソッドを変更することを許可しないことを指定しています。ただし、ほとんどの既存のユーザーエージェント実装は、302を303応答であるかのように処理し、元の要求メソッドに関係なくLocationフィールド値でGETを実行します。ステータスコード303および307は、クライアントにどのような反応が期待されるかを明確にしたいサーバーに追加されました。

また、 xリダイレクトコード に関するWikipediaの記事を読んでください。

89
Franci Penov

307は、ユーザーエージェントが302応答を受信して​​GETリクエストを送信するPOSTリクエストを取得するde facto動作として採用されたために登場しましたLocation応答ヘッダーへ。

それは不正動作—only303はPOSTをGETに変換するはずです。ユーザーエージェントは、元のPOSTリクエストが302を返した場合、新しいURLをリクエストするときにPOSTメソッドに固執する必要があります(固執しないでください)。

307は、サーバーがユーザーエージェントに対して、Location応答ヘッダーを追跡するときにクライアントがメソッドの変更notを行う必要があることを明確にするために導入されました。

147
Christopher Orr

307 Internal Redirectアクションの良い例は、Google ChromeがStrict Transport Securityを必要とすることがわかっているドメインへのHTTP呼び出しに遭遇したときです。

ブラウザは、元の呼び出しと同じメソッドを使用してシームレスにリダイレクトします。

HTST 307 Internal Redirect

56

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
7
Roy Hyunjin Han

Flowchart

  • 301:永久リダイレクト:URLは古いため、置き換える必要があります。ブラウザはこれをキャッシュします。
    使用例:URLを/register-form.htmlからsignup-form.htmlに移動しました。
    RFC 7231に従って、メソッドはGETに変更されます。「歴史的な理由により、ユーザーエージェントは、後続のリクエストのリクエストメソッドをPOSTからGETに変更する場合があります。」
  • 302:一時的なリダイレクト。 HTTP/1.0クライアントにのみ使用します。このステータスコードはメソッドを変更するべきではありませんが、ブラウザはとにかくそれを行いました。 RFCでは、「HTTP/1.1以前の多くのユーザーエージェントは理解していません[303]。このようなクライアントとの相互運用性が懸念される場合、代わりに302ステータスコードを使用できます。 303。」もちろん、一部のクライアントは仕様に従ってそれを実装するかもしれないので、そのような古代のクライアントとの相互運用性が本当の懸念でないならば、303は一貫した結果のためにより良いです。
  • 303:一時リダイレクト、メソッドをGETに変更
    使用例:ブラウザーがPOSTを/register.phpに送信した場合、次に(GET)/success.htmlをロード(GET)します。
  • 307:一時的なリダイレクト、リクエストを同一に繰り返します。
    使用例:ブラウザがPOSTを/register.phpに送信した場合、これはPOST at /signup.php
  • 308:永続的なリダイレクト、リクエストを同様に繰り返します。307は303の「メソッド変更なし」に相当し、この308ステータスは「メソッド変更なし」です。 「301に相当します。

RFC 7231(2014年から) は非常に読みやすく、過度に冗長ではありません。正確な答えを知りたい場合は、お読みください。他のいくつかの回答では、1999年からRFC 2616を使用していますが、何も変わっていません。

RFC 7238 は、308ステータスを指定します。これは実験的なものと見なされていますが、2016年にはすでに すべての主要なブラウザーでサポートされています でした。

5
Luc

また、サーバー管理者にとって、307リダイレクトを使用すると、ブラウザーがユーザーにプロンプ​​トを表示する場合があることに注意することが重要です。

たとえば、FirefoxとOperaはユーザーにリダイレクトの許可を求めますが、Chrome、IEおよびSafariは透過的にリダイレクトを行います。

* per Bulletproof SSL and TLS (192ページ)。

1
Pacerier

いくつかの使用例では、攻撃者が307リダイレクトを悪用して被害者の資格情報を学習する場合があります。

詳細情報は、セクション3.1OAuth 2.0の包括的な形式的セキュリティ分析 にあります。

上記の論文の著者は次のことを提案しています。

修正。OAuth標準の現在の文言に反して、リダイレクトの正確な方法は実装の詳細ではなく、 OAuthのセキュリティ。 HTTP標準( RFC 7231 )では、303リダイレクトのみが明確に定義され、HTTP POSTリクエストの本文が削除されます。最も一般的に使用される302を含む他のすべてのHTTPリダイレクトステータスコードは、POSTリクエストとフォームデータを保持するオプションをブラウザに残します。実際には、ブラウザは通常、GETリクエストに書き換えて、307リダイレクトを除き、フォームデータをドロップします。したがって、OAuth規格では、この問題を解決するために、上記の手順で303リダイレクトが必要です。

1
M.S. Dousti