セッションCookieのHTTP Only属性とSecure属性の違い
先日セッションにまつわる言葉についてまとめましたが、ふと表題の件も理解が曖昧だなと気になったので調べてみました。
HTTP Only属性とは
cookie のスコープ(参照・操作の権限)を HTTP リクエストに制限するもの
CookieのSecure属性/HttpOnly属性の指摘と修正方法と脆弱性の解説
この「HTTPリクエスト」という言葉が引っかかって「Secure属性と何が違うの?🤔」となっていたのですが、ここでいうHTTPリクエスト
はスクリプトによるリクエスト(XMLHttpRequest
)に対する言葉。http
or https
は関係ありません。
つまり、HTTP Only属性はスクリプトからCookieへのアクセスを禁止してくれる属性。
もっと具体的にはXSS脆弱性があった際もCookieの盗み出しを予防してくれるもの(ただし、リスクの低減には役立つものの、完全に防衛できるわけではないそう)。
Secure属性とは
指定されたCookieはhttpsの通信の時のみCookieを送信する
CookieのSecure属性/HttpOnly属性の指摘と修正方法と脆弱性の解説
プロトコルがhttp
の時はCookieを送信しないよ、という属性。
なお、この説明文中によく見かける「通信経路上にいる第三者」について、先輩が例を教えてくれました。
この時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?)
参考サイト