「玄関の鍵は閉めた?」Webのセッションを守るクッキー設定の基本を徹底解説
こんにちは。現場で泥臭いインシデント対応を重ねていると、意外なほど「基本」の積み重ねが重要だと痛感します。
今日は、Webアプリケーションを守るための「クッキー(Cookie)」の設定について、お話しします。「クッキー? お菓子かな?」と思った方も大丈夫。Webの世界におけるクッキーは、あなたとWebサイトとの間で交わされる「秘密の通行手形」のようなものです。
この通行手形が盗まれると、攻撃者は「あなたになりすまして」サイトを自由に操作できてしまいます。そんな事態を防ぐための、3つの魔法の合言葉(属性)を一緒に紐解いていきましょう。
—
1. なぜクッキーが狙われるのか?:泥棒の侵入経路
私たちがログインした後に発行される「セッションID」。これは、Webサイトが「ああ、この人はさっきログインしたあのユーザーさんですね」と識別するための大切な情報です。
もし、泥棒(攻撃者)がこの通行手形を盗み出せたらどうなるでしょうか? IDとパスワードを知らなくても、あなたの名前で買い物をしたり、個人情報を閲覧したりできてしまいます。これが「セッションハイジャック」という恐ろしい攻撃です。
この盗難を防ぐために、クッキーには「厳重な鍵」をかける必要があります。それが、これから紹介する3つの属性です。
—
2. 三つの守り神:HttpOnly, Secure, SameSite
① HttpOnly:JavaScriptからの覗き見をブロックする
ブラウザ上で動く「JavaScript」というプログラムは、便利ですが、悪意あるコードが混入するとクッキーを読み取ろうとします(これをXSS攻撃と言います)。
HttpOnlyを付けると、「JavaScriptからはクッキーを触らせない!」という鉄の掟が適用されます。
- 例えるなら: 玄関のドアの内側に「この鍵はプログラム(JavaScript)の手では絶対に回せない」という物理的なガードを取り付けるようなものです。
② Secure:通信の盗み聞きをブロックする
インターネット上の通信は、時に誰かに覗き見されるリスクがあります。暗号化されていない通信(HTTP)でクッキーを送ると、通信経路の途中で鍵が盗まれてしまいます。
Secureを付けると、「暗号化された安全な通信(HTTPS)でしかクッキーを送らないぞ」というルールになります。
- 例えるなら: 鍵を渡すとき、誰にも見られないよう、頑丈な防弾ケースに入れて運ぶようなイメージです。
③ SameSite:泥棒の「なりすまし」をブロックする
「CSRF(クロスサイトリクエストフォージェリ)」という攻撃は、あなたが知らない間に、悪意あるサイトがあなたのブラウザを使って「勝手にリクエストを送る」というものです。
SameSite属性は、そのクッキーが「どこのサイトからのリクエストで送られるべきか」を制限します。
- 例えるなら: 門番に「私の家(サイト)からの訪問者以外は、この通行手形を提示させてはいけないよ」と命令しておくようなものです。
—
3. 実践!セキュアなクッキーの設定例
それでは、実際にサーバー側でどう設定すればいいのか、コードで見てみましょう。今回はNode.js(Express)を例に挙げますが、考え方はどの言語でも同じです。
// クッキーを設定する時のコード例です
res.cookie(‘session_id’, ‘your-secret-session-id-here’, {
httpOnly: true, // JSからのアクセスを禁止(XSS対策)
secure: true, // HTTPS通信のみ許可(盗聴対策)
sameSite: ‘lax’, // 他サイトからのリクエスト時にクッキーを制限(CSRF対策)
maxAge: 3600000 // 1時間で期限切れにする(万が一の時の被害最小化)
});
設定のポイント
- HttpOnly: true は必須です。これがないと、XSS攻撃で一発でアウトです。
- Secure: true も必須です。今はHTTPSが当たり前の時代ですからね。
- SameSite: ‘lax’ は、多くのケースで推奨される設定です。利便性とセキュリティのバランスが一番良い「落とし所」になります。
—
最後に:完璧な防御は「小さな習慣」から
セキュリティと聞くと、何か巨大なシステムを導入しなければならないと思いがちです。しかし、今日お話ししたクッキーの属性設定は、たった数行のコードで実現できる「最高レベルの防犯対策」です。
新人の皆さんも、開発中のコードを見返して「あ、これHttpOnlyになってるかな?」とチェックする癖をつけてみてください。その小さな「気づき」こそが、世界中のユーザーを守る最強の武器になります。
一歩ずつ、一緒に強くなっていきましょう!何か分からないことがあれば、いつでもまた聞きに来てくださいね。
コメント