Nobody dies a virgin

映画/音楽/時々プログラミング

アプリを高速化するためにキャッシュについて考えてみる

そもそもなぜキャッシュが大事なのか

本当に恥ずかしい限りなのですが、今までキャッシュ・セッション・クッキーについてよくわかっていませんでした。(クッキーなんてiphone使っているだけでもよく出てくるのに...恥ずかしい)今回、AWSのEC2で運営しているサーバーの冗長化を考える際にどうしてもキャッシュなどについてしっかりした理解が必要だと感じました。そして、アルバイトをしている会社の社長の知人にとても詳しい方がいたので1日かけてサーバーの冗長化を教わりました。

キャッシュ (cache)とは

キャッシュとは、使用頻度の高いデータを高速な記憶装置に蓄えておくことにより、いちいち低速な装置から読み出す無駄を省いて高速化すること。また、その際に使われる高速な記憶装置や、複製されたデータそのもののこと。

引用: キャッシュとは|cache|キャッシング|caching − 意味 / 定義 / 解説 / 説明 : IT用語辞典

すごくまとめてしまうとアプリに関する"速さ"に影響します。キャッシュがあると、次回以降のアクセスに備えておくことにより次回アクセスした時に早くページを表示したりすることができます。リクエストされたコンテンツを保存し、再利用することによって高速化します。

私が開発で使っているrailsではキャッシュはファイルに書き込みそれを参照しています。そのためSQLなどがたくさん発行され、後述するRedis(No SQLデータベースの一種)にキャッシュを残すよりも速度が落ちてしまいます。さらに今回、教えていただいたサーバーの冗長化ではサーバーを二台設置してエンドユーザーにはどちらに接続していても、キャッシュやセッションが存在していなくてはならないためRedisを使いサーバーの外に置く必要がありました。

セッションとは

接続/ログインしてから、切断/ログオフするまでの、一連の操作や通信のこと。

引用: セッションとは|session − 意味 / 定義 / 解説 / 説明 : IT用語辞典

例えばamazonでお買い物をする場合を考えます。

  1. ログインする

  2. 欲しいものを検索する

  3. カートに入れる

  4. クレジット会計をする

  5. 完了

なるわけです。(ページの移動がもっと細かくあります。)

ですが、一回ログインしたらその後の操作はログイン情報は保持したまま操作したいですよね?欲しいものを検索して、リストが出てくるときに再びログイン画面が出てきたらもう買い物をやめたくなります。一回ログインしたら1~4までの操作はもちろんログインなしで操作したいわけです。そんなときに活躍してくれるのがセッションです!これによってログイン情報を記録してくれることによってユーザーは同一ユーザーとして操作ができるわけです。たまに見かける"セッションが切れました"という表記は長時間操作しないためにログイン情報がなくなりましたよということを指すわけです。

通常アプリではセッションを記録しておく場所があり、今回はこれまたRedisで管理することによってサーバー二台で運営しても矛盾が出ないことになります。

クッキーとは

キャッシュでは具体的にはwebページのコンテンツを保存しておくのですが、クッキーではユーザーの個人情報などを保存しておくものです。

ふたたびamazonで買い物をする場合を考えると、 以前にamazonで買い物をしたことがあるときにクレジット情報や住所などが自動で記入されていることがあったりしますよね!(もちろんログイン画面もそうなのですが)ログインボタンを押したらいきなり以下のようになっているのを見たことがあるはずです!

f:id:deiki08:20161025002956p:plain

これはクッキーのおかげなんですね。クッキーを残すことによって、次回以降面倒な個人情報の入力をしなくて済むわけです。そんな便利なクッキーですが、なりすまし格好の餌食になることがあるので注意が必要です。

セッションハイジャック[編集] クッキーでセッション管理を行う場合、もし第三者がセッションIDを知ることができれば、そのIDを名乗ることで本来のユーザになりすますことができる。このような「なりすまし」行為をセッションハイジャックと呼ぶ。 例として、以下のような通信を行うシステムがあるとする。 トップページでユーザIDとパスワードの入力を求める。 認証に成功するとサーバはセッションIDを割り当て、クッキーとしてクライアントに通知する。 クライアントは以降の要求にクッキーとしてセッションIDを付加する。サーバは対応するセッション情報にアクセスし、どのユーザであるか識別する。 もし第三者がセッションIDを知ることができれば、そのセッションが有効な間だけとはいえ、1~2を飛ばして3から開始することができる。すなわち、パスワードを知らなくても「なりすまし」が可能となる。

引用: HTTP cookie - Wikipedia

クッキーでセッション管理をする際にはアプリの通信でHTTPSを使うべきなんですね。

最後に

いかがだったでしょうか?サーバーの冗長化については記事が長くなってしまったため、別記事で書きたいと思います。間違っていることを書いていたら是非、コメントをお願いします!!