お役立ちコラム

RailsでCookieとセッションを理解してログインが何かを解説

今週は、弊社講師のだいそんが、「Railsで学ぶCookieとセッション〜入門編〜」と題して、初心者がつまずきやすい「HTTPのステートレス状態、Cookie、セッション、ログイン」についての勉強会を実施しました。RUNTEQでは、毎週、講師陣による勉強会が開かれています。テーマは、主に初学者のつまずきやすいポイントです。プログラミング学習がより深まるように、Railsだけではなく、Gitやデータベースなどについての勉強会も実施しています。19時から約1時間、ZOOMにて開催された模様の一部を、イベントレポートという形で紹介したいと思います。

みなさん、こんにちは、RUNTEQです。

RUNTEQでは、毎週、講師陣による勉強会が開かれています。

テーマは、主に初学者のつまずきやすいポイントです。プログラミング学習がより深まるように、Railsだけではなく、Gitやデータベースなどについての勉強会も実施しています。

今週は、弊社講師のだいそんが、「Railsで学ぶCookieとセッション〜入門編〜」と題して、初学者がつまずきやすい「HTTPのステートレス状態、Cookie、セッション、ログイン」についての勉強会を実施しました。

19時から約1時間、ZOOMにて開催された模様の一部を、イベントレポートという形で紹介したいと思います。

ログインを説明できますか?

だいそん
だいそん
今回の勉強会のゴールは、HTTPのステートレス状態とCookieとセッションの仕組みを理解してログインとは何かを説明できるようになることです。

current_userメソッドをなんとなく使っていませんか?

HTTPの性質を理解しよう

HTTPの性質はステートレスなので、クライアントとサーバーのやりとりは一度で完結し、やりとりの情報は毎回リセットされます。

よって、例えばECサイトでの購入する場合の、

ログインページでログインする →  商品をカートに入れる → カートの中身を見る → 商品がカートに入っている

という(当たり前に思える)情報を保持したページ遷移は、HTTPの性質上できないのです。

ステートレス → State + Less → 状態を持たない

Cookieとセッションでユーザーを識別する

HTTPの性質上できない、情報を保持したページ遷移を実現するために、Cookieとセッションという仕組みを利用します。

Cookieとは「ブラウザに保存される小さな情報またはその領域」です。

また、セッションとは「サーバ側で一時的に保持できる情報またはその領域」です。

このように、仮のテーブルのようにイメージできます。

処理のフローを意識しよう

Cookieとセッションを使ったログインの処理の実際のフローを見ていきましょう。
(説明の便宜上、実際の処理とは若干違うところもあります。)

  1. 【クライアント】ログインページを表示するリクエストを投げる(1回目のリクエスト始まり)
  2. ( サーバ )ログインページを返す(1回目のリクエスト終わり)
  3. 【クライアント】メールアドレスとパスワードを送る(2回目のリクエスト始まり)
  4. ( サーバ )送られて来た情報を元にデータベースからユーザー特定し、セッションにユーザーIDを格納する

    user = User.find_by(email: params[:email])
    if user&.authenticate(params[:password])
     session[:user_id] = user.id
    end

    セッションID ユーザーID
    0001  1

    このようなセッション情報がサーバ側で生成される。セッションIDとはサーバが独自に発行する一意な情報です。
  5. ( サーバ )セッションID0001をCookieに保存せよと指示を出す(2回目のリクエスト終わり)
  6. 【クライアント】ログイン後のページに遷移するとともにセッションID0001をCookieに保存する
  7. 【クライアント】ある情報に「いいね」をするリクエストを投げる。このときCookieに保存されている0001も一緒にサーバに送る(3回目のリクエスト始まり)
  8. ( サーバ )送られて来たセッションID0001を元にセッション情報を検索する。0001に該当する1行(っぽいもの)発見する。現在アクセスしているユーザーIDは1だ! と把握します

    # RailsがよしなにセッションID`0001`に対応する1行を取得するため開発者はセッションIDを意識する必要はない
    # session[:user_id] => 1
    user = User.find_by(id: session[:user_id])
  9. ( 開発者 )毎回、ユーザーを特定するコードを書くのは面倒だしわかりづらいので、セッションIDからセッション情報を検索し、ユーザーidを取得するcurrent_userというわかりやすい名前のメソッドを作成する def

    current_user
     User.find_by(id: session[:user_id])
    end

    以降、current_user.like(product)のように使うことができます。
  10. ( サーバ )「いいね」処理を完了してなんらかのレスポンスを返す(3回目のリクエスト終わり)

ログインとは?

だいそん
だいそん
セッションやCookieにユーザーの情報を保存することで、異なるHTTPリクエストに繋がりを持たせることを、「ログイン」と言うのですね。
だいそん
だいそん
では、ログイン機能以外でどんなところでセッションを使うのか、見ていきましょう。

勉強会はこの後、セッション機能を使う他の場面、セッションIDをCookieに保存する仕組み、セッションの保存先などについて、より実践に近い踏み込んだ内容へと移りました。

RUNTEQに入学していろんな勉強会に参加しよう

RUNTEQでは、ただカリキュラムを進めるだけではなく、さまざまなテーマで勉強会を実施しています。勉強会に参加することには多くのメリットがあります。

✔ カリキュラムで学習した知識が深まる
✔ 講師や受講生と顔を合わせることで、モチベーションの維持ができる
✔ 講師の共有画面で実際の挙動をその場で確認できる(今回は開発者ツールでCookieの保存場所を確認)
✔ 講師による関連情報の紹介

また、勉強会はほぼすべて録画されているので、都合が合わずに勉強会に参加することができなくても大丈夫です。時間のあるときに、ゆっくり学習することができます。

RUNTEQにご興味のある方は、下記リンクより、お気軽に説明会へご参加ください。
https://runteq.jp/

この記事を読んだ方にオススメ