- Notifications
You must be signed in to change notification settings - Fork282
RFC6265 Cookies and CookieJar for Node.js
License
salesforce/tough-cookie
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
A Node.js implementation ofRFC6265 for cookie parsing, storage, and retrieval.
Install Tough Cookie usingnpm
:
npm install tough-cookie
oryarn
:
yarn add tough-cookie
import{Cookie,CookieJar}from'tough-cookie'// parse a `Cookie` request headerconstreqCookies='ID=298zf09hf012fh2; csrf=u32t4o3tb3gg43; _gat=1'.split(';').map(Cookie.parse)// generate a `Cookie` request headerconstcookieHeader=reqCookies.map((cookie)=>cookie.cookieString()).join(';')// parse a Set-Cookie response headerconstresCookie=Cookie.parse('foo=bar; Domain=example.com; Path=/; Expires=Tue, 21 Oct 2025 00:00:00 GMT',)// generate a Set-Cookie response headerconstsetCookieHeader=cookie.toString()// store and retrieve cookiesconstcookieJar=newCookieJar()// uses the in-memory store by defaultawaitcookieJar.setCookie(resCookie,'https://example.com/')constmatchingCookies=awaitcookieJar.getCookies('https://example.com/')
Important
For more detailed usage information, refer to theAPI docs.
Support forRFC6265bis is being developed. As these revisions toRFC6252 arestill inActive Internet-Draft
state, the areas of support that follow are subject to change.
This change makes it possible for servers, and supporting clients, to mitigate certain types of CSRFattacks by disallowingSameSite
cookies from being sent cross-origin.
import{CookieJar}from'tough-cookie'constcookieJar=newCookieJar()// uses the in-memory store by default// storing cookies with various SameSite attributesawaitcookieJar.setCookie('strict=authorized; SameSite=strict','http://example.com/index.html',)awaitcookieJar.setCookie('lax=okay; SameSite=lax','http://example.com/index.html',)awaitcookieJar.setCookie('normal=whatever','http://example.com/index.html')// retrieving cookies using a SameSite contextconstlaxCookies=awaitcookieJar.getCookies('http://example.com/index.html',{// the first cookie (strict=authorized) will not be returned if the context is 'lax'// but the other two cookies will be returnedsameSiteContext:'lax',})
Note
It is highly recommended that you readRFC6265bis - Section 8.8 for more details on SameSite cookies, security considerations, and defense in depth.
Cookie prefixes are a way to indicate that a given cookie was set with a set of attributes simply byinspecting the first few characters of the cookie's name.
Two prefixes are defined:
"__Secure-"
If a cookie's name begins with a case-sensitive match for the string
__Secure-
, then the cookie was set with a "Secure" attribute."__Host-"
If a cookie's name begins with a case-sensitive match for the string
__Host-
, then the cookie was set with a "Secure" attribute, a "Path" attribute with a value of "/", and no "Domain" attribute.
IfprefixSecurity
is enabled forCookieJar
, then cookies that match the prefixes defined above but donot obey the attribute restrictions are not added.
You can define this functionality by passing in theprefixSecurity
option toCookieJar
. It can be one of 3 values:
silent
: (default) Enable cookie prefix checking but silently fail to add the cookie if conditions are not met.strict
: Enable cookie prefix checking and error out if conditions are not met.unsafe-disabled
: Disable cookie prefix checking.
If
ignoreError
is passed in astrue
when setting a cookie then the error is silent regardless of theprefixSecurity
option (assuming it's enabled).
import{CookieJar,MemoryCookieStore}from'tough-cookie'constcookieJar=newCookieJar(newMemoryCookieStore(),{prefixSecurity:'silent',})// this cookie will be silently ignored since the url is insecure (http)awaitcookieJar.setCookie('__Secure-SID=12345; Domain=example.com; Secure;','http://example.com',)// this cookie will be stored since the url is secure (https)awaitcookieJar.setCookie('__Secure-SID=12345; Domain=example.com; Secure;','https://example.com',)
Note
It is highly recommended that you readRFC6265bis - Section 4.1.3 for more details on Cookie Prefixes.
We follow theNode.js release schedule and supportall versions that are in Active LTS or Maintenance. We will always do a major release when dropping supportfor older versions of node, and we will do so in consultation with our community.
About
RFC6265 Cookies and CookieJar for Node.js
Resources
License
Code of conduct
Security policy
Uh oh!
There was an error while loading.Please reload this page.