はじめに
業務でcookieを用いる場面があったので概要と各属性について備忘録としてまとめてみました。
cookie
cookieについての説明は以下のサイトが分かりやすかったので引用します。
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属性を付けることでcookieをJavaScriptで操作することを防ぐことができます。
HttpOnly属性の付いていないcookieはJavaScriptを用いて操作することが可能です。
そのため、例えば外部ファイルを読み込むサイト等があった場合に外部ファイルに攻撃者がcookieの値を取得するようなスクリプトを紛れ込ませていた場合、ユーザのcookieを取得することが可能な状態になってしまいます。
あくまで上記は一例ですが、基本的にはHttpOnly属性を付けるようにしましょう。
Secure属性
Secure属性を付けることでhttps
のページでのみcookieを送信するように制御することが可能です。
SameSite属性
SameSite属性には以下の4パターンが設定できます。
- Lax
- Strict
- None
- 無指定
SameSite属性にLaxやStrictを付けることでサイト間をまたぐリクエストの際にcookieが送られないようになります(Laxの場合GETリクエストは送られる)。
※無指定の場合はLaxと見なされます。
この属性を活用することでクロスサイトリクエストフォージェリ(CSRF)への対策に有効となります。
おわりに
今までcookieについては何となくの理解でやってきた(というかあまり意識しなくても何とかなってた)んですが、最近仕事でガッツリ触るようになってきたのでちゃんと勉強してみました!
まだまだ基本的な内容ではありますが、さらに学んでよりcookieに詳しくなっていきたいと思います!