49
27

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 3 years have passed since last update.

[Rails]sessionとcookies。得意になりたくない?

Last updated at Posted at 2021-04-17

はじめに

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.パスワードの暗号化を有効にするための設定をする。

app/models/user.rb
...

has_secure_password
...

3.コントローラーにsessionに関する記述を記載する。

app/controllers/sessions_controller.rb
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)

49
27
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
49
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?