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

# はじめに
Railsチュートリアルでも出てきました「session」と「cookies」の使い方がかなり難しいなと感じたのですが、同じ気持ちになった人は、たくさんいるかと思います。。
初心者では、チュートリアル完遂後にすぐ理解して使いこなすのは難しいと思うので、この記事を見れば「使い方がわかった！」というレベルまで持っていけたらと思います！


## sessionについて
sessionとは、ステートフルな通信を実現するための仕組みのことです。
sessionは主にログイン機能に使用されるもので、ログイン状態を持続させるためにあります。
また、sessionの情報はRails標準では、ブラウザ側のクッキーに保存されるということも合わせて覚えておいてください。
`sessionは明示的に削除する（又は有効期限切れになる）まで消えない`ので、不要になった際には削除するようにしましょう。

### sessionの使い方

#### セッションに情報を保存する

```ruby
# session[キー] = 値

session[:user_name] = 'test'
#=> sessionに[:user_name]という名前をつけて「'test'」という文字を格納
```

#### セッション情報を削除

```ruby
reset_session
#=> 全てのsessionを削除

session[:user_name] = nil
session[:user_name].clear
session.delete(:user_name)
#=> [:user_name]の値を削除(3つとも)
```

#### 現在のセッション情報を取得

```ruby
session.session_id
#=> 現在保存されているsession情報を取得
```

### 実際に使ってみる！
よくある使い道として、ログイン機能がありますが、簡単に実装手順を示しました！
※Userモデル作成済の前提で行っています。

1.Gemfileに以下を追記する。

```ruby
gem 'bcrypt' # データベースにパスワードを保存する際に、暗号化してくれる
```

追記後は、以下コマンドを実行する。

```ruby
$ 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の保存

```ruby
# 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年に設定されたクッキー)を設定

```ruby

# cookies.permanent[cookie名] = 値

cookies.permanent[:user_name] = "Jamie"
#=> [:user_name]に"Jamie"を永続化cookieとして保存
```

####署名付きcookie(クライアント側の改ざん防止可能)を設定

```ruby
# cookies.signed[クッキー名] = 値

cookies.signed[:user_id] = 45
#=> 署名付きcookieを設定
```

#### cookieの削除

```ruby
# 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)