Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

クッキーとセッションについてキャバクラで例えてみる

More than 1 year has passed since last update.

クッキーとセッションがよくわからなかったのでざっくり整理してみた

登場人物

  • 太郎くん = クライアント
  • リサさん = サーバ
  • 上司 = 上司
  • こわいお兄さん = こわいお兄さん

プロローグ

太郎くんは社会人2年目の24歳。小さい頃から真面目に勉強に励み、世間的に一流と言われる大学に入学しました。大学でも真面目に勉強し、一流と呼ばれる企業に就職しました。ちなみに勉強一筋だった太郎くんには彼女がいたことがありません。
仕事も真面目に取り組み、少し精神的に余裕がでてきた5月。ゴールデンウィーク前日の週末に、太郎くんは上司に連れられて初めてキャバクラに行きました。緊張しつつもきれいな女性と喋ることができた太郎くんはその夜とても楽しみました。そんな太郎くんのその後の話です。

Chapter1

連休に入った太郎くんはキャバクラの楽しさが忘れられません。勇気を出して一人夜の街に向かいます。案内所のお兄さんに連れられ「HTTPぷろとこる」という名前のキャバクラに入店しました。しばらくするととても綺麗な女性が隣に座りました。太郎くんは緊張しながら話しかけます。
太郎くん「はじめまして。お名前を教えていただいてもよろしいですか?」
太郎くんはとても礼儀正しいです。

リサさん「リサだよ〜よろしくね!」
可愛かったので太郎くんは恋に落ちました。
太郎くん「リサさんはこのお店で働かれて長いんですか?」
リサさん「えーっとあなた誰ですか?」

太郎くんは都会の路地裏でウイスキーの瓶を抱きしめながら泣きました。

ステートレスな通信

太郎くんは何も悪くありません。リサさんも悪くありません。強いて言うならばHTTPプロトコルの仕様に罪があります。HTTP通信ではクライアントからのリクエストに対してサーバがレスポンスを返します。その1往復がそれぞれ独立していて前後の通信内容(ここで言うと会話の内容)を引き継ぎません。なのでリサさんが悪意をもって太郎くんを絶望の淵に落としてやろうとしたわけではないですし、太郎くんもそのことを知っていれば飲めないウイスキーに救いを求めることもなかったというわけですね。

Chapter2

ゴールデンウィークも終わり、太郎くんは上司に先日あったことを話しました。すると上司はこう言いました。
上司「それはお店の教育(設定)がよくないな。僕から言っておくからもう一度行ってきなさい。」

辛いことは酒で紛らわせることができるという事を覚えた太郎くんは玉砕覚悟でもう一度お店に向かいました。

太郎くん「はじめまして。太郎といいます。お名前は何ですか?」
リサさん「リサだよ〜よろしくね!はいこれ!(setcookie)」
太郎くん(これは…クッキー?僕の名前が書いてある…この1ヶ月ってどういう意味だろう)

太郎くん「リサさんはこのお店は長いんですか?」

リサさん(ジー)

太郎くん(クッキーを見てる…)

リサさん「まだ3ヶ月だよ!」

太郎くんの恋は再び燃え上がりました。

しばらく会話をしていると、太郎くんはトイレに行きたくなり席を立ちました。

席に戻ろうとすると、太郎くんが座っていた席にそれはそれはこわそうなお兄さんが座っていました。そしてとても楽しそうにリサさんと喋っていました。

太郎くん(なんでこの人も僕の名前が書いてあるクッキーを持ってるんだろう…)
太郎くん「アノ…ソコ…ボクノ…セキ…」

こわいお兄さん「あぁん!!何だてめーは!!俺のリサになんか用か!?コラ!!!」

リサさん「ちょっと止めなよ太郎くん、あの人恐がってんじゃん!」

太郎くんは筋肉こそすべてとストイックな生活を送り始めました。

Cookie

初めて訪問したサイトでは、サーバはリクエスト時Cookieが無いクライアントに対して、レスポンスと一緒にCookieを返します。
クライアントはWebブラウザにCookieを保存し、リクエストのたびにCookieの情報を付けてサーバにリクエストを送ります。そうすることでサーバはCookieの情報を基にアクセスが2回目以降のクライアントに対して適切なレスポンスを返します。
Cookieだけでステートフルな通信をすることも可能ですが、改竄可能なため一般的にはセッションを使ってステートフルな通信を実現します。そのため大事な情報はCookieで扱わないようにします。また、有効期限も適切に設定しなければいけません。こわいお兄さんは太郎くんのCookieを利用してリサさんとよろしくしてたわけですね。※1

Chapter3

異様なまでに隆起した筋肉を身につけているのに暗い表情の太郎くんを気遣い上司が声をかけました。太郎くんはまたお店での出来事を言いました。
上司「ふんふん、あと一歩だな。もう一度僕の方から言っておくから今週末にまた行きなさい。」

信用できるものは筋肉だけなのだと心に決めた太郎くんは半ばやけくそでもう一度お店へ向かいました。

太郎くん(あっこないだのクッキー持ってないや…まあいいか…僕にはこの丸太のような二の腕がついてるさ…)
太郎くん「はじめまして。太郎といいます。お名前はなんですか?」
session_start();
リサさん「リサだよ〜よろしくね!はいこれ!(set_cookie)」
太郎くん(またクッキー…でも今度は意味がわからない文字と数字の羅列が書いてある…)

太郎くん「リサさんはこのお店は長いんですか?」

リサさん(ジー)

太郎くん(クッキーを見てる…)

リサさん「まだ4ヶ月だよ!」

太郎くんは微動だにしません。

その後しばらく楽しく会話をしました。そして太郎くんはトイレに向かいました。

トイレから戻るとまたもやこわいお兄さんが座っていました。しかしなんだか前回とは様子が違います。

こわいお兄さん「ほら俺だよ!太郎だよ」
リサさん「あなたは太郎くんじゃないです。」

太郎くんは愛という言葉を知りました。

太郎くん「失礼。私が太郎ですが。」ムキムキ

こわいお兄さん「うるせえなテメー!(あっ…すごい筋肉…)」

太郎くん「なにか?」ムキムキ

こわいお兄さん「ナンデモネーヨ…チッ…」

その夜太郎くんは充実感とともに眠りにつきました。

session

1回目のアクセスの際セッションIDを持っていないクライアントに対してサーバはセッションIDを発行し、セッションIDごとにセッションファイルを作成します。そしてセッションIDをCookieに保存するようレスポンスを返し、クライアントはCookieにセッションIDを保存します。2回目以降のアクセス時には、クライアントが送ってきたセッションIDとサーバが保持しているセッションIDを照合し同一人物であることを確認します。また、セッションIDと一緒にセッション情報(名前とか)を送りサーバ側に情報を保持させます。

Chapter4

ごきげんな太郎くんは今週末もお店へ繰り出します。
太郎くん(あっクッキー捨てちゃってた…まあいいか、僕とリサさんの関係はそんなものを超越してしまったのだし)
太郎くん「あっリサさんおひさしぶりです。」
リサさん「あなた誰ですか?」

fin

まとめ

本当にざっくり理解するために書いたのでいろいろ間違っているかもしれません。ご指摘等いただけると幸いです。※1のところなんかはまだ良くわかっていません…
セッション管理他にもはいろいろな方法があるみたいで、まだまだ知識が足りてませんが少しでも参考になれば嬉しいです。

太郎に幸あれ!

goriland
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away