なぜログアウトに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(クロスサイトリクエストフォージェリ)という攻撃の一例を見てみましょう。
状況の例
- あなたがあるWebアプリ(たとえばショッピングサイト)にログイン中だとします。
- そのログイン中のタブとは別に、全然関係ないブログを読んでいたとします。
- そのブログの中に、以下のような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年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
最新の投稿
山崎講師2025年6月7日参照型の配列とNullPointerException
山崎講師2025年6月7日Javaでchar型は実は整数!?文字コードの正体に迫る!
山崎講師2025年6月7日Javaのエスケープシーケンスをマスターしよう!表示のズレに困ったらこれ!
山崎講師2025年6月7日Javaの「文字」と「文字列」の違いをやさしく解説!混同に注意!