玄関の鍵、かけ忘れていませんか?Webアプリの「クッキー」を守るための基本のキ
こんにちは!セキュリティの現場で日々、複雑なインシデントと格闘しているエンジニアです。
今日は、皆さんがWebサイトを作る際や運用する際に必ず耳にするであろう「クッキー(Cookie)」の話をしましょう。特に、「Secure」「HttpOnly」「SameSite」という3つの呪文のような属性についてです。
これらを設定することは、言ってみれば「家の玄関に頑丈な鍵をかけ、窓にも防犯フィルムを貼る」ようなもの。逆に言えば、これらを放置することは、鍵を開けっ放しで外出するのと同じくらい危険なんです。
今日は、なぜこの3つの設定が重要なのか、泥棒(攻撃者)の視点も交えながら、優しく紐解いていきましょう。
—
1. クッキーは「デジタルの通行手形」
まず、クッキーとは何かを例え話でお話しします。
皆さんが会員サイトにログインすると、サーバーから「あなたは〇〇さんですね」という証明書が渡されます。これがクッキーです。ブラウザはページを移動するたびにこの通行手形をサーバーに見せることで、「ログインし直さなくてもいいですよ」という体験を実現しています。
もし、この通行手形が誰かに盗まれてしまったら?
泥棒はあなたの顔や名前を使わずに、あなたになりすましてサイトを操作できてしまいます。これが「セッションハイジャック」という恐ろしい攻撃の正体です。
—
2. 三種の神器:クッキーを守る「3つの盾」
では、どうやってこの通行手形を守ればいいのでしょうか。サーバーの設定ファイルで、以下の3つの属性を必ず指定するようにしましょう。
① HttpOnly:泥棒の「手」を封じる
- 役割: JavaScriptからクッキーを読み取れないようにする。
- なぜ必要?: もしWebサイトに「XSS(クロスサイトスクリプティング)」という脆弱性があり、攻撃者が悪意のあるスクリプトを埋め込んだとします。普通なら、そのスクリプトで皆さんのクッキーを盗み出せますが、
HttpOnlyが付いていれば、「スクリプトからはクッキーの中身が見えない」状態になるため、盗難を防げます。 - 例え: 泥棒が窓から侵入しても、金庫に「特殊なガード(HttpOnly)」がかかっていて、中身(クッキー)を取り出せない状態です。
② Secure:通信の「盗聴」を防ぐ
- 役割: 暗号化された通信(HTTPS)でしかクッキーを送信しない。
- なぜ必要?: 暗号化されていない通信(HTTP)では、途中で誰かがパケットを盗聴してクッキーを丸見えにできてしまいます。
Secureを設定することで、「暗号化された安全な道を通る時しかクッキーは渡さない」というルールになります。 - 例え: 鍵をかけた現金輸送車(HTTPS)でしか現金を運ばないようにするルールです。
③ SameSite:泥棒の「勝手な訪問」を拒否する
- 役割: 外部のサイトから送られてくるリクエストに対して、クッキーを送信するかを決める。
- 設定値:
StrictまたはLaxが推奨です。 - なぜ必要?: 自分が知らない間に別のサイトから自分のアカウントへリクエストが送られ、勝手に操作される「CSRF」という攻撃を防ぎます。
- 例え: 「身内(自分自身のサイト)からの訪問しか受け付けない」という、玄関に設置した厳格なインターホンです。
—
3. 実践!サーバーサイドでの設定例
では、実際にどう書けばいいのでしょうか。代表的な言語での設定イメージを見てみましょう。
PHPの場合(php.iniでの設定)
PHPであれば、session.cookie_httponly などを設定することで、サイト全体に適用できます。
; セッションクッキーの設定
session.cookie_httponly = 1 ; JavaScriptからのアクセスを禁止
session.cookie_secure = 1 ; HTTPS通信のみ許可
session.cookie_samesite = “Lax” ; 外部サイトからの悪意あるリクエストを抑制
Node.js (Express) の場合
ミドルウェアとして設定するのが一般的です。
const session = require(‘express-session’);
app.use(session({
name: ‘__my_session_id’,
secret: ‘秘密の鍵です’,
cookie: {
httpOnly: true, // JavaScriptからの読み取り不可
secure: true, // HTTPS環境でのみ送信
sameSite: ‘lax’ // CSRF対策
}
}));
—
まとめ:今日からできる「防犯チェック」
セキュリティ対策と聞くと身構えてしまうかもしれませんが、今日紹介した3つの設定は、「一度設定してしまえば、ずっと守ってくれる」非常にコストパフォーマンスの高い防御策です。
1. HttpOnly: JSからの盗難防止
2. Secure: 盗聴防止
3. SameSite: CSRF(なりすまし操作)防止
Webサイトを公開する前に、「自分のサイトのクッキーはどうなっているかな?」とブラウザのデベロッパーツール(F12キー)を開いて確認してみてください。そこに「Secure」や「HttpOnly」のチェックが入っていなければ、今すぐ設定を見直しましょう!
一歩ずつ、安全な開発の習慣を身につけていけば、皆さんの作るサービスはもっと強固で、信頼されるものになりますよ。応援しています!
コメント