🐕

【セキュリティ】セッションの基本

に公開

はじめに

前回、ステートレスとステートフルについて解説しました。
前者は前回の状態を記憶せず、その場で完結するコミュニケーションであったのに対し、後者は前回の状態を記憶したコミュニケーションのことであるとまとめました。

しかし、状態を記憶しないステートレスな通信の場合、以前コミュニケーションをとったユーザーのことはどうやって記憶しているのでしょうか?何らかの形で記憶していないと過去の情報を知ることができません。
例えば、ECサイトを想定すると、カートに入れた商品を再度確認しようとする場合、どうやってその情報を保持するのでしょうか。
この課題をクリアする技術としてクッキー(Cookie)セッションがあります。
今回は以前にまとめたクッキーについて簡単におさらいしつつ、セッションについて解説していきます。

クッキー(cookie)とは

Webサイトが使用しているブラウザに保存する小さなメモのことです。

この点を見ていく前に、HTTP通信の特徴を押さえておく必要があります。
そもそもHTTP通信はHTTPプロトコルを使用した通信のことで、この通信は1回ごとに通信が完結するステートレスな通信です。そのため、前回の内容を記憶しない、いわゆる状態を持たず、サーバーはクライアントの状態を覚えておく仕組みがありません。
そこでクッキーを利用することで、ユーザー状態を知った上でやり取りできるようになります。

クッキーはサーバーからクライアント(ブラウザ)に「この情報を保存しておいてね」という形で送られ、次回以降ブラウザからサーバーに自動で送信されます。これによりサーバー側で、「あっ、前回ログインしてショッピングカートにセーターを追加した人だな」と判別する材料になります。
情報はクライアントであるブラウザ側で保持することになります。

クッキーの問題点

便利なクッキーですが、以下のような問題点があります。

① 改ざんできる
クッキーはブラウザに保存されるテキストデータですが、ブラウザから簡単に内容を書き換えることが可能です。
これにより、悪意のある第三者がブラウザでクッキーを書き換えたり、そのまま使用したりすることで、他人のアカウントに不正アクセスできてしまいます。
例えば、JavaScriptでcookieを設定すると、任意のセッションIDを作成することができます。
※JavaScriptからcookieを操作することができます。

// 元の値「user_id=123」を改ざん
document.cookie = "user_id=456"; 

② 重要なデータが丸見えになる
HTTPレスポンスには、

Set-Cookie: credit_card=5555-1234-5678-9012;...

のような形式でデータが含まれます。
この場合、第三者に見られてしまうとまずいような重要な情報を含んでいることになります。

重要なデータをクッキーに保存すると改ざんされる危険があり、ユーザー側で管理すると漏洩するリスクが高いため、セッションという仕組みが使われます。

セッション(session)とは

サーバー側で管理される、一連のユーザー操作に関する一時的な状態情報のことを指します。
例えば、ショッピングサイトにログインし、カートに商品を追加、そして購入せずログアウト、といったこの一連の流れを指します。

ステートレスはHTTP通信では、通常このログインする操作やカートに商品を追加する操作は独立しており、都度通信が完了してしまうため、同一ユーザーが行なっているかどうかがわからなくなってしまいます。
そこで、セッションID(ランダムな識別子をクッキーでクライアントと共有)とクッキーを使用してユーザーをサーバー側で管理することで、どのユーザーとどんな取引かを記憶することができ、ステートレスなHTTP通信に『状態』を追加することができます。

Image 2025-04-12 at 19.29.jpeg

サーバーはユーザーからリクエストがあると、セッションIDを発行し、クッキーにこの発行したセッションIDを含めてクライアントであるブラウザに送信します。
ブラウザはこのセッションIDをもったクッキーをサーバーに送信し、サーバーが送られてきたクッキーを照合することでどのユーザーのどんな行動かを記憶できるようになります。
こうして、ステートレスな通信でステートフルな通信を擬似的につくることができます。

まとめ

ステートレスな通信でステートフルに近づけるために、クッキーとセッションという技術が使われていることを解説しました。
最後までお読みいただき、ありがとうございました。

参考・画像引用元URL

https://zenn.dev/collabostyle/articles/8949e8db686263
https://shukapin.com/infographicIT/session-management
https://zeroterasu.com/blog/php/php_session/
https://speakerdeck.com/mu_zaru/setusiyontokutukifalsemi
『イラスト図解式 この一冊で全部わかるWeb技術の基本 第2版』
https://nextribe.co.jp/posts/sessions-and-cookies

Discussion