今週は、弊社講師のだいそんが、「Railsで学ぶCookieとセッション〜入門編〜」と題して、初心者がつまずきやすい「HTTPのステートレス状態、Cookie、セッション、ログイン」についての勉強会を実施しました。RUNTEQでは、毎週、講師陣による勉強会が開かれています。テーマは、主に初学者のつまずきやすいポイントです。プログラミング学習がより深まるように、Railsだけではなく、Gitやデータベースなどについての勉強会も実施しています。19時から約1時間、ZOOMにて開催された模様の一部を、イベントレポートという形で紹介したいと思います。
みなさん、こんにちは、RUNTEQです。
RUNTEQでは、毎週、講師陣による勉強会が開かれています。
テーマは、主に初学者のつまずきやすいポイントです。プログラミング学習がより深まるように、Railsだけではなく、Gitやデータベースなどについての勉強会も実施しています。
今週は、弊社講師のだいそんが、「Railsで学ぶCookieとセッション〜入門編〜」と題して、初学者がつまずきやすい「HTTPのステートレス状態、Cookie、セッション、ログイン」についての勉強会を実施しました。
19時から約1時間、ZOOMにて開催された模様の一部を、イベントレポートという形で紹介したいと思います。
ログインを説明できますか?
current_user
メソッドをなんとなく使っていませんか?
HTTPの性質を理解しよう
HTTPの性質はステートレスなので、クライアントとサーバーのやりとりは一度で完結し、やりとりの情報は毎回リセットされます。
よって、例えばECサイトでの購入する場合の、
ログインページでログインする → 商品をカートに入れる → カートの中身を見る → 商品がカートに入っている
という(当たり前に思える)情報を保持したページ遷移は、HTTPの性質上できないのです。
ステートレス → State + Less → 状態を持たない
Cookieとセッションでユーザーを識別する
HTTPの性質上できない、情報を保持したページ遷移を実現するために、Cookieとセッションという仕組みを利用します。
Cookieとは「ブラウザに保存される小さな情報またはその領域」です。
また、セッションとは「サーバ側で一時的に保持できる情報またはその領域」です。
このように、仮のテーブルのようにイメージできます。
処理のフローを意識しよう
Cookieとセッションを使ったログインの処理の実際のフローを見ていきましょう。
(説明の便宜上、実際の処理とは若干違うところもあります。)
- 【クライアント】ログインページを表示するリクエストを投げる(1回目のリクエスト始まり)
- ( サーバ )ログインページを返す(1回目のリクエスト終わり)
- 【クライアント】メールアドレスとパスワードを送る(2回目のリクエスト始まり)
- ( サーバ )送られて来た情報を元にデータベースからユーザー特定し、セッションにユーザーIDを格納する
user = User.find_by(email: params[:email])
if user&.authenticate(params[:password])
session[:user_id] = user.id
end
セッションID ユーザーID
0001 1
このようなセッション情報がサーバ側で生成される。セッションIDとはサーバが独自に発行する一意な情報です。 - ( サーバ )セッションID
0001
をCookieに保存せよと指示を出す(2回目のリクエスト終わり) - 【クライアント】ログイン後のページに遷移するとともにセッションID
0001
をCookieに保存する - 【クライアント】ある情報に「いいね」をするリクエストを投げる。このときCookieに保存されている
0001
も一緒にサーバに送る(3回目のリクエスト始まり) - ( サーバ )送られて来たセッションID
0001
を元にセッション情報を検索する。0001
に該当する1行(っぽいもの)発見する。現在アクセスしているユーザーIDは1
だ! と把握します
# RailsがよしなにセッションID`0001`に対応する1行を取得するため開発者はセッションIDを意識する必要はない
# session[:user_id] => 1
user = User.find_by(id: session[:user_id]) - ( 開発者 )毎回、ユーザーを特定するコードを書くのは面倒だしわかりづらいので、セッションIDからセッション情報を検索し、ユーザーidを取得する
current_user
というわかりやすい名前のメソッドを作成する def
current_user
User.find_by(id: session[:user_id])
end
以降、current_user.like(product)
のように使うことができます。 - ( サーバ )「いいね」処理を完了してなんらかのレスポンスを返す(3回目のリクエスト終わり)
ログインとは?
勉強会はこの後、セッション機能を使う他の場面、セッションIDをCookieに保存する仕組み、セッションの保存先などについて、より実践に近い踏み込んだ内容へと移りました。
RUNTEQに入学していろんな勉強会に参加しよう
RUNTEQでは、ただカリキュラムを進めるだけではなく、さまざまなテーマで勉強会を実施しています。勉強会に参加することには多くのメリットがあります。
✔ カリキュラムで学習した知識が深まる
✔ 講師や受講生と顔を合わせることで、モチベーションの維持ができる
✔ 講師の共有画面で実際の挙動をその場で確認できる(今回は開発者ツールでCookieの保存場所を確認)
✔ 講師による関連情報の紹介
また、勉強会はほぼすべて録画されているので、都合が合わずに勉強会に参加することができなくても大丈夫です。時間のあるときに、ゆっくり学習することができます。
RUNTEQにご興味のある方は、下記リンクより、お気軽に説明会へご参加ください。
https://runteq.jp/