Name Date Size #Lines LOC

..--

COMMON_METADATAH A D25-Apr-2025101 76

DIR_METADATAH A D25-Apr-2025397 108

README.mdH A D25-Apr-202522.8 KiB547408

canonical_cookie.ccH A D25-Apr-202549 KiB1,287872

canonical_cookie.hH A D25-Apr-202523.5 KiB540270

canonical_cookie_fuzzer.ccH A D25-Apr-20253 KiB8463

canonical_cookie_test_helpers.hH A D25-Apr-20257.4 KiB196143

canonical_cookie_unittest.ccH A D25-Apr-2025281.4 KiB6,1054,968

cookie_access_delegate.ccH A D25-Apr-2025457 209

cookie_access_delegate.hH A D25-Apr-20253.6 KiB9248

cookie_access_params.hH A D25-Apr-20251 KiB3114

cookie_access_result.ccH A D25-Apr-20251.1 KiB3521

cookie_access_result.hH A D25-Apr-20252.6 KiB7447

cookie_base.ccH A D25-Apr-202526.8 KiB650478

cookie_base.hH A D25-Apr-202511.6 KiB259118

cookie_change_dispatcher.ccH A D25-Apr-20251.4 KiB4836

cookie_change_dispatcher.hH A D25-Apr-20256.4 KiB17163

cookie_change_dispatcher_test_helpers.ccH A D25-Apr-2025945 3424

cookie_change_dispatcher_test_helpers.hH A D25-Apr-2025578 208

cookie_constants.ccH A D25-Apr-20259.9 KiB347315

cookie_constants.hH A D25-Apr-202511.3 KiB392221

cookie_constants_unittest.ccH A D25-Apr-20254 KiB10276

cookie_deletion_info.ccH A D25-Apr-20254.4 KiB14798

cookie_deletion_info.hH A D25-Apr-20255.6 KiB15854

cookie_deletion_info_unittest.ccH A D25-Apr-202526 KiB626529

cookie_inclusion_status.ccH A D25-Apr-202516.3 KiB449376

cookie_inclusion_status.hH A D25-Apr-202520.2 KiB470172

cookie_inclusion_status_unittest.ccH A D25-Apr-202516.9 KiB415341

cookie_monster.ccH A D25-Apr-2025108.3 KiB2,8121,948

cookie_monster.hH A D25-Apr-202538.7 KiB863356

cookie_monster_change_dispatcher.ccH A D25-Apr-20259.1 KiB274212

cookie_monster_change_dispatcher.hH A D25-Apr-20256.1 KiB16689

cookie_monster_netlog_params.ccH A D25-Apr-20253.6 KiB10892

cookie_monster_netlog_params.hH A D25-Apr-20252.3 KiB6134

cookie_monster_perftest.ccH A D25-Apr-202516.3 KiB466370

cookie_monster_store_test.ccH A D25-Apr-20258.6 KiB246196

cookie_monster_store_test.hH A D25-Apr-20256.4 KiB202110

cookie_monster_unittest.ccH A D25-Apr-2025314.4 KiB7,2285,199

cookie_options.ccH A D25-Apr-20253.5 KiB10676

cookie_options.hH A D25-Apr-202513.4 KiB328169

cookie_options_unittest.ccH A D25-Apr-20255.2 KiB124113

cookie_partition_key.ccH A D25-Apr-20257.3 KiB226171

cookie_partition_key.hH A D25-Apr-20258.9 KiB214108

cookie_partition_key_collection.ccH A D25-Apr-20252.5 KiB8862

cookie_partition_key_collection.hH A D25-Apr-20253.5 KiB9849

cookie_partition_key_collection_unittest.ccH A D25-Apr-20254.8 KiB133103

cookie_partition_key_fuzzer.ccH A D25-Apr-20251.1 KiB4327

cookie_partition_key_unittest.ccH A D25-Apr-202518.1 KiB454381

cookie_setting_override.hH A D25-Apr-20252.4 KiB5621

cookie_store.ccH A D25-Apr-20251.7 KiB5336

cookie_store.hH A D25-Apr-20258.3 KiB19079

cookie_store_change_unittest.hH A D25-Apr-2025132.7 KiB3,2372,600

cookie_store_test_callbacks.ccH A D25-Apr-20253 KiB9974

cookie_store_test_callbacks.hH A D25-Apr-20255.5 KiB188120

cookie_store_test_helpers.ccH A D25-Apr-20258.7 KiB280219

cookie_store_test_helpers.hH A D25-Apr-20256.5 KiB198131

cookie_store_unittest.hH A D25-Apr-202581.5 KiB1,9351,426

cookie_util.ccH A D25-Apr-202538.3 KiB991646

cookie_util.hH A D25-Apr-202515.8 KiB327125

cookie_util_parsing_fuzzer.ccH A D25-Apr-20251 KiB3216

cookie_util_unittest.ccH A D25-Apr-202582.7 KiB1,8131,457

parse_cookie_line_fuzzer.ccH A D25-Apr-20253.2 KiB9976

parsed_cookie.ccH A D25-Apr-202526.6 KiB758454

parsed_cookie.hH A D25-Apr-20259.4 KiB224119

parsed_cookie_unittest.ccH A D25-Apr-202546.2 KiB1,3031,029

site_for_cookies.ccH A D25-Apr-20257 KiB228140

site_for_cookies.hH A D25-Apr-20259.2 KiB21755

site_for_cookies_unittest.ccH A D25-Apr-202525 KiB632455

static_cookie_policy.ccH A D25-Apr-2025845 3122

static_cookie_policy.hH A D25-Apr-20251.7 KiB5526

static_cookie_policy_unittest.ccH A D25-Apr-20253 KiB7861

test_cookie_access_delegate.ccH A D25-Apr-20255 KiB149122

test_cookie_access_delegate.hH A D25-Apr-20254.4 KiB11172

README.md

1# Cookies
2
3*** aside
4_"In the beginning ~~the Universe was~~ cookies were created. This has
5made a lot of people very angry and has been widely regarded as a bad move."_
6
7_"Sometimes me think, what is friend? And then me say: a friend is someone to
8share last cookie with."_
9***
10
11This directory is concerned with the management of cookies, as specified by
12[RFC 6265bis](https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis).
13Cookies are implemented mostly in this directory, but also elsewhere, as
14described [below](#Cookie-implementation-classes).
15
16*** promo
17* Those who wish to work with the implementation of cookies may refer to
18  [Life of a cookie](#Life-of-a-cookie) and
19  [Cookie implementation classes](#Cookie-implementation-classes).
20
21* Those who wish to make use of cookies elsewhere in Chromium may refer to
22  [Main interfaces for finding, setting, deleting, and observing cookies](#Main-interfaces-for-finding_setting_deleting_and-observing-cookies).
23***
24
25[TOC]
26
27## Life of a cookie
28
29This section describes the lifecycle of a typical/simple cookie on most
30platforms, and serves as an overview of some important classes involved in
31managing cookies.
32
33This only covers cookie accesses via
34[HTTP requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies).
35Other APIs for accessing cookies include JavaScript
36([`document.cookie`](https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie)
37and [CookieStore API](https://wicg.github.io/cookie-store/)) or Chrome
38extensions
39([`chrome.cookies`](https://developer.chrome.com/extensions/cookies)).
40
41### Cookie is received and parsed
42
43*** note
44**Summary:**
45
461. An HTTP response containing a `Set-Cookie` header is received.
472. The `Set-Cookie` header is processed by `URLRequestHttpJob`.
483. The header contents are parsed into a `CanonicalCookie` and passed to the
49   `CookieStore` for storage.
50***
51
52A cookie starts as a `Set-Cookie` header sent in the server's response to an
53HTTP request:
54
55```
56HTTP/1.1 200 OK
57Date: ...
58Server: ...
59...
60Set-Cookie: chocolate_chip=tasty; Secure; SameSite=Lax; Max-Age=3600
61```
62
63The response passes through the `HttpNetworkTransaction` and
64`HttpCache::Transaction` to the `URLRequestHttpJob`. (See
65[Life of a `URLRequest`](/net/docs/life-of-a-url-request.md#send-request-and-read-the-response-headers)
66for more details.) The `URLRequestHttpJob` then reads any `Set-Cookie` headers
67in the response (there may be multiple) and processes each `Set-Cookie` header
68by calling into `//net/cookies` classes for parsing and storing:
69
70First, the cookie, which has been provided as a string, is parsed into a
71`ParsedCookie`. This struct simply records all the token-value pairs present in
72the `Set-Cookie` header and keeps track of which cookie attribute each
73corresponds to. The first token-value pair is always treated as the cookie's
74name and value.
75
76The `ParsedCookie` is then converted into a `CanonicalCookie`. This is the main
77data type representing cookies. Any cookie consumer that does not deal directly
78with HTTP headers operates on `CanonicalCookie`s. A `CanonicalCookie` has some
79additional guarantees of validity over a `ParsedCookie`, such as valid
80expiration times, valid domain and path attributes, etc. Once a
81`CanonicalCookie` is created, you will almost never see a `ParsedCookie` used
82for anything else.
83
84If a valid `CanonicalCookie` could not be created (due to some illegal syntax,
85inconsistent attribute values, or other circumstances preventing parsing), then
86we stop here, and `URLRequestHttpJob` moves on to the next `Set-Cookie` header.
87
88The `NetworkDelegate` also gets a chance to block the setting of the cookie,
89based on the user's third-party cookie blocking settings. If it is blocked,
90`URLRequestHttpJob` likewise moves on to the next `Set-Cookie` header.
91
92If this did result in a valid and not-blocked `CanonicalCookie`, it is then
93passed to the `CookieStore` to be stored.
94
95### Cookie is stored
96
97*** note
98**Summary:**
99
1001. The `CookieStore` receives the `CanonicalCookie` and validates some
101   additional criteria before updating its in-memory cache of cookies.
1022. The `CookieStore` may also update its on-disk backing store via the
103   `CookieMonster::PersistentCookieStore` interface.
1043. The result of the cookie storage attempt is reported back to the
105   `URLRequestHttpJob`.
106***
107
108The `CookieStore` lives in the `URLRequestContext` and its main implementation,
109used for most platforms, is `CookieMonster`. (The rest of this section assumes
110that we are using a `CookieMonster`.) It exposes an asynchronous interface for
111storing and retrieving cookies.
112
113When `CookieMonster` receives a `CanonicalCookie` to be set, it queues a task to
114validate and set the cookie. Most of the time this runs immediately, but it may
115be delayed if the network service has just started up, and the contents of the
116`PersistentCookieStore` are still being loaded from disk. It checks some
117criteria against the cookie's source URL and a `CookieOptions` object (which
118contains some other parameters describing the "context" in which the cookie is
119being set, such as whether it's being accessed in a same-site or cross-site
120context).
121
122If everything checks out, the `CookieMonster` proceeds with setting the cookie.
123If an equivalent cookie is present in the store, then it may be deleted.
124Equivalent is defined as sharing a name, domain, and path, based on the
125invariant specified by the RFC that no two such cookies may exist at a given
126time. `CookieMonster` stores its `CanonicalCookie`s in a multimap keyed on the
127registrable domain (eTLD+1) of the cookie's domain attribute.
128
129The cookie may also be persisted to disk by a
130`CookieMonster::PersistentCookieStore` depending on factors like whether the
131cookie is a persistent cookie (has an expiration date), whether session cookies
132should also be persisted (e.g. if the browser is set to restore the previous
133browsing session), and whether the profile should have persistent storage (e.g.
134yes for normal profiles, but not for Incognito profiles). The
135`SQLitePersistentCookieStore` is the main implementation of
136`CookieMonster::PersistentCookieStore`. It stores cookies in a SQLite database
137on disk, at a filepath specified by the user's profile.
138
139After the cookie has been stored (or rejected), the `CookieMonster` calls back
140to the `URLRequestHttpJob` with the outcome of the storage attempt. The
141`URLRequestHttpJob` stashes away the outcomes and stores them in the
142`URLRequest` after all `Set-Cookie` headers in the response are processed, so
143that interested parties (e.g.  DevTools) can subsequently be notified of cookie
144activity.
145
146### Cookie is retrieved and sent
147
148*** note
149**Summary:**
150
1511. A network request reaches the net stack and generates a `URLRequestHttpJob`,
152   which queries the `CookieStore` for cookies to include with the request.
1532. The `CookieStore` evaluates each of its candidate cookies for whether it can
154   be included in the request, and reports back to the `URLRequestHttpJob` with
155   included and excluded cookies.
1563. `URLRequestHttpJob` serializes the included cookies into a `Cookie` request
157   header and attaches it to the outgoing request.
158***
159
160Some time later, a (credentialed) request to the same eTLD+1 triggers a cookie
161access in order to retrieve the relevant cookies to include in the outgoing
162`Cookie` request header. The request makes its way to the net stack and causes a
163`URLRequestHttpJob` to be created. (See
164[Life of a `URLRequest`](/net/docs/life-of-a-url-request.md#check-the-cache_request-an-httpstream)
165for more details.) Upon being started, the `URLRequestHttpJob` asks the
166`CookieStore` to retrieve the correct cookies for the URL being requested.
167
168The `CookieMonster` queues a task to retrieve the cookies. Most of the time this
169runs immediately, except if the contents of the `PersistentCookieStore` are
170still being loaded from disk. The `CookieMonster` examines each of the cookies
171it has stored for that URL's registrable domain and decides whether it should be
172included or excluded for that request based on the requested URL and the
173`CookieOptions`, by computing a `CookieInclusionStatus`. Criteria for inclusion
174are described in
175[RFC 6265bis](https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis#section-5.5)
176and include: the URL matching the cookie's `Domain` and `Path` attributes, the
177URL being secure if the cookie has the `Secure` attribute, the request context
178(i.e. `CookieOptions`) being same-site if the cookie is subject to `SameSite`
179enforcement, etc. If any of the requirements are not met, a
180`CookieInclusionStatus::ExclusionReason` is recorded.
181
182After the exclusion reasons have been tallied up for each cookie, the cookies
183without any exclusion reasons are deemed suitable for inclusion, and are
184returned to the `URLRequestHttpJob`. The excluded cookies are also returned,
185along with the `CookieInclusionStatus` describing why each cookie was excluded.
186
187The included cookies are serialized into a `Cookie` header string (if the
188`NetworkDelegate` is ok with it, based on the user's third-party cookie blocking
189settings). The `URLRequestHttpJob` attaches this `Cookie` header to the outgoing
190request headers:
191
192```
193GET /me/want/cookie/omnomnomnom HTTP/1.1
194Host: ...
195User-Agent: ...
196Cookie: chocolate_chip=tasty
197...
198```
199
200The included cookies, excluded cookies, and their corresponding
201`CookieInclusionStatus`es are also stored in the `URLRequest` to notify
202consumers of cookie activity notifications.
203
204## Cookie implementation classes
205
206This section lists classes involved in cookie management and access.
207
208The core classes are highlighted.
209
210### In this directory (//net/cookies)
211
212*** note
213* **[`CanonicalCookie`](/net/cookies/canonical_cookie.h)**
214
215    The main data type representing cookies. Basically everything that's not
216    directly dealing with HTTP headers or their equivalents operates on these.
217
218    These are generally obtained via `CanonicalCookie::Create()`, which parses a
219    string (a `Set-Cookie` header) into an intermediate `ParsedCookie`, whose
220    fields it canonicalizes/validates and then copies into a `CanonicalCookie`.
221***
222
223*** note
224* **[`CookieStore`](/net/cookies/cookie_store.h)**
225
226    The main interface for a given platform's cookie handling. Provides
227    asynchronous methods for setting and retrieving cookies.
228
229    Its implementations are responsible for keeping track of all the cookies,
230    finding cookies relevant for given HTTP requests, saving cookies received in
231    HTTP responses, etc., and need to know quite a bit about cookie semantics.
232***
233
234*** note
235* **[`CookieMonster`](/net/cookies/cookie_monster.h)**
236
237    The implementation of `CookieStore` used on most platforms.
238
239    It stores all cookies in a multimap keyed on the eTLD+1 of the cookie's
240    domain. Also manages storage limits by evicting cookies when per-eTLD+1 or
241    global cookie counts are exceeded.
242
243    It can optionally take an implementation of
244    `CookieMonster::PersistentCookieStore` to load and store cookies
245    persisently.
246***
247
248* [`CookieOptions`](/net/cookies/cookie_options.h)
249
250    Contains parameters for a given attempt to access cookies via
251    `CookieStore`, such as whether the access is for an HTTP request (as opposed
252    to a JavaScript API), and the same-site or cross-site context of the request
253    (relevant to enforcement of the `SameSite` cookie attribute).
254
255* [`SiteForCookies`](/net/cookies/site_for_cookies.h)
256
257    Represents which origins should be considered "same-site" for a given
258    context (e.g. frame). This is used to compute the same-site or cross-site
259    context of a cookie access attempt (which is then conveyed to the
260    `CookieStore` via a `CookieOptions`).
261
262    It is generally the eTLD+1 and scheme of the top-level frame. It may also be
263    empty, in which case it represents a context that is cross-site to
264    everything (e.g. a nested iframe whose ancestor frames don't all belong to
265    the same site).
266
267* [`CookieInclusionStatus`](/net/cookies/cookie_inclusion_status.h)
268
269    Records the outcome of a given attempt to access a cookie. Various reasons
270    for cookie exclusion are recorded
271    (`CookieInclusionStatus::ExclusionReason`), as well as informational
272    statuses (`CookieInclusionStatus::WarningReason`) typically used to emit
273    warnings in DevTools.
274
275    May be used as a member of a `CookieAccessResult`, which includes even more
276    metadata about the outcome of a cookie access attempt.
277
278* [`CookieAccessDelegate`](/net/cookies/cookie_access_delegate.h)
279
280    Interface for a `CookieStore` to query information from its embedder that
281    may modify its decisions on cookie inclusion/exclusion. Its main
282    implementation allows `CookieMonster` to access data from the network
283    service layer (e.g. `CookieManager`).
284
285* [`CookieChangeDispatcher`](/net/cookies/cookie_monster_change_dispatcher.h)
286
287    Interface for subscribing to changes in the contents of the `CookieStore`.
288    The main implementation is `CookieMonsterChangeDispatcher`.
289
290### Elsewhere in //net
291
292*** note
293* **[`SQLitePersistentCookieStore`](/net/extras/sqlite/sqlite_persistent_cookie_store.h)**
294
295    Implementation of `CookieMonster::PersistentCookieStore` used on most
296    platforms. Uses a SQLite database to load and store cookies, potentially
297    using an optional delegate to encrypt and decrypt their at-rest versions.
298    This class is refcounted.
299
300    `CookieMonster` loads cookies from here on startup. All other operations
301    attempting to access cookies in the process of being loaded are blocked
302    until loading of those cookies completes. Thus, it fast-tracks loading of
303    cookies for an eTLD+1 with pending requests, to decrease latency for
304    cookie access operations made soon after browser startup (by decreasing the
305    number of cookies whose loading is blocking requests).
306***
307
308*** note
309* **[`URLRequestHttpJob`](/net/url_request/url_request_http_job.h)**
310
311    A `URLRequestJob` implementation that handles HTTP requests; most
312    relevantly, the `Cookie` and `Set-Cookie` HTTP headers. It drives the
313    process for storing cookies and retrieving cookies for HTTP requests.
314
315    Also logs cookie events to the NetLog for each request.
316***
317
318* [`URLRequest`](/net/url_request/url_request.h)
319
320    Mostly relevant for its two members, `maybe_sent_cookies_` and
321    `maybe_stored_cookies_`, which are vectors in which `URLRequestHttpJob`
322    stashes the cookies it considered sending/storing and their
323    `CookieInclusionStatus`es. These then get mojo'ed over to the browser
324    process to notify observers of cookie activity.
325
326### In //services/network
327
328*** note
329* **[`CookieManager`](/services/network/cookie_manager.h)**
330
331    The network service API to cookies. Basically exports a `CookieStore` via
332    mojo IPC.
333
334    Owned by the `NetworkContext`.
335***
336
337*** note
338* **[`RestrictedCookieManager`](/services/network/restricted_cookie_manager.h)**
339
340    Mojo interface for accessing cookies for a specific origin. This can be
341    handed out to untrusted (i.e. renderer) processes, as inputs are assumed to
342    be unsafe.
343
344    It is primarily used for accessing cookies via JavaScript.
345    It provides a synchronous interface for
346    [`document.cookie`](https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie),
347    as well as an asynchronous one for the [CookieStore API](https://wicg.github.io/cookie-store/).
348***
349
350* [`CookieSettings`](/services/network/cookie_settings.h)
351
352    Keeps track of the content settings (per-profile
353    [permissions](/components/permissions/README.md) for types of
354    content that a given origin is allowed to use) for cookies, such as the
355    user's third-party cookie blocking settings, origins/domains with
356    third-party cookie blocking exceptions or "legacy" access settings.
357
358    It is not to be confused with `content_settings::CookieSettings`, which
359    manages the browser's version of the cookie content settings, of which
360    `network::ContentSettings` is approximately a copy/mirror. The
361    `ProfileNetworkContextService` populates its contents upon `NetworkContext`
362    construction from the browser-side content settings, and also updates it
363    whenever the browser-side content settings change.
364
365* [`SessionCleanupCookieStore`](/services/network/session_cleanup_cookie_store.h)
366
367    Implements `CookieMonster::PersistentCookieStore`, by wrapping a
368    `SQLitePersistentCookieStore`. Keeps an in-memory map of cookies per eTLD+1
369    to allow deletion of cookies for sites whose cookie content setting is
370    "session-only" from the persistent store when the session ends.
371
372
373### Elsewhere
374
375* [`CookieAccessObserver`](/services/network/public/mojom/cookie_access_observer.mojom)
376  and [`WebContentsObserver`](/content/public/browser/web_contents_observer.h)
377
378    `CookieAccessObserver` is a mojo interface used to observe attempts to
379    access (read or write) cookies. It is implemented by `NavigationHandle` and
380    `RenderFrameHost`.
381
382    The cookie accesses are attributable to a committed document that called
383    `document.cookie` or made a network request (if notified through
384    `RenderFrameHost`), or a not-yet-committed navigation that resulted in a
385    network request (if notified through `NavigationHandle`).
386
387    The `CookieAccessObserver`s forward the notifications to `WebContents`,
388    which then notifies its `WebContentsObserver`s. One such
389    `WebContentsObserver` that cares about this information is
390    `PageSpecificContentSettings`, which displays information about allowed and
391    blocked cookies in UI surfaces (see next item).
392
393* [`CookiesTreeModel`](/chrome/browser/browsing_data/cookies_tree_model.h)
394
395    Stores cookie information for use in settings UI (the Page Info Bubble and
396    various `chrome://settings` pages). Populated with info from
397    `PageSpecificContentSettings`.
398
399* [`CookieJar`](/third_party/blink/renderer/core/loader/cookie_jar.h)
400
401    Implements the `document.cookie` API in the renderer by requesting a
402    `RestrictedCookieManager` from the browser.
403
404* [`CookieStore`](/third_party/blink/renderer/modules/cookie_store/cookie_store.h)
405
406    Implements the JavaScript
407    [CookieStore API](https://wicg.github.io/cookie-store/) in the renderer by
408    requesting a `RestrictedCookieManager` from the browser. (Not to be confused
409    with `net::CookieStore`.)
410
411* [`CookiesAPI`](/chrome/browser/extensions/api/cookies/cookies_api.h)
412
413    Implements the
414    [`chrome.cookies`](https://developer.chrome.com/extensions/cookies) API for
415    Chrome extensions. Gives extensions with the proper permissions essentially
416    unfettered access to the `CookieStore`.
417
418### Platform-specific
419
420* [`CookieStoreIOS` and `CookieStoreIOSPersistent`](/ios/net/cookies)
421
422    iOS-specific `CookieStore` implementations, mainly relying on the iOS native
423    cookie implementation (`NSHTTPCookie`).
424
425* [`android_webview::CookieManager`](/android_webview/browser/cookie_manager.h)
426
427    Manages cookies for Android WebView. It typically wraps a
428    `network::mojom::CookieManager`, but it can also be used before a
429    `NetworkContext` even exists, thanks to Android WebView's
430    [cookie API](https://developer.android.com/reference/kotlin/android/webkit/CookieManager),
431    which means it is sometimes initialized with a bare `net::CookieStore`.
432
433    Also notable for allowing cookies for `file://` scheme URLs (normally they
434    are only allowed for HTTP and websocket schemes and `chrome-extension://`),
435    though this is non-default and deprecated.
436
437## Main interfaces for finding, setting, deleting, and observing cookies
438
439This section summarizes interfaces for interacting with cookies from various
440parts of the codebase.
441
442### From //net or //services/network
443
444*** note
445Use [`net::CookieStore`](/net/cookies/cookie_store.h) to save and retrieve
446[`CanonicalCookie`](/net/cookies/canonical_cookie.h)s.
447***
448
449* `CanonicalCookie`s are the main data type representing cookies. Get one using
450  `CanonicalCookie::Create()`.
451
452* The `CookieStore` can be accessed via its owning `URLRequestContext`, which
453  can be accessed through `NetworkContext`.
454
455* To access cookies, you need a `CookieOptions`. The main things in this object
456  are the `HttpOnly` access permission and the `SameSite` context. The latter
457  can be obtained from [`cookie_util`](/net/cookies/cookie_util.h) functions.
458
459* Retrieve cookies using `GetCookieListWithOptionsAsync()`.
460
461* Save cookies using `SetCanonicalCookieAsync()`.
462
463*** note
464Use `CookieStore` to selectively delete cookies.
465***
466
467* `DeleteCanonicalCookieAsync()` deletes a single cookie.
468
469* `DeleteAllCreatedInTimeRangeAsync()` deletes cookies created in a time range.
470
471* `DeleteAllMatchingInfoAsync()` deletes cookies that match a filter.
472
473*** note
474Use the [`CookieChangeDispatcher`](/net/cookies/cookie_change_dispatcher.h)
475interface to subscribe to changes.
476***
477
478* Use `AddCallbackForCookie()` to observe changes to cookies with a given name
479  that would be sent with a request to a specific URL.
480
481* Use `AddCallbackForUrl()` to observe changes to all cookies that would be sent
482  with a request to a specific URL.
483
484* Use `AddCallbackForAllChanges()` to observe changes to all cookies in the
485  `CookieStore`.
486
487### From the browser process
488
489*** note
490Use [`CookieManager`](/services/network/cookie_manager.h)
491(which basically exports a `net::CookieStore` interface via mojo) to save
492and retrieve [`CanonicalCookie`](/net/cookies/canonical_cookie.h)s.
493***
494
495* The profile's `CookieManager` can be accessed from the browser process through
496  `StoragePartition::GetCookieManagerForBrowserProcess()`.
497
498* You can also get get a `CookieManager` pipe from the `NetworkContext` using
499  `GetCookieManager()`.
500
501* Retrieve cookies using `CookieManager::GetCookieList()`.
502
503* Save cookies using `CookieManager::SetCanonicalCookie()`.
504
505*** note
506Use `CookieManager` to selectively delete cookies.
507***
508
509* If you have a copy of the `CanonicalCookie` to delete (e.g. a cookie
510  previously fetched from the store), use
511  `CookieManager::DeleteCanonicalCookie()`.
512
513* To delete cookies with certain characteristics, construct a
514  [`CookieDeletionFilter`](/services/network/public/mojom/cookie_manager.mojom)
515  and use `CookieManager::DeleteCookies()`.
516
517*** note
518Use `CookieManager`'s change listener interface to subscribe to changes (this
519parallels the `net::CookieChangeDispatcher` interface).
520***
521
522* Add a `CookieChangeListener` registration for a URL (and optionally a cookie
523  name) via `AddCookieChangeListener()`
524
525* Add a `CookieChangeListener` registration for all cookies via
526  `AddGlobalChangeListener()`.
527
528### From untrusted (e.g. renderer) processes
529
530*** note
531Use a
532[`network::mojom::RestrictedCookieManager`](/services/network/public/mojom/restricted_cookie_manager.mojom)
533interface to access cookies for a particular origin.
534***
535
536* Request a `RestrictedCookieManager` interface from the browser. This creates a
537  `RestrictedCookieManager` bound to a `RenderFrameHost`, which can only access
538  cookies on behalf of the corresponding origin.
539
540* Cookies can be read and written asynchronously (`GetAllForUrl()`,
541  `SetCanonicalCookie()`) or synchronously (`SetCookieFromString()`,
542  `GetCookiesString()`).
543
544* [Compromised renderers](/docs/security/compromised-renderers.md#Cookies)
545  shouldn't be able to access cookies of another site, or `HttpOnly` cookies
546  (even from the same site).
547