👏

そろそろ理解しよう"セッション"と"クッキー"

2021/05/26に公開

結構聞かれることが多くなってきたので、自分の復習がてらにまとめる
参考にさせていただいた動画

前提

HTTP通信はステートレス(状態を持たない)なので、前のリクエストと今のリクエストが同じユーザーで行ってるかどうかの認識がサーバ側で判断できない

セッション

セッションとは大抵、前のリクエストと今のリクエストを同一のユーザーとして認識することという意味

前のリクエストと今のリクエストを、同一のユーザーとして認識してくれなくなった
👉セッション切れを起こした

クッキー

  • セッションにおけるクッキーは、ブラウザとサーバの通行手形のようなもの
  • クッキーには同一ユーザーだとわかる最低限のデータ、(ユーザーIDなど)だけ持たせる

セッションのためにクッキーを使う
👇言い換えると...
サーバが同一ユーザーのリクエストであることを、認識するため(目的)にクッキーを使う

クッキー生成手順

  1. ブラウザのリクエスト時、サーバがクッキーを作ってブラウザに渡す(ブラウザがクッキーを持ってない場合発火)
  2. 次回アクセス時にブラウザから、サーバにクッキーを渡して同一ユーザーだと認識してもらう

クッキーの特徴

  • クッキーは4KBまでしか保存できないので、大きなデータは保存できず、データにはメタ情報や有効期限、有効ドメインなどが書かれている
  • クッキーはブラウザ(クライアント)で保存してるため、ユーザー側で書き換えが可能

クッキーの確認

デベロッパーツールの、アプリケーションタブ内で、今ブラウザにあるクッキーが見れる

セッションID

サーバがクッキーを生成してブラウザに渡す際、大きく分けて2つのやり方がある

1. セッションIDを使わずに、クッキーにデータを入れる

👉署名付きの暗号化をするのが一般的

例:暗号化したユーザーIDをクッキーに入れ、ブラウザに渡す

2. クッキーにセッションIDを入れる

👉サーバ側でセッションIDというIDを発行、それをクッキーに埋め込む
👉基本的に各webサービスはこっちを使ってる

例:ユーザーIDはRedisなどのデータストアに入れておき、ユーザーIDと紐づくセッションIDを生成し、セッションIDが書かれたクッキーを渡す

結論

セッションは目的でクッキーは手段

TIPS

セッションハイジャック・・・悪意のあるユーザーにクッキーを盗まれ、そのユーザーが盗まれた人として、サーバに認識されること

Redis・・・nosql、複雑なことはできないが、速度が早いといった利点がある
セッションを保存するデータベースとして、複雑に保存しておくMySQLなどのデータベースと分けて設置される
この時データはMySQLとRedisに重複して保存されることになる

GitHubで編集を提案

Discussion