はじめに
Railsチュートリアルでも出てきました「session」と「cookies」の使い方がかなり難しいなと感じたのですが、同じ気持ちになった人は、たくさんいるかと思います。。
初心者では、チュートリアル完遂後にすぐ理解して使いこなすのは難しいと思うので、この記事を見れば「使い方がわかった!」というレベルまで持っていけたらと思います!
sessionについて
sessionとは、ステートフルな通信を実現するための仕組みのことです。
sessionは主にログイン機能に使用されるもので、ログイン状態を持続させるためにあります。
また、sessionの情報はRails標準では、ブラウザ側のクッキーに保存されるということも合わせて覚えておいてください。
sessionは明示的に削除する(又は有効期限切れになる)まで消えない
ので、不要になった際には削除するようにしましょう。
sessionの使い方
セッションに情報を保存する
# session[キー] = 値
session[:user_name] = 'test'
#=> sessionに[:user_name]という名前をつけて「'test'」という文字を格納
セッション情報を削除
reset_session
#=> 全てのsessionを削除
session[:user_name] = nil
session[:user_name].clear
session.delete(:user_name)
#=> [:user_name]の値を削除(3つとも)
現在のセッション情報を取得
session.session_id
#=> 現在保存されているsession情報を取得
実際に使ってみる!
よくある使い道として、ログイン機能がありますが、簡単に実装手順を示しました!
※Userモデル作成済の前提で行っています。
1.Gemfileに以下を追記する。
gem 'bcrypt' # データベースにパスワードを保存する際に、暗号化してくれる
追記後は、以下コマンドを実行する。
$ bundle install
2.パスワードの暗号化を有効にするための設定をする。
...
has_secure_password
...
3.コントローラーにsessionに関する記述を記載する。
class SessionsController < ApplicationController
def index
if session[:user_name]
@notice = "#{session[:user_name]}でログイン済です。" # セッションに情報が保存されるか判断
end
if params.key?(:name) || params.key?(:password)
user = User.find_by_name(params[:name])
if user && user.authenticate(params[:password]) # パスワードがユーザーがポストした値と一致しているのか判断
session[:user_name] = params[:name] # sessionを設定
else
session[:user_name] = nil # sessionを削除
end
end
end
end
cookiesについて
cookiesとは、クライアント側のブラウザにあるデータ保存領域のこと。
Railsではデフォルトではsessionを管理するためにブラウザのcookieを利用する。
そもそもcookieは、Webアプリがブラウザを通してクライアントにデータを保持させる機能のことで、要するにユーザー側に持たせている情報と思えばいい。クライアントが情報を持っているので、ブラウザを閉じても破棄されないし、暗号化しないと簡単に読み取られて情報を奪われてしまいます。
実際にはDBにもハッシュ化した情報を保存し、次回訪問時にCookieの内容と突き合わせてログイン状態を参照するという方法を取ることが多いです。
cookiesの使い方
cookieの保存
# cookies[:cookie名] = { key: cookie情報 }
cookies[:user_name] = "david"
#=> cookieに保存
cookies[:lat_lon] = [47.68, -122.37]
#=> cookieに配列を保存
cookies[:login] = { value: "XJ-122", expires: 1.hour.from_now }
#=> cookieにハッシュを保存
オプション | 説明 | デフォルト値 |
---|---|---|
:value | cookieの値 | - |
:path | cookieが有効なパス | - |
:domain | cookieが有効なドメイン | 現在のホスト |
:expires | cookieの有効期限 | / |
:secure | 暗号化通信でのみcookieを送信 | false |
:httponly | HTTPcookieを有効 | false |
永続化cookie(有効期間が20年に設定されたクッキー)を設定
# cookies.permanent[cookie名] = 値
cookies.permanent[:user_name] = "Jamie"
#=> [:user_name]に"Jamie"を永続化cookieとして保存
####署名付きcookie(クライアント側の改ざん防止可能)を設定
# cookies.signed[クッキー名] = 値
cookies.signed[:user_id] = 45
#=> 署名付きcookieを設定
cookieの削除
# cookies.delete(:クッキー名 [, 対象のドメイン、またはパス])
cookies.delete :user_name
#=> :user_nameで保存されているcookieを削除
終わりに
使い方自体は意外と簡単なものですね!
これをどのように使うのが難しい所ですが、、、、
大体は、ログイン機能や検索条件の保存などが多いと思うので、その場面に直面した際はこの記事で培った知識を発揮してください!!!
参考
[【Rails】Sessionの使い方について]
(https://qiita.com/ozackiee/items/4ee774c81b2a0c571c05)
[【Rails入門】sessionの使い方まとめ]
(https://www.sejuku.net/blog/33677)
[Rails ドキュメント クッキー・キャッシュ]
(https://railsdoc.com/cookie_cache)