1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

今回の想定読者

今回のネタは、Cookieについてです。本記事を読んでいただけると、Cookieの基本的な役割や機能、Cookieを利用したサイトへの攻撃について、外観を掴むのに役立つと思います。

以下の様な方が想定読者です。

  • Cookieって何気なく使っているけど、どんなものか理解が曖昧なので外観を掴みたい
  • 普段は機能実装しかしてなくて、ログイン周りはノータッチなので理解を深めたい

ログビーの勉強会について

ログビー(Logbii)では、月一回オンラインの社内勉強会をしています。直近のものと、2025年以降のアーカイブを順次公開していきます。

ざっくりと、以下のルールで運用をしています。

  • 月イチで、ランチタイムにオンライン開催(1時間)
  • テーマ自由
  • 持ち回りで開催
  • ランチ代支給(2000円まで)、飲食可
  • 業務時間扱いでOK(業務時間を削る形でよい)

今回の勉強会について

今回は、2025年2月の勉強会アーカイブです。

SwiftエンジニアのIshikuraさんが発表しました!
それでは、以下本編です。

Cookie

Cookieをテーマに選んだきっかけ

  • 前職でWebViewを用いたアプリの対応を行っており、そこでCookieなどのWebの仕様について調べる機会があったため
  • 普段Cookieを使用しているが個人的にあやふやな理解があるなと感じたため
  • 勉強会に参加してくださる人にも少しは関係しているようなテーマ

Cookieについて

Cookieとは

ウェブサイトがユーザーのブラウザに保存する小さなデータファイル

Cookieの役割

  • ユーザーの利便性向上
    • ログイン情報の保持
      • 一度ログインすると、次回訪問時もログイン状態を維持できる
    • 設定の記憶
      • ユーザーの選んだ言語やテーマを保存し、再訪問時も適用される
  • ユーザーの行動の分析、マーケティング
    • 広告の最適化
      • ユーザーの閲覧履歴をもとに、興味の有りそうな広告を表示

Cookieの仕様、

Set-Cookie: name=value; Expires=Wed, 21 Oct 2025 07:28:00 GMT; Path=/; Domain=example.com; Secure; HttpOnly; SameSite=Lax
  • キーとバリュー name=value

    • Cookieのキーと値
  • Expires属性 Expires=Wed, 21 Oct 2025 07:28:00 GMT

  • Max-Age属性

    • 秒数指定
    • Max-Age=3600
    • Max-Age属性、Expires属性が両方与えられている場合はMax-Age属性が優先される
    • 両方与えられていない場合はセッションCookieとなり、ブラウザが閉じるとCookieが削除される
    ⚠️

    ブラウザが閉じられるとセッションCookieが削除されるが、ブラウザによってはセッションCookieの復元機能を持っていることがあり、次回起動時にセッションCookieが復元されることがある。

    Chromeの場合:設定→起動時→前回開いていたページを開く

  • Path属性 Path=/

  • Domain属性 Domain=example.com

    • どのドメインでCookieを送信するか指定するもの
    • Domain属性にトップレベルドメインのみを指定することはできない
      • ❌️: Domain=com / Domain=jp
    • Domain属性の活用例
      • サブドメイン間でのログイン共有
    • Domain属性のセキュリティリスクなど
      • Domain=example.com を設定すると、 support.example.com / dev.example.com でもCookieを使用できるため、想定外のCookieが共有されてしまう可能性がある
      • 対策
        • 必要な範囲にのみDomain属性を適用する( Domain=www.example.com など)
        • 機密情報のCookieはSecure属性やHttpOnlyを併用する
  • Secure属性 Secure

    • CookieをHTTPS通信でのみ送信するようにする
    • メリット
      • HTTPでの盗聴を防ぐ
        • HTTPのみの場合、Cookieは盗聴される可能性がある
      • 中間者攻撃を防ぐ
        • HTTP通信は簡単に改ざんできるため、悪意のある攻撃者がセッション情報を乗っ取る可能性がある
  • HttpOnly属性 HttpOnly

    • JavaScript(document.cookie)からCookieを取得できなくするための属性
    • HttpOnly という名前だが、「HTTPSのときは送らない」という意味ではない
    • 良い点
      • HttpOnly属性を設定するとXSS攻撃を防げる
        • JavaScriptからCookieを取得できなくなるため、攻撃者がスクリプトを仕込んでもCookieを盗むことができなくなる
    • 注意点
      • 認証系のCookieにはHttpOnlyを推奨
      • JavaScriptでCookieを操作する必要がある場合
        • フロントエンドでCookieを使って認証を管理する場合
          • アプリのネイティブでWebViewのスクリプトでCookie情報を取得するときなど
  • SameSite属性 SameSite=Lax

    • Cookieがクロスサイト(異なるドメイン間)のリクエストで送信されるかどうかを制御するための属性
    • 主にCSRF(クロスサイトリクエストフォージェリ)攻撃を防ぐ
    • 設定できる種類
      • Strict :一切送信されない
        • 最も厳格な設定
        • 同じサイト内のリクエストのみCookieを送信する
        • クロスサイトのリクエストではCookieを送信しない
        • メリット
          • CSRF攻撃を完全に防げる
          • ユーザーのセッションが外部サイトから利用されるリスクがない
        • デメリット
          • ログイン中のページに対して、別のドメインから遷移し直すと未ログイン扱いになる
      • Lax :一部のケースで送信される
        • 同じサイト内のリクエストでは常にCookieを送信する
        • GETリクエストのみクロスサイトでCookieを送信する
        • POST / PUT / DELETE などのリクエストではCookieを送信しない
          • https://example.comhttps://example.com/profile:送信される
          • https://another.comhttps://example.com (リンククリック):送信される
          • https://another.comhttps://example.com (フォーム送信):送信されない
      • None :常に送信される
        • すべてのリクエストでCookieを送信する
        • Secure属性が必須(HTTPS のみ)
          • https://example.comhttps://example.com/profile:送信される
          • https://another.comhttps://example.com:送信される

Cookieを用いた攻撃について

ディスカッション

  • Expire、Max-ageの有効期限の更新(satou)
  • EnbrewのCookieなどの対策(kawahara)
    • 現状、ローカルストレージに保存されている
    • やるならReact側で対応する
  • アプリケーションを開発するのであれば、セキュリティなどの部分を知識として入れとくと良い(matsuda)
  • 勉強会のテーマについて
    • iOSエンジニア目線どのようなテーマにすれば良いか少し難しい所があった
      • 面白い、興味の入口になってくれれば一つのゴールになる(kawakubo)
        • 一つとして実際に手を動かして試してみる

参考記事

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?