おーみんブログ

C#, ASP.NET Core, Unityが大好きです。

cookieの概要と各属性について勉強してみた。

はじめに

業務でcookieを用いる場面があったので概要と各属性について備忘録としてまとめてみました。

cookie

cookieについての説明は以下のサイトが分かりやすかったので引用します。

developer.mozilla.org

HTTP Cookie (ウェブ Cookieブラウザー Cookie) は、サーバーがユーザーのウェブブラウザーに送信する小さなデータであり、ブラウザーに保存され、その後のリクエストと共に同じサーバーへ返送されます。
Cookie は主に、以下の 3 つの用途で使用されます。
セッション管理
→ログイン、ショッピングカート、ゲームのスコア、またはその他のサーバーが覚えておくべきもの
パーソナライズ
→ユーザー設定、テーマ、その他の設定
ラッキング
→ユーザーの行動の記録および分析

cookieの各属性について

cookieの属性とはオプションのようなもので、以下の7つが存在します。

  • Domain属性
  • Path属性
  • Expires属性
  • Max-Age属性
  • HttpOnly属性
  • Secure属性
  • SameSite属性

開発者ツール > Applicationを開くと各属性の確認ができます。

それでは以下より、それぞれの属性の説明をしていきます。

Domain属性

Domain属性はcookieを送信して良いドメインを登録する属性です。

基本的にはFQDNに対するリクエスト時にcookieを送信(青枠)しますが、ドメインを指定した場合(赤枠)は後方一致でcookieの送信が可能です。

※要するに、abcd.amazon.comというFQDNのサイトがあった場合、青枠のcookieは送信されませんが赤枠のcookieは送信される、ということになります。

Path属性

Path属性を指定すると、そのPath配下のパスの時のみcookieを送信するという設定ができます。

Path属性で/hogeと設定した場合、/fuga/hogehogeのようなパスの際にはcookieが送信されない、ということですね。

Expires属性

Expires属性はcookieの有効期限を表します。

こちらは設定が必須ではなく、設定した場合は以下の画像の赤枠のように有効期限の日付が入りますが、設定しなかった場合はSessionという文字列が入り、セッション終了(ブラウザを閉じた)後にcookieが削除されます。

ログイン情報など、cookieに残しておくとセキュリティ的に好ましくないものもあるため、そういうものについてはExpires属性を付けないのもアリではあります(実際には利便性との要相談...という感じ)。

Max-Age属性

Max-Age属性はExpires属性とほぼ同じで有効期限を表しています。
Expires属性が日付を設定するのに対し、Max-Age属性は秒数を設定します。

※基本的にはExpires属性が利用されていることが多いとのこと。

HttpOnly属性

HttpOnly属性を付けることでcookieJavaScriptで操作することを防ぐことができます。

HttpOnly属性の付いていないcookieJavaScriptを用いて操作することが可能です。
そのため、例えば外部ファイルを読み込むサイト等があった場合に外部ファイルに攻撃者がcookieの値を取得するようなスクリプトを紛れ込ませていた場合、ユーザのcookieを取得することが可能な状態になってしまいます。

あくまで上記は一例ですが、基本的にはHttpOnly属性を付けるようにしましょう。

Secure属性

Secure属性を付けることでhttpsのページでのみcookieを送信するように制御することが可能です。

SameSite属性

SameSite属性には以下の4パターンが設定できます。

  • Lax
  • Strict
  • None
  • 無指定

SameSite属性にLaxやStrictを付けることでサイト間をまたぐリクエストの際にcookieが送られないようになります(Laxの場合GETリクエストは送られる)。
※無指定の場合はLaxと見なされます。

この属性を活用することでクロスサイトリクエストフォージェリ(CSRF)への対策に有効となります。

おわりに

今までcookieについては何となくの理解でやってきた(というかあまり意識しなくても何とかなってた)んですが、最近仕事でガッツリ触るようになってきたのでちゃんと勉強してみました!
まだまだ基本的な内容ではありますが、さらに学んでよりcookieに詳しくなっていきたいと思います!