質問: Railsのデフォルトでは、セッションの保存先がCookieになっております。 ただ、それを嫌がって、memcachedやredisを使用するケースをよく聞きます。 ただ、なぜ、Cookieじゃダメなのかがいつもわからず、モヤモヤとしてます。 調べている中でわかったのは `様々な事情からサーバ側にセッションのデータを持ちたくなることがある。` です。 ・cookieの場合だと、サーバー側にデータをもつ方法はないのでしょうか? ・サーバー側にデータを持って、どういった用途に使用されるのでしょうか?(ケースによって様々だと思いますが、私は学習不足のため、思い浮かびません・・・。) ・その他、redisなどを好んで使用する理由 どなたか補足していただけないでしょうか? 宜しくお願いします。
回答: > > 様々な事情からサーバ側にセッションのデータを持ちたくなることがある。 > > > HTTP(1.1)はプロトコル上ステート(状態)を持たないので、、クライアントからリクエストにサーバが応答する、の1回のやりとりで完結します。一方でCookieは、サーバがレスポンスを返すときにデータを載せて、それをクライアントが以降のリクエストで「単純に」送り返す仕組みです。つまり * cookieに保存されるデータはすべてサーバに由来するかさもなくばクライアントが送信してきたデータ * クライアント側でそのデータが操作されることは意図していない ということなので、「サーバ側でデータを保持しておき、クライアントにはそれを識別するIDだけ通知する」で用が足ります。ネットワーク越しに流す必要が無いデータを流すのは無駄ですしあちらこちらで改竄や盗聴のリスクがあるのでよろしくありません。定跡としても、このセッションIDだけをやりとりする方法がよいとされています。 Railsはこれに反してデフォルトではセッションデータをCookieに保存するのでそのことが批判の的になっていますが、Railsの思想は「セッションデータに重要なデータを保存すんのがそもそもおかしい」ということなのでナンセンスな批判とも言えます。 Cookieに(セッションIDではなく)データを保存するのは利点もあって、アプリケーションサーバが分散しているときにその間でセッションデータを共有する必要がなくなります。 セッションID方式だと、セッションデータをすべてのサーバで共有せねばならず、リクエストの度に 1. セッションIDでデータを検索 2. セッションIDを再発行し、それを保存 しなければならない、また有効期限を管理し適度にパージしなければならない、など負荷の面でも管理の面でも面倒です。 (たまにサーバが複数台あるけどセッションデータは共有してない、という潔い設計のシステムもありますが) とは言っても先に書いたとおりセッションIDのみをやりとりする方が理にかなっているので、セッションIDをキーにしてデータを処理する軽量かつ高速なデータストレージをセッションデータの保存に使用する、という発想になります。これはまさにKVSそのものなので、memcahcedやredisがそれに使われるということになります。RDBに保存されるデータとはライフサイクルが違いますし、バックアップの必要も無いので、その点からも別のストレージを使うのが適しています。