あなたの「家の鍵」は丸見えになっていませんか?XSSとHttpOnlyで守るセッションの鉄則
こんにちは!セキュリティの世界へようこそ。
システム開発の現場で「セキュリティ」と聞くと、なんだか難しそうで、教科書を広げた瞬間に眠くなってしまう……そんな経験はありませんか?
今日は、そんな皆さんと一緒に、Webアプリケーションの「防犯」について、少しだけリアルな話をしようと思います。特に、名前は聞いたことがあるかもしれない「XSS(クロスサイトスクリプティング)」と、その対策である「HttpOnly属性」について、泥棒と家の鍵に例えて紐解いていきましょう。
—
1. Webサイトの「セッションID」は、あなたの家の「合鍵」です
まずは、Webサイトにおける「セッションID」の役割を理解しましょう。
あなたがログインが必要なサイトにアクセスすると、ブラウザには「この人はログイン済みですよ」という証明書のようなものが保存されます。これがCookie(クッキー)に入っているセッションIDです。
想像してみてください。このセッションIDは、あなたの家の玄関の合鍵そのものです。一度鍵を開けてしまえば、泥棒はあなたが寝ている間も、留守にしている間も、自由自在に家の中(会員ページや個人情報)を物色できてしまいますよね。
2. 泥棒(XSS)はどうやって鍵を盗むのか?
では、悪意ある攻撃者(泥棒)は、どうやってこの合鍵を盗むのでしょうか。そこで登場するのがXSS(クロスサイトスクリプティング)です。
XSSは、簡単に言うと「サイトの隙間に、偽のメモを紛れ込ませる攻撃」です。
1. 攻撃者は、掲示板やプロフィール欄などの「入力フォーム」に、悪意あるプログラム(JavaScript)を仕込みます。
2. そのページを一般ユーザーが見ると、ブラウザが勝手にそのプログラムを実行してしまいます。
3. プログラムは裏でこっそり動き、「おーい、このブラウザに入っている『セッションID』という名前の鍵を、僕のサーバーに送ってくれ!」という命令を実行します。
こうして、ユーザーは何も気づかないうちに、自分の「合鍵」を泥棒に差し出してしまうのです。これが、セッションハイジャックのメカニズムです。
3. 「HttpOnly」という魔法のシール
さて、ここからが本題です。この泥棒を防ぐための最強の武器が「HttpOnly属性」です。
これは、Cookieを発行する際に、「この鍵はJavaScriptからは絶対に触らせないでください!」という「開封厳禁のシール」を貼るような仕組みです。
もし、泥棒(悪意あるプログラム)が「おい、その鍵を見せろ!」とブラウザに命令しても、ブラウザは「いいえ、これはHttpOnly属性が付いているので、JavaScriptからはアクセスできません」と拒否してくれます。
つまり、万が一XSSという泥棒がサイト内に侵入したとしても、「一番大切な合鍵(セッションID)だけは絶対に見つけられない」という状況を作れるのです。これ、すごく心強いですよね。
—
実践:HttpOnlyを設定してみよう
では、実際にどうやってこの「魔法のシール」を貼ればいいのでしょうか。サーバーサイドのプログラムでCookieを発行する際、設定を追加するだけです。
Node.js (Express) での例
// ExpressでCookieを設定する場合
res.cookie(‘session_id’, ‘あなたのセッション値’, {
httpOnly: true, // これが今回の魔法のシールです!
secure: true, // HTTPS通信でしか送らないようにする(これも大事!)
sameSite: ‘lax’ // クロスサイトからの攻撃を防ぐための設定
});
PHP での例
// session_startの前に設定するのがコツです
session_set_cookie_params([
‘lifetime’ => 0,
‘path’ => ‘/’,
‘secure’ => true, // HTTPS必須
‘httponly’ => true, // JavaScriptからのアクセスを禁止!
‘samesite’ => ‘Lax’
]);
session_start();
—
最後に:完璧な防御は「重ね着」から
ここまで読んでくれたあなたは、もうセキュリティの第一歩を大きく踏み出しています。ただ、一つだけ覚えておいてほしいことがあります。
「HttpOnlyを設定したから、XSS対策は終わり!」というわけではありません。
HttpOnlyはあくまで「もし鍵を盗まれそうになっても、被害を最小限に抑える」ための最後の防波堤です。泥棒を家に入れないための「入口の施錠(入力値のサニタイズやエスケープ処理)」も同じくらい大切です。
セキュリティは、鍵を一つだけかけるのではなく、複数の防御策を重ね着することで、初めて「強固」なものになります。
まずは今日、自分が関わっているシステムのCookie設定を確認してみてください。「HttpOnly」という文字がちゃんと設定されているか。それだけで、あなたはユーザーの大切な「合鍵」を守る立派な守護者(エンジニア)になれるのですから。
また次の記事で、より深いセキュリティの泥臭い知見をお話ししましょう。応援しています!
コメント