私はなぜデータベースにセッションを保存するのだろうか?データベースにセッションを格納する利点はありますか? Webサービスが再起動されている場合は、セッションデータをロードバランスの取れた環境では)Rails:セッションをデータベースに格納する利点は?
2を失っていない、セッションデータが格納されている
1):
私はなぜデータベースにセッションを保存するのだろうか?データベースにセッションを格納する利点はありますか? Webサービスが再起動されている場合は、セッションデータをロードバランスの取れた環境では)Rails:セッションをデータベースに格納する利点は?
2を失っていない、セッションデータが格納されている
1):
データベースまたはmemcachedの利点は、クライアント側でセッションデータを改ざんできず、クッキー(4kB)よりも多くのデータを保存できることです。
セッションがCookieまたはデータベースに格納されていて、Webサービスが再起動された場合、セッションデータは失われません。 memcachedに格納されている場合にのみ失われる可能性があります。
サーバーが負荷分散されている場合、セッションデータは要求を処理しているWebサーバーに渡されるため、Cookie、データベース、またはmemcachedセッションでは問題ありません。
memcachedまたはデータベースよりもクッキーの利点は、クライアントがセッションデータを保存しているため、サーバーがそれを担当していないことです。
セッション参照は引き続き維持する必要があるため、クッキーはクライアントとの間でやり取りされることに注意してください。
私は考えることができる2つの理由があることですすべてのサーバーが要求を処理し、セッションデータにアクセスできることを意味します。
私が考えることができる少なくとも3つの理由があります。 DBにセッションを保存すると、実行できるRailsインスタンスに簡単にアクセスできます。
データベースにセッションを持たないことはあまり明白でなく、小さな利点は、現在のセッションをカウントして他のログインしているユーザーの名前を確認する必要がある場合、セッションデータまたはmemcachedを格納します。 2.9節で説明したように
ウェブアプリケーションはステートレスであるため、とにかくログインしているユーザーの数を確認する信頼できる方法はありません。カウンティングセッションはそれを助けません。 –
ページを読み込むたびにupdated_atパラメータをタッチすると、過去数日間に何種類のセッションが読み込まれたかがわかります。セッションクッキーの有効期限が24時間に設定されている場合は、ログインしているユーザーがわかります。また、セッションを削除してユーザーをログアウトすることもできます。 –
別の利点は、サーバー側のセッションの有効期限を処理することです:
http://guides.rubyonrails.org/security.html
「しかし、クライアントはWebブラウザがそのサーバー上のセッションを期限切れに格納されているクッキーを編集することができます」
class Session < ActiveRecord::Base
def self.sweep(time = 1.hour)
if time.is_a?(String)
time = time.split.inject { |count, unit| count.to_i.send(unit) }
end
delete_all "updated_at < '#{time.ago.to_s(:db)}' OR
created_at < '#{2.days.ago.to_s(:db)}'"
end
end
「データは改ざんできません」を除いて、あなたが言うことはすべて正しいです。セッションハイジャック? – sethvargo
セッションハイジャックでは、ユーザーはクライアント側のセッションデータを改ざんしていません。彼らは、認証されたユーザーであるかのように、システムにアクセスするためにセッションIDクッキーを複製しています。 –
memcachedに保存されたセッションは、Webサーバーの再起動後に失われますか? –