0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Railsでの状態保持と永続的セッションの実現方法

Last updated at Posted at 2023-09-06

はじめに

今回はRailsチュートリアルの9章が難しかったので自分なりにまとめてみました。
状態を保持することは、ウェブアプリケーションで非常に重要です。状態とは、ログイン状態やカートに入れた商品など、ユーザーの行動に応じて変わるデータのことです。Railsではこの状態を保持するためにsessioncookiesといった仕組みがあります。


1. なぜ状態保持が必要なのか?

なぜ必要か?

ウェブは「ステートレス(状態を持たない)」と言われています。具体的には、一度ページを閉じたらその前の情報(ログインしていた、カートに何を入れていた等)が全部失われてしまいます。これでは、ユーザーが毎回ログインし直したり、カートに商品を再度追加する手間が発生してしまいます。そこで、これらの情報を一時的にでも保存しておく必要があります。


2. sessionで短期間の状態をどう管理するか

なぜ必要か?

ユーザーがウェブサイトを閲覧している途中で、ログイン状態やフォームの入力状態などを保持しておくことで、ユーザーはよりスムーズに操作できます。

コード例

# ユーザーIDをsessionに保存
session[:user_id] = @user.id

使い方

  1. ユーザーがログインすると、そのユーザーのIDがsession[:user_id]として保存されます。
  2. ユーザーがサイト内で移動しても、このIDを使って「この人はログインしているんだな」とサーバーが認識できます。
  3. ユーザーがブラウザを閉じると、このsession情報は消えます。つまり、セキュリティの観点からも比較的安全です。

3. cookiesで長期間の状態をどう管理するか

なぜ必要か?

sessionと違い、cookiesはブラウザを閉じた後も情報が残ります。例えば、「次回から自動でログインする」ような機能を作る際には、cookiesが必要です。

コード例

# ユーザーIDを暗号化してcookiesに保存
cookies.signed[:user_id] = @user.id

使い方

  1. ユーザーが「ログインしたままにする」にチェックを入れてログインすると、その情報がcookiesに保存されます。
  2. ユーザーが再度ウェブサイトを訪れると、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)

使い方

  1. まず、SecureRandom.urlsafe_base64を使ってランダムな文字列(記憶トークン)を生成します。
  2. このトークンをSHA1でハッシュ化し、それをremember_digestとして保存します。この値はデータベースにも保存します。
  3. 次に、cookies.permanent.signed[:remember_token] = remember_tokenとすることで、このトークンを暗号化して永続的なcookieとして保存します。
  4. ユーザーがサイトに再訪した際には、このcookieに保存されたトークンとデータベースのremember_digestを照合します。一致すれば、ユーザーはログイン状態と認識されます。

注意点

  • セキュリティが非常に重要なので、トークンは必ず暗号化して保存してください。
  • 永続的セッションは便利ですが、セキュリティリスクもあるため、例えば公共のコンピュータでは使わないように注意が必要です。

5. ログアウトの実装

なぜ必要か?

セキュリティとプライバシーを保つためには、ログアウト機能が不可欠です。ログアウトすることで、保存されたsessioncookiesの情報を削除します。

コード例

# sessionとcookiesを削除
session.delete(:user_id)
cookies.delete(:remember_token)

使い方

  1. ユーザーがログアウトボタンをクリックすると、上記のコードが実行されます。
  2. sessioncookiesに保存されたユーザー情報が削除され、ログアウトが完了します。

まとめ

この記事では、状態を保持する理由とその具体的な手法について、sessioncookiesを例に解説しました。これらは、ユーザーが快適にサービスを利用するためには欠かせない機能です。


おわりに

ウェブアプリケーション開発での「状態管理」は初めての方には少し難しく感じるかもしれませんが、何事も慣れな気がします。頑張って開発していきましょう!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?