セッションとクッキーの違いって意外と理解していない
どうも、僕です。もうすぐバレンタインデーですね。クッキーとかセッションとか、本当によくわかっていません。サービス運営者、開発者でもなかったので、意識したことない&面倒そうなので敬遠していたのですが、今更、セッションとクッキーについて調べてみました。
cookieとは
Cookieとは、Webサイトの提供者が、Webブラウザを通じて訪問者のコンピュータに一時的にデータを書き込んで保存させる仕組み。
Cookieとは|HTTP Cookie|クッキー − 意味 / 定義 / 解説 / 説明 : IT用語辞典
ものすごく雑にいうと、サイトを見たときに、ブラウザ側に保存されるテキストデータ(っぽいもの)。
一旦セットされたクッキーは、再度読み込まれたりする。基本はホスト単位(www.example.comとか)で制御されるが、ドメイン指定も可。1つのページに1つのcookie、ではない。自分の環境で「 https://www.google.co.jp/ 」を開くと、cookieが複数セットされました。あとは、日本語もエンコード/デコードすれば使えるようです。
実際のクッキーは、ブラウザに格納されているので、見ようと思えばみられます。
Chrome で Cookie の消去、有効化、管理を行う - パソコン - Chrome ヘルプ
余談・アドテクへの展開
クッキーは、はやりのアドテクでも利用されています。例えば、ユーザーのトラッキングや、データの名寄せなど。
sessionとは
特に、Webの分野ではアクセス数の単位の一つで、Webサイトを訪れたユーザがサイト内で行う一連の行動をまとめて1セッションという。
セッションとは|session − 意味 / 定義 / 解説 / 説明 : IT用語辞典
実際に、なにかあるわけではなく、「概念」。
ということで、実際の動きを確認。
プレーンな通信
cookieを受け取っていない、一番最初の通信。 amazonでの事例。
- request
GET http://www.amazon.co.jp/ HTTP/1.1
Host: www.amazon.co.jp
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: ja,en-US;q=0.8,en;q=0.6
最初に、アマゾンにリクエストを送ってみました。すると、レスポンスが返ってきます(ページが表示された状態)
- responce
HTTP/1.1 200 OK
Date: hogehoge, hogehoge hogehoge 2016 00:00:00 GMT
Server: Server
Set-Cookie: skin=noskin; path=/; domain=.amazon.co.jp
pragma: no-cache
x-amz-id-1: hogehoge
cache-control: no-cache
x-frame-options: SAMEORIGIN
expires: -1
Vary: Accept-Encoding,User-Agent,Avail-Dictionary
Content-Type: text/html; charset=UTF-8
Set-cookie: x-wl-uid=hogehoge; path=/; domain=.amazon.co.jp; expires=hogehoge, hogehoge-hogehoge-hogehogehogehoge 00:00:00 GMT
Set-cookie: session-id-time=hogehoge; path=/; domain=.amazon.co.jp; expires=hogehoge, hogehoge-hogehoge-hogehogehogehoge 00:00:00 GMT
Set-cookie: session-id=hogehoge; path=/; domain=.amazon.co.jp; expires=hogehoge, hogehoge-hogehoge-hogehogehogehoge 00:00:00 GMT
Content-Length: hogehoge
「Set-cookie」で、cookieのデータを渡されています。その中に「session-id」の文字が!
cookie受け取り後の通信
続いて2回目のアクセス。
- request
GET http://www.amazon.co.jp/ HTTP/1.1
Host: www.amazon.co.jp
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: ja,en-US;q=0.8,en;q=0.6
Cookie: skin=noskin; x-wl-uid=hogehoge; session-token=hogehoge; ubid-acbjp=hogehoge; session-id-time=hogehoge; session-id=hogehoge; csm-hit=hogehoge
こちらから、先ほど受け取った情報を送信しています。その中に、「session-id」も含まれています。
- responce
HTTP/1.1 200 OK
Date: hogehoge, hogehoge hogehoge 2016 00:00:00 GMT
Server: Server
Set-Cookie: skin=noskin; path=/; domain=.amazon.co.jp
pragma: no-cache
x-amz-id-1: hogehoge
cache-control: no-cache
x-frame-options: SAMEORIGIN
expires: -1
Vary: Accept-Encoding,User-Agent,Avail-Dictionary
Content-Type: text/html; charset=UTF-8
Set-cookie: ubid-acbjp=hogehoge; path=/; domain=.amazon.co.jp; expires=hogehoge, hogehoge-hogehoge-hogehogehogehoge 00:00:00 GMT
Set-cookie: session-id-time=hogehoge; path=/; domain=.amazon.co.jp; expires=hogehoge, hogehoge-hogehoge-hogehogehogehoge 00:00:00 GMT
Set-cookie: session-id=hogehoge; path=/; domain=.amazon.co.jp; expires=hogehoge, hogehoge-hogehoge-hogehogehogehoge 00:00:00 GMT
Content-Length: hogehoge
セットされたcookieの中にもまた「session-id」が。
このように、「session-id」がやりとりされcookieに保存され、再度取り出されて、一連の通信が同一のセッションであることがわかるんですね。
参考・サイト運用時に考えないといけないセキュリティまわり
セキュリティリスクも考えないとなんですね。
セッションに関するセキュリティリスクについて勉強してみた! - 酒と泪とRubyとRailsと
次回の課題
header情報って面白いなと思いながら、「Brotli」について調べてみたいとおもいます。