Railsのデフォルトでは、セッションの保存先がCookieになっております。

ただ、それを嫌がって、memcachedやredisを使用するケースをよく聞きます。

ただ、なぜ、Cookieじゃダメなのかがいつもわからず、モヤモヤとしてます。

調べている中でわかったのは  
`様々な事情からサーバ側にセッションのデータを持ちたくなることがある。`

です。

・cookieの場合だと、サーバー側にデータをもつ方法はないのでしょうか？  
・サーバー側にデータを持って、どういった用途に使用されるのでしょうか？（ケースによって様々だと思いますが、私は学習不足のため、思い浮かびません・・・。）  
・その他、redisなどを好んで使用する理由

どなたか補足していただけないでしょうか？

宜しくお願いします。
CC BY-SA 3.0
2016-01-31T11:59:23.887
21539
2016-01-31T14:19:34.577
13175
question
ruby-on-rails ruby cookie redis memcached
セッションを保存するとき、なぜ、Cookieではなくmemcachedやredisを使用するのでしょうか？
_・cookieの場合だと、サーバー側にデータをもつ方法はないのでしょうか？_  
そもそもCookieによるデータ保存の方法を理解しておられるのでしょうか。Cookieと言うのは  
[1] サーバがクライアント(ブラウザ)に保存させたいcookie情報を含めたレスポンスを送る。  
[2]
そのcookie情報を受け取ったブラウザは同一のサーバから受け取った他のすべてのcookieを含めて保存しており、そのサーバに対するすべてのリクエストにそれらのcookieの全部を仕込む。  
という形で成立しているデータの保存方法です。  
**「サーバ側にデータをもつ」ようなものはcookieとは言いません。**

_・その他、redisなどを好んで使用する理由_  
特にredisだけが好まれて使用されているようには感じないので、逆になぜあなたがredisが好まれていると感じたのかお教えいただきたいです。ただ、一般的な傾向として、すべてのリクエストに対して必ず読みにいくことが想定されるので、できるだけ軽量かつ簡単にアクセスできる枠組みが好まれるということはあると思います。

  * Cookieの仕組みでご説明したように、サーバから送られてきたcookieはすべてブラウザ側に保存されますから、ちょっとしたユーザならその内容を書き換えることは簡単にできます。(今は殆どのブラウザに開発者機能が標準搭載されていますから、何も特別なツールは要りません。)
  * また、Cookieの仕組み上、ブラウザに保存されているデータはリクエストを送信するたびに、毎回リクエストに上乗せされますから、通信データ量の増大という意味でも好ましくありません。

この2点が、セッション情報としてCookieを利用する場合の2大欠点だと考えられます。私としてはRailsが標準のセッション保存先としてCookieを想定しているのは、Railsの最大の設計ミスだと考えているのですが、上記の2点が必ずしも欠点とは考えられない応用分野もあるのでしょう。
CC BY-SA 3.0
2016-01-31T12:23:36.833
21540
2016-01-31T12:23:36.833
13972
21539
answer
> 様々な事情からサーバ側にセッションのデータを持ちたくなることがある。

HTTP(1.1)はプロトコル上ステート(状態)を持たないので、、クライアントからリクエストにサーバが応答する、の1回のやりとりで完結します。一方でCookieは、サーバがレスポンスを返すときにデータを載せて、それをクライアントが以降のリクエストで「単純に」送り返す仕組みです。つまり

  * cookieに保存されるデータはすべてサーバに由来するかさもなくばクライアントが送信してきたデータ
  * クライアント側でそのデータが操作されることは意図していない

ということなので、「サーバ側でデータを保持しておき、クライアントにはそれを識別するIDだけ通知する」で用が足ります。ネットワーク越しに流す必要が無いデータを流すのは無駄ですしあちらこちらで改竄や盗聴のリスクがあるのでよろしくありません。定跡としても、このセッションIDだけをやりとりする方法がよいとされています。

Railsはこれに反してデフォルトではセッションデータをCookieに保存するのでそのことが批判の的になっていますが、Railsの思想は「セッションデータに重要なデータを保存すんのがそもそもおかしい」ということなのでナンセンスな批判とも言えます。

Cookieに(セッションIDではなく)データを保存するのは利点もあって、アプリケーションサーバが分散しているときにその間でセッションデータを共有する必要がなくなります。

セッションID方式だと、セッションデータをすべてのサーバで共有せねばならず、リクエストの度に

  1. セッションIDでデータを検索
  2. セッションIDを再発行し、それを保存

しなければならない、また有効期限を管理し適度にパージしなければならない、など負荷の面でも管理の面でも面倒です。

(たまにサーバが複数台あるけどセッションデータは共有してない、という潔い設計のシステムもありますが)

とは言っても先に書いたとおりセッションIDのみをやりとりする方が理にかなっているので、セッションIDをキーにしてデータを処理する軽量かつ高速なデータストレージをセッションデータの保存に使用する、という発想になります。これはまさにKVSそのものなので、memcahcedやredisがそれに使われるということになります。RDBに保存されるデータとはライフサイクルが違いますし、バックアップの必要も無いので、その点からも別のストレージを使うのが適しています。
CC BY-SA 3.0
2016-01-31T14:19:34.577
21543
2016-01-31T14:19:34.577
5793
21539
answer