DOM

ドキュメント オブジェクト モデル

Document.cookie プロパティ

 編集:2022.08.31 by T.A.

mdn

Document に関連付けられたクッキーを読み取り/書き込みします。これは実際のクッキーの値に対するゲッターとセッターとして動作します。

Edgeでは、ローカルではクッキーは取り扱えないようです。

構文

クッキーを読み込む:

allCookies= Document.cookie

クッキーを書き込む:

Document.cookie =newCookie
Document Document
値: 取得値 allCookies

セミコロンで区切られたクッキーのリストです(つまり key=value のペア)。なお、それぞれの key および value の周囲にはホワイト スペース(空白やタブ文字)を置くことができます。実際のところ、RFC 6265 ではそれぞれのセミコロンの後に空白1文字を入れることを必須としていますが、一部のユーザー エージェントはこれに従っていません。

値: 設定値 newCookie

key=value の形式の文字列です。なお、この方法を使用して一度に設定・更新できるクッキーは、一つだけです。

オプションとして次に挙げる値を設定することができます。keyvalue のペアの後にセミコロン「;」で区切って設定することで、クッキーを設定・更新することができます。

key

path
値はパス。(例えば、'/'、'/mydir')。指定されない場合は、既定で現在の文書の位置のパスになります。

メモ: Gecko 6.0 以前では、引用符付きのパスは引用符が文字列を囲む区切り文字ではなく、文字列の一部であるかのように扱われます。これはすでに修正されています。

domain
値はドメイン。(例えば、'example.com' または 'subdomain.example.com')。指定されていない場合は、既定で現在の文書の位置のホストの部分になります。初期の仕様とは対照的に、ドメイン名の前のドットは無視されますが、ブラウザーはその様なドットを含むクッキーの設定を辞退することができます。ドメインが設定されれば、サブ ドメインも常に含まれます。

メモ: ドメインは JavaScript のオリジンと一致している必要があります。外部ドメインへのクッキーの設定は暗黙に無視されます。

max-age
値は寿命。秒数(例えば、1年であれば 60*60*24*365 または 31536000)
expires
値はGMTString。クッキーの有効期限。もし expires も max-age も指定しなければ、有効期限はセッション(¶不明)の終了までになります。

ユーザーのプライバシーを考慮するのであれば、ブラウザーの有効期限の管理に頼るのではなく、ウェブ アプリケーションの実装で指定した期間の経過後にクッキーを無効化することが重要です。多くのブラウザーはユーザーがクッキーを無期限に設定することができますが、これは安全ではありません。

値の形式について知りたい方は、Date.toUTCString() をご覧ください。

secure
値は不明。https の通信を使用しているときだけ、クッキーが送信されます。Chrome 52 以前では、このフラグは http ドメインからのクッキーに設定することができました。
samesite
値はSameSiteSameSite はブラウザーがこのクッキーをサイト間リクエストで送信することを防ぎます。フラグに利用可能な値は lax または strict です。
strict 通常のリンクを追う場合を含め、ブラウザーがすべてのサイト間閲覧コンテキストの対象サイトに向けてクッキーを送信することを防ぎます。
lax トップ レベル ナビゲーションで GET リクエストの場合のみ、クッキーを送信します。これはユーザーのトラッキングに効率的でありながら、多くの CSRF 攻撃を防ぐことができます。

クッキーの値の文字列に encodeURIComponent() を使用すると、文字列に(クッキーの値で許可されない)コンマ、セミコロン、ホワイトスペースを使用していないことを確認できます。

ユーザー エージェントの実装によっては、以下のクッキーの接頭辞に対応しています。

__Secure-
ブラウザーに、セキュアなチャネルを通してリクエストが送信された場合にのみクッキーを含めるよう指示します。
__Host-
ブラウザーに、安全なオリジンからのクッキーのみを使用することに加え、クッキーのスコープをサーバーから渡された path 属性に限定します。サーバーが path 属性を省略した場合は、要求の URI の「ディレクトリ」が使用されます。これは、クッキーが他のドメインに送出されることを防ぐために、 domain 属性が存在してはいけないことも指示します。Chrome では、path 属性は常にオリジンになります。

ダッシュ「-」は接頭辞の一部とみなされます。

これらのフラグは secure 属性と一緒の場合のみ設定できます。

メモ: 上記のコードに見られるように、document.cookie はネイティブのセッター及びゲッターを持つアクセサー プロパティであり、値を持つ データ プロパティではありません。書き込んだものと読み込んだものは同じにはならず、常に JavaScript インタープリターに仲介されます。

クッキーを設定してから、test2 という名前のクッキーを取得:

JavaScript:

document.cookie = "test1=Hello";
document.cookie = "test2=World";

const cookieValue = document.cookie
  .split('; ')
  .find(row => row.startsWith('test2'))
  .split('=')[1];

function alertCookieValue() {
  alert(cookieValue);
}

HTML:

<button onclick="alertCookieValue()">Show cookie value</button>

¶省く

document.cookie="test1=Hello;";
D=document.cookie; //="test1=Hello"
document.cookie="data=10";
D=document.cookie; //="test1=Hello; data=10"。全てのクッキーが取得される

ND=new Date().getTime(); //現在の時間を取得して、ミリ秒にする。
Dt=new Date(ND+1000*10).toGMTString(); //現在の時間+10秒
document.cookie="data=20; expires="+Dt; //有効期限付きで書き込み

後に以下のを繰り返す

D=document.cookie; //="test1=Hello; data=20"
…
D=document.cookie; //="test1=Hello"

更に、

Dt=new Date(0).toGMTString(); //過去の時間にして、
document.cookie="test1=20; expires="+Dt; //クッキー削除ができる。
D=document.cookie; //=""

テスト
HTML:


ここにHTMLが表示される
スクリプト組み込み:
JavaScript:


JavaScript:



表示内容:
表示内容: