web-dev-qa-db-ja.com

通常、セッションCookieの有効期限は何ですか?

JavaScriptを使用してセッションCookieを作成する必要があります(詳細については 質問を参照 )。有効期限はどうあるべきだと思いますか?ブラウジングセッションだと思うので、有効期限を設定しないと、これがデフォルトとして使用されますよね?このセッションは、ログオンしたユーザーを検証するために使用されます。それで、ユーザーが自動的にログオフする前にユーザーがログインしたままにしておく期間に依存しますか(はい、何がいい時間ですか、それともブラウジングセッションでなければなりませんか?)

14
Celeritas

ブラウジングセッションだと思います。有効期限を設定しないと、これがデフォルトとして使用されますよね。

はい。ブラウザーが再起動してもセッションが存続する必要がない限り、expiresパラメーターを省略して、Cookieがブラウザーセッションのみでディスクに永続化されないようにします。

自動的にログオフする前にユーザーがログインしたままにしておく期間に依存しますか

これは、サーバー側だけで実装する必要がある実際のセッションの有効期限によって制御されます。 expiresの時間を使用する場合、通常は少なくともサーバー側のタイムアウトと同じ長さにしたいと思うでしょうが、ブラウザがそのexpiresをメソッドとして使用することに依存すべきではありません古いセッションに確実に到達できないようにします。

一般に、セッションのみの(no -expires)cookieがセッション追跡に使用され、サーバー側でタイムアウトが発生します。リクエストが認識されない、または欠落しているCookieで作成された場合、サーバー側でセッションの有効期限が切れているか、クライアント側でブラウザーが閉じているか、その両方である可能性が高いため、ユーザーに新しいセッションを開始するように指示する必要があります。

通常、サーバー側にあるWebフレームワークに含まれるセッション管理ツールがあり、適切な_Set-Cookie_ヘッダーをHTTP応答(最初のHTMLページまたはXMLHttpRequest応答)。あなたがcould JavaScript、渡されたパラメーター、そしてたとえばlocalStorageをCookieの代わりとして使用して自分でセッション管理を再実装している間、そのホイールを再発明することで勝つことはそれほどないようです。

9
bobince

私の推奨は、「JavaScriptを使用して認証Cookieを作成しないでください」です。認証されたセッションを識別するCookieは、XSS攻撃を緩和するためにHttpOnlyフラグでマークする必要があります。そのため、サーバーで作成し、クライアントではなく応答と共に送信する必要があります。

その少しのアドバイスはさておき、あなたの仮定はほとんど正しいです。 Cookieに有効期限が設定されていない場合、それはセッションCookieであり、ブラウザが開いている限り有効ですandセッションIDは有効です。サーバーが認証されたセッションを定期的に期限切れにする場合、Cookieはサーバー上のセッションにアタッチされなくなり、したがって本質的にnullになります。

2番目の質問では、再認証が必要になる前にユーザーがログインする最大時間を指定する場合、通常はローリング有効期限で行われます。この場合、有効期限は、リクエストごとに更新されてからx分になります。 、アクティブなユーザーセッションが強制的に期限切れになることはなく、ユーザーが最後のx分間に新しいリクエストを行っていないアイドルセッションのみ。これを行う最も安全な方法は、Cookieの値を、期限切れになるサーバー上のセッションに結び付けることです。これは、ユーザーが干渉することはできません。 Cookieの有効期限は、クライアントによって変更される可能性があるため、十分ではありません。クライアント側にセッションの有効期限を保存する必要がある場合は、Cookieの値で暗号化する必要があります。そのため、値を復号化できる唯一の場所はサーバーでなければならないため、JavaScriptではなくサーバー側で作成する必要があります。それが安全であるために。

最後に、3つ目の質問ですが、セッションの有効期限が切れるまでの適切な時間はどれくらいですか。それは完全にあなたのアプリケーションに依存します。金融アプリケーションでは、タイムアウトが5分または10分と非常に短いことがよくあります。多くのアプリケーションでは、20分または30分のうち、より伝統的なデフォルト時間が設定されています。アプリのワークフローが更新されずにページ上で長い時間を必要とする場合、さらに長い時間が必要になる場合があります。アプリケーションに特定のセキュリティニーズがない限り、それがどのような場合でも非常に重要であることはわかりません。

9
Xander

私はWeb開発者ではないので、これは間違っている可能性がありますが、AJAXクエリへのHTTP応答で_Set-Cookie:_ヘッダーを使用して、セッションCookieを設定することができます。

AJAX応答内にセッションIDを渡し、JavaScriptを使用してそのCookieを設定する必要はありません。標準のPHP session_*()関数は有効期限の設定を正しく処理する必要があります。


セキュリティのメモでは、 HTTPOnlySecure およびSSL。これらすべてを実行する必要があります。

また、ユーザーがログアウトしたときと、ユーザーが一定時間操作を行わなかったときの両方で、サーバー上のセッションを期限切れにする必要があります。選択する期間は、セキュリティと使いやすさのトレードオフです。 PHPのデフォルトは1440分(24時間)です。

2
Ladadadada