LaravelのセッションとCookie,HTTP,CSRF

概要

  • cookie
  • セッション
  • HTTP
  • ログイン
  • ステートレス

cookieはPC上のブラウザごとに保存される情報、領域。
ブラウザを変えるとログイン情報は別のものになる。
ブラウザ上に保存されるので使用者は情報が見れる状態にあるのでパスワード保存はNG
chromeデベロッパーツールで確認できる

セッション

セッションはサーバー側で一時的に保存できる情報、領域。
DBテーブルのようなイメージ

セッションID ユーザーID 買い物かご
0001 1 りんご
0002 2

HTTP

身近な例に例えると日本の道路交通法
車は左側通行で信号が赤になったら止まる、青になったら進むなどのルールがあるが、インターネットの世界でもこのようなルールがある。
http,https→web通信の決まりごと
httpsは通信の暗号化。

httpsにするにはドメインごとに認証が必要。
HTTPの仕組みとしてはシンプルに2つでリクエストとレスポンスがあり、HTTP通信の流れとしては、クライアント側とWebサーバー側でHTTPリクエストHTTPレスポンスをやり取りする。

HTTPリクエストとHTTPレスポンス
  • クライアント側のPCでブラウザにURLを入力→クライアント側のPCからWebサーバーにHTTPリクエストを送信される。

  • WebサーバーがHTTPリクエストを受け取る→HTTPレスポンスをクライアント側のPCに送信します。 クライアント側のPCでWebページを表示します。

    HTTPの性質
    HTTPは、ステートレス(状態をもたない、保持できない)性質のこと。
    状態を保持しないのでHTTPではリクエスト/レスポンスの1往復のやり取りが完結された処理とみなされ、複数の処理を関連付けることができない。
    例えば、買い物かごに何が入ってるかとか、ログイン情報とかの情報を保持することができない。
    これを実現するためには、誰がリクエストを投げているのかをわかるようにするために、セッション,Cookieという機能を使用します。

    セッション、Cookie再掲

    HTTPはステートレスであるため、買い物かごに何が入ってるかとか、ログイン情報とかの情報を保持することができない。
    この問題を解決するためにあるのがセッションCookieのこと。
    ブラウザ(chrome,firefox...etc)とサーバ(Laravel,spring,Rails...etc)間でSession ID(ブラウザ側ではCookie、サーバ側ではセッション情報に保存)を共有し、そのSession IDを照会することでユーザを識別することが可能になる。
    また、ECサイトであればSessionの中にショッピングカードの情報を保存することでページを移動しても情報を保持することができる。

    laravelでみていく

    Laravelに関連するCookieは以下の2つで名前にはXSRF-TOKENとlaravel_sessionの2つがある。
    値には文字列が入り、Expiresには時刻がはいる。
    XSRF_TOKENはCSRF対策に使用するためのTOKENデータがはいっている。
    CSRFについて

    一般的に入力フォームで入力する場合、register.phpで入力した値をDB,サーバへ送る流れをとるが、
    CSRFの場合は偽物のregister.phpを用意して、見た目は全く同じだけど偽物のほうに誤ってメールアドレスやPWを入力すると悪意のあるサイトに誘導されたり、PWを抜かれたりする危険性がある。
    tokenを使って偽物からリクエストがきてるのか本物からリクエストがきてるのか判別している。
    GETやPOSTはサーバーにデータを渡すと1回きりでそのデータが消えてしまうがセッションはデータを残すことができるのでセッションをつかってtokenをサーバーとやり取りする


cookieの名前はデフォルトではlaravel_sessionとなっているが、.envファイルのAPP_NAMEを変更すればcookieの名前も変わる。
サーバー側のセッションをlaraveldebugerで確認する。

SessionとCookieで同じIDがない理由、Cookieが持つIDが暗号化されているので、session_idに対応する値を持つものはCookie側にはない。
Cookieの暗号化はLaravel middlewareで行われる。

ログイン処理flow
  1. (ブラウザ)ログイン画面を表示するhttpリクエストを投げる(GET)(リクエスト1回目)
  2. (サーバー)ログインページを返す。(リクエスト1回目終わり)
  3. (ブラウザ)メールアドレス、PWを入力し送信(POST)(リクエスト2回目)
  4. (サーバー)送信されてきた内容を検索して、セッションにその内容をセッションIDとユーザーIDとして格納する。
  5. (サーバー)セッションIDをCookieへ保存する。(リクエスト2回目終わり)
  6. (ブラウザ)ログイン後のページに遷移するとともにセッションIDをCookieに保存する。

    まとめ

    セッションやCookieにユーザーの情報を保存することで異なるHTTPリクエストに繋がりを持たせることをログインと言う。