なぜログアウトにPOSTメソッドを使うのか?セキュリティの観点から丁寧に解説!

こんにちは。ゆうせいです。

今回のテーマは「ログアウトにはなぜPOSTメソッドを使うのか?」です。
Webアプリケーションを作るとき、ログアウト処理って意外と簡単そうに見えますよね?
でも、GETメソッドでログアウトしてはいけない理由があるんです。

それはセキュリティに大きく関係しています。
特に「CSRF(クロスサイトリクエストフォージェリ)」という攻撃手法が関係しているのですが、今回はSpring Securityの話はしないで、もっと一般的なWebの仕組みとセキュリティの観点から解説していきます。


HTTPメソッドには役割がある!

「GET」と「POST」は使い分けるべき

Webブラウザがサーバーに何かをリクエストするときには、HTTPというプロトコルを使っています。
このときに使う「メソッド」にはいくつか種類があります。

メソッド主な用途特徴
GETデータの取得安全(副作用がない)・キャッシュ対象
POSTデータの送信副作用あり・キャッシュされない

ここで言う「副作用」とは、データベースの変更やセッションの削除といった「状態が変わること」を指します。

つまり、ログアウトのようにサーバー側の状態(セッション)を変更する処理には、POSTを使うのが適切ということなんです。


GETでログアウトできてしまうとどうなるのか?

思わぬところで勝手にログアウトされてしまう

たとえば、次のようなリンクを考えてみてください。

<a href="https://yourapp.com/logout">ログアウト</a>

これは「GETメソッドでログアウトするリンク」です。
このリンクが、あなたが開いている別のサイトに埋め込まれていたらどうなるでしょう?


CSRF攻撃の仕組みをかんたんに!

H3: 別タブからでもログアウトできてしまう理由

ここで、CSRF(クロスサイトリクエストフォージェリ)という攻撃の一例を見てみましょう。

状況の例

  1. あなたがあるWebアプリ(たとえばショッピングサイト)にログイン中だとします。
  2. そのログイン中のタブとは別に、全然関係ないブログを読んでいたとします。
  3. そのブログの中に、以下のようなHTMLタグが埋め込まれていたら…?
<img src="https://shop.example.com/logout" />

すると、なんとあなたのログイン中のショッピングサイトから勝手にログアウトされてしまうのです!

なんでそんなことが可能なの?

ここが重要なポイントです!

同じブラウザであれば、異なるタブでも「同じセッションID(ログイン状態)を共有している」んです。

つまり、

  • Aタブでログイン中
  • Bタブで悪意ある画像が表示される
  • Bタブの画像読み込みリクエストが自動で発生
  • そのリクエストにはAタブと同じセッションID(Cookie)が自動的に送信される
  • 結果として、BタブがAタブのログアウト処理を実行したことになる

という仕組みです。


POSTを使えばなぜ防げるのか?

POSTは「自動で実行されにくい」メソッド

POSTメソッドは、基本的に「ユーザーが何らかの操作(ボタンを押すなど)」をしないと発生しません。

例えば、こういうフォームですね。

<form action="/logout" method="POST">
  <button type="submit">ログアウト</button>
</form>

このフォームを自動的に呼び出すのは簡単ではないため、別タブから勝手に実行されるリスクを下げることができるのです。


図でまとめてみよう!

H3: GETとPOSTによるログアウトの違い(イメージ)

[別タブからのリクエスト]
        ↓
    ┌───────────┐
    │  GET /logout │
    └───────────┘
        ↓
[セッションIDを使ってログアウトが成立]

→ 危険!!

-----------------------------

[別タブからのリクエスト]
        ↓
    ┌────────────┐
    │ POST /logout │
    └────────────┘
        ↓
[セッションID + ユーザー操作 + トークン]
        ↓
        → 実行されない!

→ 安全!!

メリット・デメリットの整理

手法安全性実装の手間発生しうる問題
GETでログアウト少ない意図しないリクエストによる実行
POSTでログアウト少し増えるフォームなどの準備が必要

今後の学習のために

ログアウトの実装は、Webセキュリティの入口にすぎません。
この話を足がかりに、次のようなことを学んでいくといいですよ!

  • クッキーとセッションの仕組み
  • 同一生成元ポリシー(Same-Origin Policy)
  • CSRFトークンの仕組み
  • XSS(クロスサイトスクリプティング)との違い
  • HTTPメソッドとREST設計

まずは、「ログアウトはPOSTで!」という基本をおさえて、安心・安全なアプリ作りに取り組んでくださいね。

次は「セッションIDの仕組み」について深掘りしていきましょう!


セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。