はじめに
今回はRailsチュートリアルの9章が難しかったので自分なりにまとめてみました。
状態を保持することは、ウェブアプリケーションで非常に重要です。状態とは、ログイン状態やカートに入れた商品など、ユーザーの行動に応じて変わるデータのことです。Railsではこの状態を保持するためにsession
やcookies
といった仕組みがあります。
1. なぜ状態保持が必要なのか?
なぜ必要か?
ウェブは「ステートレス(状態を持たない)」と言われています。具体的には、一度ページを閉じたらその前の情報(ログインしていた、カートに何を入れていた等)が全部失われてしまいます。これでは、ユーザーが毎回ログインし直したり、カートに商品を再度追加する手間が発生してしまいます。そこで、これらの情報を一時的にでも保存しておく必要があります。
2. session
で短期間の状態をどう管理するか
なぜ必要か?
ユーザーがウェブサイトを閲覧している途中で、ログイン状態やフォームの入力状態などを保持しておくことで、ユーザーはよりスムーズに操作できます。
コード例
# ユーザーIDをsessionに保存
session[:user_id] = @user.id
使い方
- ユーザーがログインすると、そのユーザーのIDが
session[:user_id]
として保存されます。 - ユーザーがサイト内で移動しても、このIDを使って「この人はログインしているんだな」とサーバーが認識できます。
- ユーザーがブラウザを閉じると、この
session
情報は消えます。つまり、セキュリティの観点からも比較的安全です。
3. cookies
で長期間の状態をどう管理するか
なぜ必要か?
session
と違い、cookies
はブラウザを閉じた後も情報が残ります。例えば、「次回から自動でログインする」ような機能を作る際には、cookies
が必要です。
コード例
# ユーザーIDを暗号化してcookiesに保存
cookies.signed[:user_id] = @user.id
使い方
- ユーザーが「ログインしたままにする」にチェックを入れてログインすると、その情報が
cookies
に保存されます。 - ユーザーが再度ウェブサイトを訪れると、
cookies
に保存された情報を参照して自動的にログイン状態になります。
注意点
-
cookies
はブラウザに長期間保存されるため、セキュリティの観点から重要な情報は暗号化するなどの対策が必要です。
4. 永続的セッションの実現方法
なぜ必要か?
永続的セッションはユーザーがブラウザを閉じた後も、そのログイン状態を保持する機能です。これによりユーザーが毎回ログインしなくてもよくなり、使い勝手が大幅に向上します。
コード例
# 記憶トークンと記憶ダイジェストの作成
remember_token = SecureRandom.urlsafe_base64
remember_digest = Digest::SHA1.hexdigest(remember_token)
# cookiesとデータベースに保存
cookies.permanent.signed[:remember_token] = remember_token
@user.update_attribute(:remember_digest, remember_digest)
使い方
- まず、
SecureRandom.urlsafe_base64
を使ってランダムな文字列(記憶トークン)を生成します。 - このトークンをSHA1でハッシュ化し、それを
remember_digest
として保存します。この値はデータベースにも保存します。 - 次に、
cookies.permanent.signed[:remember_token] = remember_token
とすることで、このトークンを暗号化して永続的なcookie
として保存します。 - ユーザーがサイトに再訪した際には、この
cookie
に保存されたトークンとデータベースのremember_digest
を照合します。一致すれば、ユーザーはログイン状態と認識されます。
注意点
- セキュリティが非常に重要なので、トークンは必ず暗号化して保存してください。
- 永続的セッションは便利ですが、セキュリティリスクもあるため、例えば公共のコンピュータでは使わないように注意が必要です。
5. ログアウトの実装
なぜ必要か?
セキュリティとプライバシーを保つためには、ログアウト機能が不可欠です。ログアウトすることで、保存されたsession
やcookies
の情報を削除します。
コード例
# sessionとcookiesを削除
session.delete(:user_id)
cookies.delete(:remember_token)
使い方
- ユーザーがログアウトボタンをクリックすると、上記のコードが実行されます。
-
session
とcookies
に保存されたユーザー情報が削除され、ログアウトが完了します。
まとめ
この記事では、状態を保持する理由とその具体的な手法について、session
とcookies
を例に解説しました。これらは、ユーザーが快適にサービスを利用するためには欠かせない機能です。
おわりに
ウェブアプリケーション開発での「状態管理」は初めての方には少し難しく感じるかもしれませんが、何事も慣れな気がします。頑張って開発していきましょう!