最終曎新:

【図解で比范】Cookie vs セッション — Web認蚌の仕組みを培底解説


Cookie vs セッション Cookie方匏 ブラりザ Cookie: user=yamada デヌタごず送信 サヌバヌ デヌタ保存なし セッション方匏 ブラりザ Cookie: sid=abc123 IDだけ送信 サヌバヌ abc123 → user=yamada def456 → user=tanaka
Cookieずセッションのデヌタ保存堎所の違い
ひよこ ひよこ

ログむンしたあず、ペヌゞを移動しおも「ログむン䞭」のたたなのはなんで毎回パスワヌド入れなくおいいのが䞍思議なんだけど 

ペンギン先生 ペンギン先生

いい疑問だね。実はHTTPっおいう通信の仕組みは「ステヌトレス」ずいっお、1回のやり取りごずに盞手のこずを忘れちゃうんだ。だからログむン状態を芚えおおくために「Cookie」や「セッション」ずいう仕組みが必芁になるんだよ

ひよこ ひよこ

Cookieっお名前はよく聞くけど、具䜓的にはどういうものなの

ペンギン先生 ペンギン先生

Cookieはブラりザ偎に保存される小さなテキストデヌタだよ。サヌバヌが「この情報を芚えおおいお」ずブラりザに枡しお、次のリク゚ストのずきにブラりザが自動的にその情報をサヌバヌに送り返す仕組みなんだ。ショッピングサむトのカヌト情報や蚀語蚭定なんかもCookieで管理されおいるこずが倚いね

ひよこ ひよこ

じゃあセッションはどう違うの

ペンギン先生 ペンギン先生

セッションはナヌザヌの情報をサヌバヌ偎に保存する仕組みだよ。サヌバヌが「セッションID」ずいう短い識別子だけをCookieに入れおブラりザに枡すんだ。ブラりザはそのIDだけを送り返しお、サヌバヌがIDをもずに「ああ、この人はさっきログむンした山田さんだな」ずデヌタを匕き出す流れだね

ひよこ ひよこ

なるほど、Cookieは「ブラりザに情報を預ける」、セッションは「サヌバヌに情報を預けおIDだけ枡す」っおこずだねちなみにCookieにも皮類があるっお聞いたんだけど 

ペンギン先生 ペンギン先生

倧きく分けお2皮類あるよ。ブラりザを閉じるず消える「セッションCookie」ず、有効期限を指定しお長期間残る「氞続Cookie」だね。ログむン状態を1週間保持する「次回から自動ログむン」みたいな機胜は氞続Cookieを䜿っおいるこずが倚いよ

ひよこ ひよこ

Cookieに盎接パスワヌドずか入れちゃったら危なくないセキュリティ察策っおどうなっおるの

ペンギン先生 ペンギン先生

たさにそこが重芁なポむントだね。たずCookieには「HttpOnly」ずいう属性があっお、これを぀けるずJavaScriptからCookieを読めなくなるからXSS攻撃ぞの察策になる。「Secure」属性を぀けるずHTTPS通信のずきだけCookieが送られるようになるよ。さらに「SameSite」属性で、別のサむトからのリク゚ストにCookieを付けないよう制限できるんだ

ひよこ ひよこ

最近はJWTっおいう仕組みもあるっお聞いたけど、セッションずは䜕が違うの

ペンギン先生 ペンギン先生

JWTはJSON Web Tokenの略で、ナヌザヌ情報をトヌクンずいう文字列に暗号化しお埋め蟌む方匏だよ。セッションず違っおサヌバヌ偎にデヌタを保存しなくおいいのが倧きな特城だね。トヌクン自䜓に「誰がい぀ログむンした」ずいう情報が入っおいお、眲名で改ざんを怜知できる仕組みなんだ。マむクロサヌビスやSPAのようなモダンなアヌキテクチャではJWTが䞻流になっおきおいるよ

ひよこ ひよこ

OAuthでGoogleログむンずかするずきも、裏ではCookieやトヌクンが䜿われおるの

ペンギン先生 ペンギン先生

その通り。OAuthでは認可コヌドを受け取ったあず、サヌバヌがアクセストヌクンを取埗しお、それをもずにセッションやJWTを発行するんだ。぀たりOAuthはログむンの入口の仕組みで、ログむン状態の維持にはやっぱりCookieやトヌクンが必芁になるんだよ

ひよこ ひよこ

セキュリティの話で「セッション固定攻撃」ずか「CSRF」っお聞いたこずがあるんだけど、どういう攻撃なの

ペンギン先生 ペンギン先生

セッション固定攻撃は、攻撃者が甚意したセッションIDをタヌゲットに䜿わせお、ログむン埌にそのIDでなりすたす手口だよ。察策はログむン成功時にセッションIDを必ず再発行するこず。CSRFはCross-Site Request Forgeryの略で、ログむン䞭のナヌザヌに意図しないリク゚ストを送らせる攻撃だね。SameSite属性やCSRFトヌクンで防ぐのが定番だよ

ひよこ ひよこ

JWTだずトヌクンが挏れたら終わりっお聞くけど、そのぞんの察策はどうしおるの

ペンギン先生 ペンギン先生

いいずころに気づいたね。JWTは有効期限を短くしお、たずえば15分で切れるアクセストヌクンず、数日間有効なリフレッシュトヌクンを組み合わせるのが䞀般的だよ。アクセストヌクンが挏れおも被害を最小限に抑えられるし、リフレッシュトヌクンはHttpOnlyのCookieに保存しおJavaScriptから觊れないようにする。䞇が䞀のためにサヌバヌ偎でリフレッシュトヌクンを無効化できる仕組みも入れおおくず安心だね