Nao000のぶろぐ

蝶を追っている少年になりたい

ログアウトはpostメソッドかgetメソッドか

ログアウトはPOSTメソッドかGETメソッドか

ログアウトはPOSTメソッドで行う

WEBサービスで会員機能がある場合、aタグによるリンクを押すことでログアウトしているものを見かけます。基本的にaタグを押すとGETメソッドを行います。このような経験からログアウトはGETメソッドで行うものだと自然に思っていたことがありました。しかし、これを行うとimgタグで "./logout" のような画像を読み込むと自動でログアウトしてしまいます。

データを変更するようなメソッドはPOSTメソッドで行うべきです。ログアウトの場合のデータの変更はセッションの破棄です。

POSTとGETの使い分け

「体系的に学ぶ安全なWebアプリケーションの作り方: 脆弱性が生まれる原理と対策の実践」によると以下の1つでも当てはまる場合はPOSTメソッドを使い、1つも当てはまらない場合はGETメソッドを使うようです。

  • データ更新など副作用を伴うリクエストの場合
  • 秘密情報を送信する場合
  • 送信するデータの総量が多い場合

「体系的に学ぶ安全なWebアプリケーションの作り方: 脆弱性が生まれる原理と対策の実践」 より引用

aタグによってログアウトの処理を発火しているように見えるサービスが多くあるように見えますが、実際にはPRGパターンやaタグによってPOSTメソッドを発火するような仕組みになっていると思います。ですが、見た目のまま真似しようとするとGETメソッドでログアウト機能を実装してしまう可能性があります。意外とこのことを知る機会が少ないのではないかと思います。

aタグでどうやってPOST送信するか

以下のようにformタグにフィールド名をつけてhrefに"javascript:{フィールド名}.submit()"でPOSTすることが可能です。

    <form name="sample_form_name" method="POST" action="/">
        <a href="javascript:sample_form_name.submit()">ログアウト</a>
    </form>

参考資料