セッションがタイムアウトしたことをクライアントに通知するために使用されるはずのhttpステータスコードは何ですか?


80

Webページでは、YUI接続マネージャー/データソースを使用してAJAXリクエストをサーバーに送信します。セッション(ユーザーが認証されているかどうかに関する情報を含む)がすでにタイムアウトしている場合、認証されたユーザーのみが表示できるajax応答ユーザーはhttpステータスコードを返し、セッションがすでにタイムアウトしていることをクライアントに通知する必要があります。その後、クライアントは単にログインページにリダイレクトするか、セッションを延長するかどうかを尋ねます。

私の質問は、この状況で、セッションがタイムアウトしたことをクライアントに伝えるのに最も適切なhttpステータスコードは何ですか?

ウィキからのHTTPステータスコードのリスト


セッションが間もなく期限切れになることをユーザーに警告して、ユーザーが何かを更新できるようにしますか?その場合は、サーバーでのセッションタイムアウトの前にオフになるJavaScriptのタイマーで処理する必要があります。サーバーからステータスコードが送信されるまでに、すでに有効期限が切れています。ページをアイドル状態のままにした場合に自動的に別のページにリダイレクトする場合にも、タイマーが必要になります。
ジェイソン

8
なんで、もちろん418!ショートとスタウト...
ティム・ポスト

Vaadinは410Goneを使用していますが、ブラウザーでキャッシュできるため、お勧めしません
sreg 2015

回答:


66

私が提案できる最善の方法は、WWW-Authenticateヘッダーを持つHTTP401ステータスコードです。

403リクエストの問題は、RFC 2616に「承認は役に立たず、リクエストを繰り返さないでください」と記載されていることです。(つまり、認証されているかどうかは関係ありません。そのリソースにアクセスすることはありません)。

401リクエストの問題は、「WWW-Authenticateヘッダーフィールドを含める必要がある」と述べていることです。誰かが指摘しているWWW-Authenticateヘッダにカスタム値を使用するための仕様に違反して表示されません。

RFC 2617には、HTTP401ステータスとこのようなカスタムWWW-Authenticateヘッダーを組み合わせても問題がない理由がわかりません。

WWW-Authenticate: MyAuthScheme realm="http://example.com"

OAuthの仕様は、(彼らは私の心RFCの奇妙な解釈を持っているが)、彼らはこれをお勧めして、実際に、ちょうどこれを行うようです。

WWW-Authenticate: OAuth realm="http://server.example.com/"

これはRFCによって明確に認可されているようには見えませんが、実際には禁止されていることはわかりません(MUSTまたはMUST NOT、SHOULDまたはSHOULD NOT条件と競合していないようです)。

タイムアウトやCSRFトークンが無効であるなどの、より具体的なHTTPステータスコードがあればいいのにと思います。


34

HTTP401をお勧めします。

403は基本的に「許可されていない、立ち去って戻ってこない」と言っているのに対し、401は「IDを持ってこなかったので許可されているかどうかはわかりません。行く入手して再試行してください。」

ウィキペディアの定義を比較してください:

HTTP 403-リクエストは正当なリクエストでしたが、サーバーはそれに応答することを拒否しています。

HTTP 401-403 Forbiddenに似ていますが、特に認証は可能であるが失敗したか、まだ提供されていない場合に使用します。


3
401はHTTP認証用です。RFC2616は言いresponse MUST include a WWW-Authenticate header fieldます。したがって、WWW-Authenticateヘッダーフィールドなしでそのコードを送信するのは誤りです。
toxalot 2014年

19

419についてはどうですか-それは標準ではありませんが、ウィキペディア説明は合うようです:

419認証タイムアウト

HTTP標準の一部ではありませんが、419認証タイムアウトは、以前に有効だった認証の有効期限が切れたことを示します。特定のサーバーリソースへのアクセスが拒否されている認証済みクライアントと区別するために、401Unauthorizedの代わりに使用されます。


14
これがどこから来たのか(ウィキペディア以外)何か考えはありますか?それが公式のRFCにない場合、誰がそれを定義しましたか?
アナクシマンドロス2013

5
そのwikiページからも削除されているようです
Salem Ouerdani 2016

これは仕様の一部ではなく、HttpServletResponse他の信頼できるソースを知っている場合はJava @ Johnでも利用できません。
Vishrant 2018

私はPHP Laravelで使用しているように見える
TroySteven

12

適切なコードは403 / Forbiddenになると思います。セッションに直接関係するものはありません。


1
絶対にこれが正解です。セッションがタイムアウトしたため、リクエストは禁止されています。これが最良の選択です。
marcc 2009年

3
403はクライアントに(基本的に)「リクエストを変更しない限り、それを再度行わないでください」と伝えますが、セッションが確立されている場合、変更は必要ありません。さらに、ほとんどの場合、セッションを再確立するための(現在の)要求に対しては何もできません。
ティムポスト

1
丁度!401の方が良いと思いますが、HTTP認証が必要です。これは、401 + 303(つまり、明らかに704)に沿った新しいステータスを必要としていると思います。これは、「承認されていません。承認を取得するには、他を参照してください」という意味です。より意味的に正しいことに加えて、トランポリンリダイレクトのHTTPソリューションである可能性もあります。基本的には「ここに移動し、戻ったらこれを再試行します」。これにより、ログインページは先。
アンソニー

5
私はこれに同意できません。RFC2616は、クライアントによる403応答をもたらす要求と「承認は役に立たない」と明示的に述べています。
Iain Collins

5
authorization will not help-私はそれをHTTP認証が役に立たないことを意味すると思います。どちらが正しい。Authorizationヘッダーを送信しても、何も変更されません。401も403も理想的ではありませんが、403は401より優れていると思います。RFC2616が明示的に述べているため、401はセッションタイムアウトに対して間違っていますclient MAY repeat the request with a suitable Authorization header field。しかし、この場合には、クライアントはない(SHOULD NOT) (少なくともない中間ステップなしで)要求を繰り返します。残念ながら、後半部分をステータスコードで伝えることはできません。
toxalot 2013年

11

真実は、セッションタイムアウトのための標準的なHTTPステータスコードはありません。セッションは、HTTPトランスポート層ではなく、アプリケーション層に実装されます。

Microsoftがセッションタイムアウトに使用しているカスタムステータスコードがあります:599、または単に5xxの範囲で独自のステータスコードを作成します。

ステータスコードWikiから:

599ネットワーク接続タイムアウトエラー(不明)このステータスコードはRFCで指定されていませんが、Microsoft Corp. HTTPプロキシによって使用され、プロキシの背後にあるネットワーク接続タイムアウトをプロキシの前のクライアントに通知します。

セッションタイムアウトにカスタムステータスコード599を使用し、AJAX応答でそれを確認します。


3
ネットワーク接続のタイムアウトは、セッションのタイムアウトとは大きく異なります。Microsoft拡張機能のコードを使用する場合は、Faisal Mqの回答440 Login Timeout (Microsoft)に従って使用してみませんか
toxalot 2014年

599に関するそのウィキペディアのページは間違っていて、引用はありませんでした。どうやらMicrosoftプロキシはネットワークタイムアウトで599を発生させると言っていたようですが、その証拠も見つかりませんでした。
Gareth Davidson

11

上記のBoboが提供したHttpステータスコードのウィキペディアリンクによると:

440 Login Timeout (Microsoft)

    A Microsoft extension. Indicates that your session has expired.

鉱山が行ったように、500にそのリターン・ステータスを変換することができる通知のapacheを行います- stackoverflow.com/questions/17735514/...
commonpike

ASP.NET環境向けのこのソリューションが好きです。
TroySteven

9

リンクを投稿すると、そのリンクでこのHTTPステータスコード440が見つかりました。セッションの有効期限が切れた場合は、440HTTPステータスコードを使用できます。

440ログインタイムアウト

 The client's session has expired and must log in again.

401ユーザーのログイン資格情報が間違っている場合に使用できる無許可。または、ヘッダーで渡された認証トークンが無効です。

403禁止ユーザーが要求されたリソースに対する特定の権限を持っていない場合にこれを使用できます。

したがって、私の意見では、440ログインタイムアウトを使用する必要があります。


2

技術的には、受け入れられた答えはもちろん正しいです。リクエストが失敗することがすでにわかっていて、どの失敗コードを返すかを尋ねている場合は、HTTP 401「Unauthorized(Unauthenticated)」が適切です。再認証を促すため。

しかし、まず第一に、あなた自身に尋ねてください:あなたは要求に失敗するべきですか?

ユーザーが単にあなたのウェブサイトの公開ページにアクセスしている可能性があることを考慮してください。その場合、あなたは「無許可」で顔を叩きます。メッセージを送信し、認証なしで通常表示できるページを表示するために、再認証を要求します。それはクールではない。

私のアドバイスは、セッショントークンが不明であるという事実を無視し、単に新しいセッショントークンの生成に進み、そのための新しいセッションを作成することです。もちろん、セッションの初期状態は「まだ認証されていません」であるため、ユーザーが非公開ページにアクセスしようとすると、ページはHTTP 401「Unauthorized(Unauthenticated)」を受信したことを確認します。 "そして認証する必要があります。しかし、ユーザーが公開ページにアクセスした場合、ユーザーは何も変わったことに気付くことはありません。


0

「/ auth-required」のようなリソースパスに向ける「Location」ヘッダーを使用して、302リダイレクト応答を使用します

クライアントは、ログイン/パスワードフォームを使用してリソースパスをモーダルにルーティングし、ユーザーを別のページに転送することを回避できます。


-3

Ajax以外のリクエストには、302リダイレクトを使用します。

Ajaxリクエストの場合、既知のエラーには200を使用します。そうすれば、データオブジェクトを利用できます。jqXHRを解析して情報を取得するよりも、データオブジェクトの操作が簡単だと思います。そして、自分の状況に合わせて再利用しようとするHTTPステータスコードについて心配する必要はありません。

jQueryの例:

$.ajax({
    //send data to server
})
.done(function(data, textStatus, jqXHR) {
    if (data.success) {
        //then process return data
    }
    else {
        //get error type or message from data object
        //could use custom error codes
    }
})
.fail(function(jqXHR, textStatus, errorThrown) {
    //handle unknown errors
});

6
応答を解析したくないのは、HTTP仕様から逸脱する理由にはなりません。特に、JSON.parse(responseText)だけが可能な場合はそうです。
デビッドネルソン

この場合、リクエストがトランスポート層で技術的に成功したため、200応答コードを使用してもHTTP仕様から逸脱するとは思いません。私にとって、セッションタイムアウトは、ユーザーフレンドリーなエラーメッセージを返すフォームエラーに似ています。この質問への回答で示された不一致は、HTTP仕様がセッションタイムアウトに対して業界で受け入れられている応答コードを提供していないことを明確に示しています。存在しない仕様からどのように逸脱することができますか?
toxalot

-4

コード408。「リクエストタイムアウト」は完璧のようです-RFC2616はそれが意味することを説明しています

サーバーが待機する準備ができている時間内に、クライアントは要求を生成しませんでした。

つまり、必要に応じて、まさに「タイムアウト」です。


4
ああ、でも残りの定義を見てください。「クライアントは後で変更せずにリクエストを繰り返すことができます。」「変更なし」とは、リクエストをリロード/更新するだけで新しいセッションを作成できることを意味します。ほとんどの場合、認証が使用されているとき、ユーザーは最初に再度ログインする必要があります。
AJ。

@AJ、もちろん、繰り返される要求は認証チャレンジ(HTTPコード401)に遭遇する可能性があります-それを禁止するHTTP仕様には何も表示されません、何かを指すことができますか?
Alex Martelli

5
408は、クライアントに要求をそのまま再送信するように指示します。これは、セッションがタイムアウトした場合は明らかに機能しません。
ティムポスト

4
408は、セッションタイムアウトではなく、「要求」タイムアウトです。つまり、ソケットは確立されましたが、時間がかかりすぎていました。このサイトはそれをうまく説明しています:checkupdown.com/status/E408.html
Brad Cupit 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.