玄関の鍵は閉めたのに、窓から「合い鍵」を盗まれる?XSSとHttpOnlyの深い関係
こんにちは。現場で泥臭いインシデント対応を繰り返していると、つくづく思うことがあります。「セキュリティ対策は、完璧を目指すよりも『泥棒に手間をかけさせる』ことが最大の防御である」と。
今回は、Web開発の現場で避けては通れない「XSS(クロスサイトスクリプティング)」という攻撃と、それを無効化する強力な武器「HttpOnly属性」について、一緒に紐解いていきましょう。
そもそも「XSS」って何?身近な泥棒で例えると
XSSをひと言で言うと、「信頼していたはずのWebサイトに、悪意ある第三者が勝手に張り紙(スクリプト)をして、それを見たユーザーを騙す攻撃」です。
想像してみてください。あなたは自分の家の玄関(Webサイト)に、厳重な鍵をかけています。しかし、家の壁に「ここから入れば中に入れるよ」という偽の案内板を貼り付けられたらどうでしょう? 遊びに来た友人がその指示に従い、中に入ってしまう……これがXSSのメカニズムです。
この攻撃の恐ろしいところは、攻撃者が「あなたのセッション(ログイン状態)」を奪い取れる点にあります。
なぜ「クッキー」が狙われるのか?
Webの世界で「ログイン中ですよ」という証明書として使われるのが「セッションクッキー」です。これは、家でいうところの「合鍵」です。
本来、この合鍵はブラウザだけが持っているものですが、JavaScriptというプログラミング言語を使うと、プログラム経由でこの合鍵を簡単に読み取れてしまいます。
攻撃者はXSSという手法で、あなたのブラウザ上で「クッキーの中身をこっそり送信して」という命令を実行させます。これが成功すると、攻撃者の手元にあなたの「合鍵」がコピーされ、彼らはあなたになりすまして、自由にサイトを操作できるようになるのです。これが「セッションハイジャック」です。
救世主「HttpOnly」の登場
ここで登場するのが、今回の主役である「HttpOnly属性」です。
これはクッキーに付けられる「魔法のタグ」のようなものです。このタグが付いたクッキーは、「プログラム(JavaScript)からは一切触らせない」というルールになります。
たとえ攻撃者がXSSでJavaScriptを動かそうとしても、ブラウザ側が「このクッキーは『HttpOnly』だから、プログラムには渡さないよ!」とガードしてくれるのです。
つまり、「家の鍵に『持ち出し禁止』というシールを貼る」ようなイメージです。窓から侵入されても、鍵自体は金庫の中にあるため、泥棒は鍵を持ち出すことができません。
実践!設定方法を覚えよう
では、実際にどうやって設定するのか。Webサーバー側でクッキーを発行する際、ヘッダーに少し情報を付け加えるだけです。
サーバーサイド(Node.js/Express)での設定例
// セッション設定でHttpOnlyを有効にする
app.use(session({
name: ‘my-session-id’,
secret: ‘秘密の鍵’,
cookie: {
httpOnly: true, // これが最重要!JavaScriptからのアクセスを禁止します
secure: true, // HTTPS通信時のみ送信する設定(必須級です)
sameSite: ‘lax’ // CSRF対策。他サイトからのクッキー送信を制限します
}
}));
PHPでの設定例
// php.ini またはコード内で設定
// session.cookie_httponly を 1 にセットします
ini_set(‘session.cookie_httponly’, ‘1’);
// これにより、以降発行されるセッションクッキーには自動的にHttpOnlyが付与されます
session_start();
「これさえあれば安心!」ではないのがセキュリティ
ここまで読んで、「HttpOnlyを入れれば完璧だ!」と思った方もいるかもしれません。しかし、現役のエンジニアとして一言だけ忠告させてください。
「HttpOnlyは、あくまで『被害を最小限にするための防波堤』です。」
HttpOnlyがあっても、XSSそのもの(悪意あるスクリプトの混入)を防げるわけではありません。攻撃者はクッキーを盗めなくても、代わりに「あなたになりすまして勝手に投稿する」「偽の入力フォームを表示させてパスワードを盗む」といった別の攻撃を仕掛けてくる可能性があります。
一番の根本対策は、「入力されたデータを、ブラウザが勝手にプログラムと解釈しないように『エスケープ処理』を徹底すること」です。
最後に:一歩ずつ、確実に。
セキュリティは、知識の積み重ねです。今日、「HttpOnly」という魔法の言葉を知ったあなたは、昨日よりも確実に一歩前進しています。
難しい専門用語に圧倒される必要はありません。まずは自分の作っているWebサイトやサービスで、クッキーの設定がどうなっているか、開発者ツールを開いて確認してみることから始めてみてください。
もし「HttpOnly」の文字がなければ、今日がその設定を実装する良い機会です。エンジニアとしての小さな一歩が、ユーザーの大きな安心に繋がります。頑張っていきましょう!
コメント