セッションCookieのHTTP Only属性とSecure属性の違い

先日セッションにまつわる言葉についてまとめましたが、ふと表題の件も理解が曖昧だなと気になったので調べてみました。

HTTP Only属性とは

cookie のスコープ(参照・操作の権限)を HTTP リクエストに制限するもの
CookieのSecure属性/HttpOnly属性の指摘と修正方法と脆弱性の解説

この「HTTPリクエスト」という言葉が引っかかって「Secure属性と何が違うの?🤔」となっていたのですが、ここでいうHTTPリクエストスクリプトによるリクエスト(XMLHttpRequest)に対する言葉。http or httpsは関係ありません。

つまり、HTTP Only属性はスクリプトからCookieへのアクセスを禁止してくれる属性。
もっと具体的にはXSS脆弱性があった際もCookieの盗み出しを予防してくれるもの(ただし、リスクの低減には役立つものの、完全に防衛できるわけではないそう)。

Secure属性とは

指定されたCookiehttpsの通信の時のみCookieを送信する
CookieのSecure属性/HttpOnly属性の指摘と修正方法と脆弱性の解説

プロトコルhttpの時はCookieを送信しないよ、という属性。

なお、この説明文中によく見かける「通信経路上にいる第三者」について、先輩が例を教えてくれました。

  1. ファーストフードやカフェのようなフリーWifiの提供されている場所で、似た名前(SSID)の罠Wifiを提供
  2. 利用者がそれと気づかず罠Wifiを利用
  3. Wifiの提供者は通信内容を盗聴し放題!👿

この時http通信だと盗まれてそのまま情報が見られるので、暗号化通信であるhttpsを利用しましょう、http通信の場合はCookieを送信しないSecure属性を利用しましょう、ということだそうです😊

実装例は?

Railsでの実装方法

  • HTTP Only属性
    デフォルトで設定されています。
    もし外したいような事象が出てきた場合は下記で行えますが、かなりレアなケースではないでしょうか。
# config/initializers/session_store.rb
# ダメ、ゼッタイ
MyApp::Application.config.session_store :active_record_store, key: "_myapp_session", httponly: false
  • Secure属性
    同じくsession_store.rbでsecure属性を設定できますが、ローカルでhttpで開発している場合、developmentの時は付与しないように設定します。
# config/initializers/session_store.rb
MyApp::Application.config.session_store :active_record_store, key: "_myapp_session", secure: (Rails.env.production? || Rails.env.staging?)

参考サイト