一人前のエンジニアになるための軌跡

IT技術関連の投稿がメインです

PrAha Challenge 課題4 「クッキーを理解する」

こんにちは!今日はクッキーについて改めてまとめてみたいと思います!

クッキーとは

クライアントがブラウザからサーバーへリクエストをした際に、サーバーはレスポンスとしてヘッダーにSet-cookieを設定します。 再びクライアントがリクエストをすると、Set-cookieに値がセットされた状態でサーバーへリクエストし、サーバーはSet-cookieの値を認識します。

クッキーの共有

異なるサーバー間で同じクッキーを共有をすることはできません。 なぜなら、意図しない情報が含まれるクッキーが送られること防ぐためです。

では、どういう条件下においてクッキーを共有することができるのでしょうか? 調べたところ以下が上げられます。

  • ポートが異なる場合 ホストアドレスが一緒でポートが異なる場合(例、hoge.com:8080とhoge.com:3000)はクッキーを共有することができます。

  • サブドメイン サブドメイン間でクッキーを共有することが可能です。共有する場合は、クッキーのDomain属性にクッキーを受信するホストを設定します。 例えばDomain = hoge.comを設定すると、hoge.comとapi.hoge.com間でクッキーを共有することができます。

  • サイト跨いだアクセス

例えばサイトAとサイトBがあります。サイトA上にはサイトBのURLも記載されており、サイトA経由でサイトBにアクセスすることが可能です。 もし以前にもサイトBへ直接アクセスしたことがある場合、その時に使用したクッキーをサイトA経由アクセスした場合でも使用することも可能です。 しかし、これによりクロスサイトリクエストフォージェリ攻撃 (CSRF) を受ける可能性があります。 そこで、SameSite属性にStrictやLaxを設定すると、別サイト経由でのアクセスによるクッキーの使用を防ぐことができます。これによりCSRF攻撃を避けることが可能となるわけです。

クッキーへのアクセス制限

  • Secure属性

Secure 属性がついたクッキーは、HTTPS プロトコル上の暗号化されたリクエストでのみサーバーに送信され、安全でない HTTP では決して送信されないため、中間者攻撃者が簡単にアクセスすることはできません。

  • HttpOnly属性

ブラウザ上でJavaScriptのDocument.cookie APIを使用すると、クッキーの値を取得することができます。これによりクロスサイトスクリプティング (XSS) 攻撃によって第三者にクッキー情報を盗み取られる可能性があります。そこで、HttpOnly属性を付与することで、Document.cookie APIの使用を無効にすることができます。

所感

クッキーを使用するときは、どんな情報を設定するか、どんな属性を付与すれば良いか、をしっかり考慮しなければならないと感じました。 特に、ユーザー名、パスワード、クレジットカード、個人情報、金銭に関わる情報などは漏洩する危険性があるので、注意が必要です。 ログイン情報管理おいて、セッションIDを盗まれるいわゆるセッションハイジャックの危険性もあるので、なるべくクッキーでセッションIDを管理しなくても済むようにしたいです。 そういう場合は、Auth0でJWTを使用したりやOpenIDConnectを使用すること優先に考えるべきだと思います。