【入門編】Cookie属性: SameSite(Strict/Lax)によるCSRF対策 – アプリケーションセキュリティ & 安全な開発防御ガイド

あなたのWebサイトが「知らない誰かに勝手に操作される」?CSRFの恐怖とCookieの守り方

こんにちは。日々、システムの脆弱性と向き合っているセキュリティエンジニアです。

今日は、Web開発を始めたばかりの皆さんが必ず一度は耳にするであろう「CSRF(クロスサイトリクエストフォージェリ)」という攻撃と、それを防ぐための強力な武器「SameSite属性」についてお話しします。

専門用語を聞くと身構えてしまうかもしれませんが、大丈夫。まずは、私たちが住んでいる「家」の防犯に例えて、その仕組みを紐解いていきましょう。

—

1. CSRFとは?「あなたのフリをして勝手に鍵を開ける泥棒」

CSRFを簡単に言うと、「ログイン中のあなたになりすまして、Webサイトに勝手な命令を送らせる攻撃」のことです。

例えば、あなたが銀行のサイトにログインしているとします。その状態で、攻撃者が用意した罠サイト(悪意あるリンクが貼られたページ)をうっかり開いてしまったらどうなるでしょう。

1. あなたのブラウザは、銀行のサイトに対して「送金して!」という命令(リクエスト)を自動的に送ってしまいます。
2. ブラウザは親切にも、「あ、このユーザーはさっきログインした人だ」と判断して、あなたの「認証用Cookie」を勝手に添えて送ってしまうのです。
3. 銀行のサイトは、「本人からの正しいリクエストだ」と勘違いして、送金処理を実行してしまいます。

これがCSRFの恐ろしさです。「あなたは正当な権限を持っているのに、知らない間に誰かに操作されている」という状況ですね。

—

2. Cookieの「SameSite属性」という名の防犯ベル

この攻撃を防ぐために、ブラウザには「Cookieがどのタイミングで送られるべきか」を制御するSameSite属性という設定があります。これを家の防犯に例えると、「特定の家からの訪問者以外、インターホンを押させない」という仕組みです。

SameSiteには、主に3つの設定値があります。

SameSite=None

「どこからのリクエストでも、とりあえずCookieを送信する」という設定です。昔はこれがデフォルトでしたが、今となっては「玄関を常に全開にしている状態」と同じ。CSRFの格好の餌食になるので、基本的には使いません(使う場合は Secure 属性が必須です)。

SameSite=Lax(おすすめ!)

「自分が今いるサイトと、リンクをクリックして移動した時だけのCookie送信を許可する」という設定です。
直感的にいうと、「信頼できる友人からの紹介ならドアを開けるけど、怪しいサイトからの自動的な訪問は無視する」という賢いガードマンです。多くのモダンなブラウザでは、現在これがデフォルトになっています。

SameSite=Strict

「同じサイトからのリクエスト以外、Cookieは絶対に渡さない」という最強のガードです。
「どんなことがあっても、自分以外の人間には一切の鍵を渡さない」という頑固な番人ですね。非常に安全ですが、外部サイトからリンクを踏んで移動した際、ログイン状態が保持されず「あれ、ログインしてない?」となることがあるため、用途に合わせて選ぶ必要があります。

—

3. 実践!Cookieを守る設定方法

それでは、実際に開発でどう設定すればいいのか見てみましょう。といっても、設定はとてもシンプルです。サーバー側でCookieを発行する際に、ヘッダーに少し追記するだけです。

設定例(HTTPレスポンスヘッダー)

Set-Cookieヘッダーに属性を追加します
Set-Cookie: session_id=abc123xyz; SameSite=Lax; Secure; HttpOnly

  • SameSite=Lax: ここが今回のお話の主役です。これでCSRFを防ぎます。
  • Secure: 「HTTPS通信(暗号化された通信)の時だけ送る」という設定。必須です。
  • HttpOnly: JavaScriptからCookieを盗み出せないようにする設定。XSS攻撃対策の基本ですね。

もしWebフレームワークを使っているなら

多くのフレームワークでは、設定ファイルで一括管理できます。例えばNode.jsのExpressならこんな感じです。

// ExpressでのCookie設定例
res.cookie(‘session_id’, ‘abc123xyz’, {
sameSite: ‘lax’, // CSRF対策: クロスサイトのリクエストではCookieを送らない
secure: true, // 通信の暗号化を強制
httpOnly: true // JavaScriptからのアクセスを禁止
});

—

最後に:完璧なセキュリティはないけれど

「SameSite属性を設定すれば、もうCSRFは怖くない!」と言いたいところですが、セキュリティの世界に「100%安全」はありません。

SameSite属性は非常に強力な盾ですが、これに加えて、フォーム送信時に「トークン(暗号化されたパスワードのようなもの)」を付与する「CSRFトークン」という仕組みも併用するのが、プロの現場での鉄則です。

まずは、皆さんが作っているサイトや管理しているシステムのCookie設定を見直すところから始めてみてください。一歩ずつ、その小さな設定の積み重ねが、ユーザーの大切な情報を守る「強固な城」を作っていきます。

今日から皆さんも、防犯意識の高いエンジニアの一歩を踏み出しましょう!何か分からないことがあれば、いつでも質問してくださいね。

コメント

タイトルとURLをコピーしました