kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

httpのsessionとcookieの話

webの開発を10年以上しているもの同士の会話で「sessionとcookieの仕組みって詳しくわからないんだよね」と言われました。

確かに利用ケースは理解しているが、仕組みを理解していない人は多いと思っています。

そんな経緯があり、自分が説明した内容を書いてみようと思って記事を書きます。

sessionとcookieユースケース

HTTPは状態を保てないため、sessionという仕組みで解決しています。

状態とは、「ログインしている状態」「カートに商品をいれている内容」などがあります。

個人的なsessionとcookieのイメージは次の内容だと思います。

  • ユーザー側で保存したい場合はcookie
  • サーバー側で管理したい場合はsession

cookie

cookieはブラウザにドメインごとに保存することが可能です。

cookieはブラウザを閉じても残り、認証が必要なアプリでログアウトしても残ります。

cookieはサーバーにHTTPヘッダに含める形で送られます。ここが重要でHTTPヘッダを確認するとCookieという項目でkey=valueの形で渡されていることが確認できます。

よく使うパターンは検索条件の保存や以前の値を残しておくために使用したりします。

session

sessionはブラウザを閉じたり、ログアウトしたりすると消えます。

sessionで保存される内容はサーバー側で保存されます。

サーバーで保存されているセッション情報はセッションIDで区別されます。セッションIDはcookieに保存されます。サーバーにアクセスするとcookie情報も送られるので、cookieのセッションIDからセッション情報を区別して取得することができます。

セッションで保存した値は、HTTPアクセスに乗ることはありません。

サーバーでの保存の仕方は設定により違いますが、ファイルやmemcachedなどに保存したりします。

基本的には消えても大丈夫な復旧可能データをセッションで扱う必要があります。

ユースケースは認証状態や認証情報の保存などで使用されます。

cookieとsessionの違いがわからない原因

cookieはブラウザ、sessionはサーバーのイメージも強いと思います。

主にphpでコードを書いていますが、個人的にはサーバーでcookieの値を使用できることがイメージしづらい要因になっていると思っています。

echo $_COOKIE["name"]

webを書いていると、DBに値を保存せずブラウザごとにデータを持たせたい場合にcookieに保存して使うことが多く、セッションに使うのは認証ぐらいだと思います。(ショッピングカート機能はどっちに持たせるのかな。やったことないけど、セッションか)

そのためcookieは明示的にコードを書きますが、セッションに保存することを明示的に書く機会は少ないですよね。

理解していない人の場合、以下の内容がわからない場合が多いと思います。

  • どこに保存されているか
  • cookieがHTTPヘッダーに付与されてセッションIDが送られていること

まぁ、理解をしていなくてもユーザーの要望に対応できる機能を作れるため理解しない人も多いのかもしれないですね。

理解しない場合のデメリット

理解していなくても正直いいと思っている部分もあります。詳しくわからなくてもフレームワークが吸収することで高級なアプリを作れることはいいことだと思っています。難しい部分を理解しなくてもサービスが作れることはいいことだと思っています。

ただ理解していないデメリットもあることを理解しているとなにかあった際にすぐに対応することができるため、知識として知っておくことも必要です。

セキュリティについては理解していないとなぜ脆弱性になるのかがわからないと思います。

CSRFの仕組みも理解できないとおもいます。

まとめ

sessionとcookieの理解について、書いてみました。

正直詳しい記事は多く、いろんな記事を見て理解をしてみるといいと思います。

個人的にはHTTPヘッダを見てみること、サーバーに保存されている内容を見てみると理解度が増すと思います。

友人に説明しても納得してもらえなかったけど、書いてみることで整理できると思って書いた部分もありますが、次の説明でも伝えることができなさそうな気がします。