4

Iセッション内のセッションについて学びます。参照のほとんどは、セッションを作成する方法は次のとおりです。Railsでセッションがどのように機能するか

例:

session[:id]=user.id 

セッションは、グローバルハッシュです。セッションがグローバルハッシュの場合、複数のユーザーがログインしようとすると、セッション変数には が上書きされるかどうかが疑問です。なぜなら、1つのグローバルハッシュしか存在しないからです。したがって、何百万人ものユーザーがログインした場合、どのように同じ「セッション[:id]」が のすべてのユーザーセッションを保持しているのでしょうか。 1つの変数に複数の値を格納することは可能ですか?また、特定の ユーザーのセッションを削除する方法もあります。だから、セッションはどのようにレールで扱われますか?

+0

@ 7studなぜスレッドがここに来るのですか? – mrg

+2

'session'はグローバルハッシュではありません。これは、各リクエストのコンテキストで新しいハッシュを返すメソッドです。 – Aetherus

+0

@Aetherus新しいハッシュを返すと、サーバー側にログインしているユーザーに関するデータは保持されますか? – mrg

答えて

5

sessionはグローバルハッシュではありません。これは、各リクエストのコンテキストで新しいハッシュを返すメソッドです。そのハッシュがどのように作成されるかは、基礎となるセッションストアによって異なります。

典型的な2つのセッションストアを見てみましょう。

暗号化されたCookieストア

これはRailsアプリケーションのデフォルトのセッションストアです。シリアル化されたRailsはセッションハッシュ全体をCookieに暗号化し、クライアント(ブラウザなど)に保存します。リクエストがRailsアプリケーションにヒットするたびに、RailsはそのセッションCookieをデシリアライズしてハッシュにします。そのハッシュは、方法sessionが返すものです。

Redisのセッションストア

このセッションストアは、Railsのに同梱されていません。それは別の宝石です。

このセッションストアでは、Railsはセッションをシリアル化し、ID(セッションID)を与え、IDハッシュペアをRedisに格納します。 RailsはセッションIDをcookieに設定し、そのcookieをクライアントに送信します。リクエストがRailsアプリケーションにヒットするたびに、RailsはCookieからセッションIDを取得し、そのセッションIDに関連付けられたシリアライズされたセッションをRedisから取得し、ハッシュに逆シリアル化します。そのハッシュは、方法sessionが返すものです。

+0

ありがとうございます。私は理解した。しかし、セッションを「session [:id] = nil」として削除すると、クライアント側に保存されているセッションCookieがどのように削除されます。 – mrg

+1

クライアントのCookieを削除する必要はありません。彼/彼女のクッキーはサーバー上のどのキーとも一致しなくなり、再度ログインするように求められます。 – bkunzi01

+0

セッションで何か変わった場合、Railsは単にそのセッションをシリアル化して保存します。 – Aetherus

1

ほとんどのアプリケーションでは、特定の ユーザーの特定の状態を追跡する必要があります。これは買い物カゴの内容でも、現在ログインしているユーザーのユーザーID でもかまいません。新しいユーザー がアプリケーションにアクセスすると、Railsは自動的に新しいセッションを作成します。ユーザー がすでにアプリケーションを使用している場合は、既存のセッションが読み込まれます。

セッションは、通常、ハッシュを識別するために、値とセッションIDのハッシュ、 (通常は32文字の文字列)で構成されます。 をクライアントのブラウザに送信したすべてのCookieには、セッションIDが含まれています。そして、他の方法 ラウンド:ブラウザは、 クライアントからのすべての要求でそれをサーバーに送信します。言い換えれば

http://guides.rubyonrails.org/security.html

、それぞれ独自のユーザーは、自分のセッションハッシュを持っています。 「グローバル」とは、任意のアクション/メソッド内でセッションハッシュにアクセスできることを意味します。

+0

したがって、セッションはクライアント側でのみ行われます。サーバー側ではありません。したがって、サーバーにはセッションが維持されていません。そうですか?それが正しい場合、セキュリティは何ですか?セッションハッシュがクライアントに送信された後、私が安全にセッションハッシュを持つまで、サーバーフォームクライアントにアクセスできます。 – mrg

+1

引用文を読んだ後、それはあなたの解釈ですか?クライアント側は、Ruby言語がまだ発明されていないことは知らない。 'session [:id] = user.id'はクライアント側のコードです。 JavaScript? – 7stud

+0

引用符によると、ユーザーがすでにアプリケーションを使用している場合、既存のセッションが読み込まれます。そこからロードされます。 "session [:id]"という名前の変数は1つだけです。 2番目のユーザーがログインすると上書きされます。次に、1番目のユーザーIDとそのハッシュをどのように保守することができますか? – mrg

0

7studと記載されているように、すべてのセッションはユーザーごとにユーザーごとに作成されます。 HTTPは「ステートレス」プロトコルなので、新しいページを見たり、既存のページを更新したりするたびにログイン情報を入力する必要があります。これはセッションが入ってくる場所です。Railsでは、セッションが作成されると、各セッションに一意のセッションID(ランダムな16進数の32文字の文字列)が割り当てられ、このIDを含むCookieがクライアントのブラウザに送信されます。その時点から、ブラウザからのすべてのリクエストは、セッションIDをサーバに返して、サーバに継続性を維持します。従うべき通常のガイドラインは、(プライマリキーなどのような)現在のユーザを決定するために、情報のようなセッションの最小限の情報しか追跡してはならないということです。

+0

サーバー側にはセッションの詳細は保持されていません。リクエストはユーザからのものです。そうですか? – mrg

+0

サーバーによって生成された一意のIDは、サーバー側とユーザーのブラウザーにCookieとして格納されます。次に、ユーザーがサーバー上の新しいページをチェックするたびに、サーバーのキーとサーバーの一意のIDが比較されます。 – bkunzi01

+0

一意のIDが格納されている場所。 – mrg

関連する問題