ログインページにリダイレクトするときの正しいHTTPステータスコードは何ですか?


133

ユーザーがログインしておらず、ログインが必要なページにアクセスしようとすると、ログインページにリダイレクトするための正しいHTTPステータスコードは何ですか。

W3Cによって設定された3xx応答コードの いずれも要件に適合していないように思われるので、私は尋ねています。

10.3.1 300複数の選択肢

要求されたリソースは表現のセットのいずれか1つに対応し、それぞれに固有の場所があり、ユーザー(またはユーザーエージェント)が優先表現を選択してリダイレクトできるように、エージェント駆動の交渉情報(セクション12)が提供されていますその場所へのリクエスト。

HEADリクエストでない限り、レスポンスには、ユーザーまたはユーザーエージェントが最も適切なものを選択できるリソースの特性と場所のリストを含むエンティティが含まれる必要があります(SHOULD)。エンティティの形式は、Content- Typeヘッダーフィールドで指定されたメディアタイプによって指定されます。形式と機能に応じて

ユーザーエージェントでは、最も適切な選択肢の選択が自動的に実行される場合があります。ただし、この仕様では、このような自動選択の標準を定義していません。

サーバーが適切な表現の選択肢を持っている場合、その表現の特定のURIをLocationフィールドに含める必要があります。ユーザーエージェントは、自動リダイレクトにLocationフィールドの値を使用できます。特に指定のない限り、この応答はキャッシュ可能です。

10.3.2 301を永続的に移動

リクエストされたリソースには新しい永続的なURIが割り当てられており、このリソースへの今後の参照では、返されたURIの1つを使用する必要があります。リンク編集機能を持つクライアントは、Request-URIへの参照を、可能であればサーバーから返される1つ以上の新しい参照に自動的に再リンクする必要があります。特に指定のない限り、この応答はキャッシュ可能です。

新しい永続URIは、応答のLocationフィールドで指定する必要があります(SHOULD)。リクエストメソッドがHEADでない限り、レスポンスのエンティティには、新しいURIへのハイパーリンクを含む短いハイパーテキストノートを含める必要があります(SHOULD)。

GETまたはHEAD以外のリクエストに応答して301ステータスコードを受信した場合、ユーザーエージェントは、ユーザーが確認できない限り、リクエストを自動的にリダイレクトしてはなりません。これにより、リクエストが発行された条件が変わる可能性があります。

  Note: When automatically redirecting a POST request after
  receiving a 301 status code, some existing HTTP/1.0 user agents
  will erroneously change it into a GET request.

10.3.3 302が見つかりました

リクエストされたリソースは一時的に別のURIに存在します。リダイレクトは時々変更される可能性があるため、クライアントは今後のリクエストに引き続きRequest-URIを使用する必要があります(SHOULD)。この応答は、Cache-ControlまたはExpiresヘッダーフィールドで示されている場合にのみキャッシュ可能です。

一時URIは、応答のLocationフィールドで指定する必要があります(SHOULD)。リクエストメソッドがHEADでない限り、レスポンスのエンティティには、新しいURIへのハイパーリンクを含む短いハイパーテキストノートを含める必要があります(SHOULD)。

GETまたはHEAD以外のリクエストに応答して302ステータスコードを受信した場合、ユーザーエージェントは、ユーザーが確認できない限り、リクエストを自動的にリダイレクトしてはなりません。これにより、リクエストが発行された条件が変わる可能性があります。

  Note: RFC 1945 and RFC 2068 specify that the client is not allowed
  to change the method on the redirected request.  However, most
  existing user agent implementations treat 302 as if it

303レスポンスで、元のリクエストメソッドに関係なく、Locationフィールドの値に対してGETを実行しました。ステータスコード303および307は、どのような反応がクライアントに期待されるかを明確にしたいサーバー用に追加されました。

10.3.4 303他を参照

リクエストへの応答は別のURIで見つけることができ、そのリソースでGETメソッドを使用して取得する必要があります。このメソッドは主に、POSTでアクティブ化されたスクリプトの出力がユーザーエージェントを選択したリソースにリダイレクトできるようにするために存在します。新しいURIは、最初に要求されたリソースの代替参照ではありません。303応答はキャッシュしてはなりません(MUST NOT)が、2番目の(リダイレクトされた)要求への応答はキャッシュ可能である可能性があります。

異なるURIは、応答のLocationフィールドで指定する必要があります(SHOULD)。リクエストメソッドがHEADでない限り、レスポンスのエンティティには、新しいURIへのハイパーリンクを含む短いハイパーテキストノートを含める必要があります(SHOULD)。

  Note: Many pre-HTTP/1.1 user agents do not understand the 303
  status. When interoperability with such clients is a concern, the
  302 status code may be used instead, since most user agents react
  to a 302 response as described here for 303.

10.3.5 304未変更

クライアントが条件付きGETリクエストを実行し、アクセスは許可されているが、ドキュメントが変更されていない場合、サーバーはこのステータスコードで応答する必要があります(SHOULD)。304応答にはメッセージ本文を含めてはならないため、常にヘッダーフィールドの後の最初の空行で終了します。

応答には、次のヘッダーフィールドを含める必要があります。

  - Date, unless its omission is required by section 14.18.1 If a

クロックレスオリジンサーバーはこれらのルールに従い、プロキシとクライアントは応答なしで受信した応答に独自の日付を追加します([RFC 2068]、セクション14.19で既に指定されているように)。キャッシュは正しく動作します。

  - ETag and/or Content-Location, if the header would have been sent
    in a 200 response to the same request
  - Expires, Cache-Control, and/or Vary, if the field-value might
    differ from that sent in any previous response for the same
    variant If the conditional GET used a strong cache validator (see

セクション13.3.3)、応答には他のエンティティヘッダーを含めないでください。それ以外の場合(つまり、条件付きGETが弱いバリデーターを使用した場合)、応答に他のエンティティヘッダーを含めてはなりません(MUST NOT)。これにより、キャッシュされたエンティティ本体と更新されたヘッダーの間の不整合が防止されます。

304応答が、現在キャッシュされていないエンティティを示している場合、キャッシュは応答を無視し、条件なしで要求を繰り返す必要があります。

キャッシュが受信した304応答を使用してキャッシュエントリを更新する場合、キャッシュはエントリを更新して、応答で指定された新しいフィールド値を反映する必要があります。

10.3.6 305プロキシの使用

要求されたリソースは、Locationフィールドで指定されたプロキシを介してアクセスする必要があります。LocationフィールドはプロキシのURIを示します。受信者は、プロキシ経由でこの単一のリクエストを繰り返すことが期待されています。305応答は、オリジンサーバーによってのみ生成される必要があります。

  Note: RFC 2068 was not clear that 305 was intended to redirect a
  single request, and to be generated by origin servers only.  Not
  observing these limitations has significant security consequences.

10.3.7 306(未使用)

306ステータスコードは、以前のバージョンの仕様で使用されていたもので、現在は使用されていません。コードは予約されています。

10.3.8 307一時的なリダイレクト

リクエストされたリソースは一時的に別のURIに存在します。リダイレクションは時々変更される可能性があるため、クライアントは今後のリクエストに引き続きRequest-URIを使用する必要があります(SHOULD)。この応答は、Cache-ControlまたはExpiresヘッダーフィールドで示されている場合にのみキャッシュ可能です。

一時URIは、応答のLocationフィールドで指定する必要があります(SHOULD)。リクエストメソッドがHEADでない限り、多くのHTTP / 1.1以前のユーザーエージェントは307ステータスを理解しないため、レスポンスのエンティティには新しいURIへのハイパーリンクを含む短いハイパーテキストノートを含める必要があります(SHOULD)。したがって、メモには、ユーザーが新しいURIで元の要求を繰り返すために必要な情報が含まれている必要があります(SHOULD)。

GETまたはHEAD以外のリクエストへの応答として307ステータスコードを受信した場合、ユーザーエージェントは、ユーザーが確認できない限り、リクエストを自動的にリダイレクトしてはなりません。これは、リクエストが発行された条件を変更する可能性があるためです。

正しい答えが見つかるまで、今のところ302を使用しています。

更新と結論:

HTTP 302は、クライアント/ブラウザとの互換性が最も高いことが知られているため、より優れています。


1
私は絶対に本の方法で、リダイレクトなしで401とログインページを返すことになると思いますが、私はあなたのオプションが何であるかわかりません。
Nick Craver

1
@Nickの良い点ですが、クラシックなログインシステムを構築している場合は、その副作用を恐れます。
Pekka

1
@Pekka-完全に同意します。これは、どのプラットフォームでクリーンに処理できるか、どのプラットフォームに依存するか、また、イントラネットとインターネットが関係している場合でもそうです...通常、イントラネットでは別の方法で認証を行います。少なくとも私の経験では。
Nick Craver

@Nick With 401 "応答にはWWW-Authenticateヘッダーフィールドを含める必要があります"-これをMySQLデータベースと組み合わせるにはどうすればよいですか?AuthType BasicとDigestは.htpasswordなどのApache構成ファイルに限定されていませんか?
Vidar Vestnes、

ユーザー名とパスワードの入力を求める基本的なブラウザのダイアログではなく、カスタムのログインページが必要です...
Vidar Vestnes '15

回答:


66

私は303が他の 302を見つけたと思います

リクエストされたリソースは一時的に別のURIに存在します。リダイレクトは時々変更される可能性があるため、クライアントは今後のリクエストに引き続きRequest-URIを使用する必要があります(SHOULD)。この応答は、Cache-ControlまたはExpiresヘッダーフィールドで示されている場合にのみキャッシュ可能です。

私の意見では、ログインページに最もよく適合します。私は最初に303 see otherどちらがうまくいくかを考えました。少し考え302 Foundた結果、要求されたリソース見つかったので、もっとふさわしいと思います。アクセスする前に、別のページを通過する必要があります。応答はデフォルトでキャッシュされませんが、これも問題ありません。


4
同意しますが、302 Foundはリソースが別のURLのすぐ下で見つかったことを示していると思います。例 「今日」私のメッセージは「/ login /」(「/ messages /」ではなく)にあるため、/ my-messages /サーバーの応答を302で設定したい... 302を使用していますが、感じませんコンテキストは100%一致しています。ログインページは別のリソースであり、要求されたものと同じコンテンツを持っていないので。
Vidar Vestnes、

2
@PHP_Jedi true。その観点からは303がより適切かもしれません。ただし、クライアントの互換性に関しては、302の方が信頼性が高くなります。
Pekka

1
ええ、303は「リクエストへの応答は別のURIで見つけることができる」と記載されているので、コンテキストに適していると思います。これは、別のURIで見つかるのはリソース自体ではなく、この要求への応答だけであることを私に教えています。
Vidar Vestnes、

3
@PHP_Jediこれに多くの時間を割く価値があるかどうかはわかりません。いずれにしても、httpの世界のクライアントとサーバーはどちらも非常にリベラルでフォールトトレラントである必要があるため、302またはを使用しても303、それ302がよく知られていることを除いて、実際の違いはありません。私は細部のレベルが立派であると思います、そして、物事を正しくすることは常に良いことですが、この特定の領域であまりに多くの努力は無駄かもしれません。
ペッカ

28
参考:Googleが302を発行
デビッドマードック

51

これは、HTTPリダイレクションメカニズムの誤用です。ユーザーが承認されていない場合、アプリは戻る必要があります401 Unauthorized。ユーザーが承認されているが、要求されたリソースへのアクセス権がない場合は、403 Forbidden返される必要があります。

クライアント側でリダイレクトを行う必要があります(例:JavaScript)。必要な認証が存在しないため、リダイレクトのステータスコード。これに30xを使用すると、HTTPに準拠しません。

マークノッティンガムによるHTTPステータスコードについて考える方法

401 Unauthorizedは、HTTPのリクエスト認証メカニズムをトリガーします。

401 UnauthorizedステータスコードにはWWW-Authenticate、さまざまな認証タイプをサポートするヘッダーの存在が必要です。

WWW-Authenticate:<type> realm = <realm>

Bearer、OAuth、Basic、Digest、Cookieなど


20
A server generating a 401 (Unauthorized) response MUST send a WWW-Authenticate header fieldRFC)のように401が適切でない場合があり、すべてのログインシステムがそのヘッダーを使用するわけではありません。
starbeamrainbowlabs 2015年

6
保護されたページを更新するとします。クライアント側のjavascriptは呼び出されるための変更がなく、ブラウザはユーザーをログインページにリダイレクトする代わりにログインウィンドウをポップアップします。したがって、唯一の方法は30xコードを使用することです。
Claude Brisson、2016年

2
Golangはリダイレクトに401を使用できません。つまり、リダイレクトには30 *を使用する必要があります。
EIMEI 2016

4
@EIMEIがあなたの推論に従い、別の言語またはライブラリが401の使用を強制した場合、インターネットは破滅するでしょう。私の要点:あなたが言うことはGolangの問題を指摘しています(401を送信することができないような設計になっているのは驚くべきことです!)
Greg

2
@starbeamrainbowlabs WWW-Authenticateヘッダーのオプションとして、CookieベースのHTTP認証のドラフトがあります。参照:tools.ietf.org/html/draft-broyer-http-cookie-auth-00
aef

12

適切な解決策は、HTTP 401(Not Authorized)ヘッダーだと思います。

http://en.wikipedia.org/wiki/HTTP_codes#4xx_Client_Error

このヘッダーの目的はまさにこれです。ただし、ログインページにリダイレクトする代わりに、正しいプロセスは次のようになります。

  • ログインしていないユーザーがログイン制限ページにアクセスしようとしました。
  • システムはユーザーがログインしていないことを識別します
  • システムはHTTP 401ヘッダーを返し、ログインフォームを(リダイレクトではなく)同じ応答で表示します。

これは、サイトマップリンクや検索フォームなどを含む便利な404ページを提供するような、良い習慣です。

またね。


20
RFCは、「応答には、要求されたリソースに適用可能なチャレンジを含むWWW-Authenticateヘッダーフィールド(セクション14.46)を含める必要があります。」401応答は、実際にはHTTP認証スキームを使用する場合にのみ適用できます。
bshacklett 2010

4
その場合、403はアクセスが単に禁止されており、認証ヘッダーは
役に立た

@bshacklett WWW-Authenticateは、多くの認証スキーム(Bearer、OAuthなど)と一緒に使用できます。developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…およびiana.org/assignments/http-authschemes/http-authschemes.xhtml
filip26

WWW-Authenticateヘッダーのオプションとして、CookieベースのHTTP認証のドラフトがあります。参照:tools.ietf.org/html/draft-broyer-http-cookie-auth-00
aef
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.