Set-Cookie
åºçº¿
广æ³å¯ç¨
*
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
Set-Cookie HTTP ååºæ 头ç¨äºå° cookie ç±æå¡å¨åéå°ç¨æ·ä»£çï¼ä»¥ä¾¿ç¨æ·ä»£çå¨åç»ç请æ±ä¸å¯ä»¥å°å
¶åéåæå¡å¨ãè¦åéå¤ä¸ª cookieï¼ååºå¨åä¸ååºä¸åéå¤ä¸ª Set-Cookie æ 头ã
è¦åï¼æ ¹æ® Fetch è§èï¼Set-Cookie æ¯ä¸ä¸ªç¦æ¢ä¿®æ¹çååºæ 头ï¼å¯¹åºçååºå¨è¢«æ´é²ç»å端代ç åï¼å¿
须滤é¤è¿ä¸ååºæ 头ï¼å³æµè§å¨ä¼é»æ¢å端 JavaScript 代ç 访é®è¯¥æ 头ã
æ´å¤ä¿¡æ¯è¯·æ¥é æåï¼ä½¿ç¨ HTTP cookieã
| æ 头类å | ååºæ 头 |
|---|---|
| ç¦æ¢ä¿®æ¹çæ 头 | å¦ |
| ç¦æ¢ä¿®æ¹çååºæ 头 | æ¯ |
è¯æ³
Set-Cookie: <cookie-name>=<cookie-value>
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<number>
Set-Cookie: <cookie-name>=<cookie-value>; Partitioned
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
Set-Cookie: <cookie-name>=<cookie-value>; Secure
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=None; Secure
// å¯ä»¥åæ¶æå¤ä¸ªå±æ§ï¼ä¾å¦ï¼
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly
屿§
-
å®ä¹ cookie çåç§°åå¼ãcookie çå®ä¹ä»¥ä¸ä¸ªåç§°/å¼å¯¹å¼å§ã
<cookie-name>å¯ä»¥å å«é¤äºæ§å¶å符ï¼ASCII å符 0 è³ 31ï¼ä»¥å ASCII å符 127ï¼ååé符ï¼ç©ºæ ¼ãå¶è¡¨ç¬¦å以ä¸å符ï¼( ) < > @ , ; : \ " / [ ] ? = { }ï¼ä¹å¤çä»»ä½ US-ASCII å符ã<cookie-value>å¯ä»¥éæ©å 裹å¨åå¼å·ä¸ãæ¯æé¤äºæ§å¶å符ï¼ASCII å符 0 è³ 31ï¼ä»¥å ASCII å符 127ï¼ã空ç½å符ãåå¼å·ãéå·ãåå·ä»¥ååææ ä¹å¤çä»»æ US-ASCII å符ãç¼ç ï¼è®¸å¤å®ç°ä¼å¯¹ cookie å¼è¿è¡ URL ç¼ç ã使¯æç § RFC è§èï¼è¿ä¸æ¯å¿ é¡»çãä¸è¿ URL ç¼ç æå©äºæ»¡è¶³
<cookie-value>对å 许使ç¨çå符çè¦æ±ã夿³¨ï¼ä¸äº
<cookie-name>å ·æç¹æ®çè¯ä¹ï¼__Secure-åç¼ï¼ä»¥__Secure-为åç¼ç cookieï¼è¿æ¥ç¬¦æ¯åç¼çä¸é¨åï¼ï¼å¿ é¡»ä¸secureæ å¿ä¸å设置ï¼åæ¶å¿ é¡»åºç¨äºå®å ¨é¡µé¢ï¼HTTPSï¼ã__Host-åç¼ï¼ä»¥__Host-为åç¼ç cookieï¼å¿ é¡»ä¸secureæ å¿ä¸å设置ï¼å¿ é¡»åºç¨äºå®å ¨é¡µé¢ï¼HTTPSï¼ï¼ä¹ç¦æ¢æå® domain 屿§ï¼ä¹å°±ä¸ä¼åéç»åååï¼ï¼åæ¶ path 屿§çå¼å¿ 须为/ã Domain=<domain-value>å¯é-
æå® cookie å¯ä»¥éè¾¾ç主æºã
åªè½å°å¼è®¾ç½®ä¸ºå½åååææ´é«çº§å«çååï¼é¤éæ¯å ¬å ±åç¼ï¼ã设置ååå°ä¼ä½¿ cookie 对æå®çåååå ¶ææåååå¯ç¨ã
è¥ç¼ºçï¼åæ¤å±æ§é»è®¤ä¸ºå½åææ¡£ URL ç主æºï¼ä¸å æ¬åååï¼ã
ä¸ä¹åçè§èä¸åï¼ååï¼
.example.comï¼çå导ç¹å·ä¼è¢«å¿½ç¥ãå¤ä¸ªä¸»æº/ååç弿¯ä¸è¢«å 许çï¼ä½å¦ææå®äºä¸ä¸ªååï¼åå ¶ååå乿»ä¼è¢«å å«ã
Expires=<date>å¯é-
以 HTTP æ¥ææ¶é´æ³å½¢å¼æå®ç cookie çæé¿æææ¶é´ãåè§
Date以äºè§£è¦æ±çæ ¼å¼ãå¦ææ²¡ææå®ï¼é£ä¹ä¼æ¯ä¸ä¸ªä¼è¯æ cookieãä¼è¯å¨å®¢æ·ç«¯è¢«å ³éæ¶ç»æï¼è¿æå³çä¼è¯æ cookie ä¼å¨å½¼æ¶è¢«ç§»é¤ã
è¦åï¼ç¶èï¼å¾å¤ Web æµè§å¨æ¯æä¼è¯æ¢å¤ç¹æ§ï¼è¿å¯ä»¥ä½¿æµè§å¨ä¿çææçæ ç¾ï¼ç¶åå¨éæ°æå¼æµè§å¨çæ¶åå°å ¶è¿åã䏿¤åæ¶ï¼cookie ä¹ä¼æ¢å¤ï¼å°±è·ä»æ¥æ²¡æå ³éæµè§å¨ä¸æ ·ã
å¦æè®¾ç½®äº
Expiresæ¥æï¼å ¶æªæ¢æ¶é´ä¸å®¢æ·ç«¯ç¸å ³ï¼èéæå¡å¨çæ¶é´ã HttpOnlyå¯é-
黿¢ JavaScript éè¿
Document.cookie屿§è®¿é® cookieãæ³¨æï¼è®¾ç½®äºHttpOnlyç cookie ä»ç¶ä¼éè¿ JavaScript åèµ·ç请æ±åéãä¾å¦ï¼è°ç¨XMLHttpRequest.send()æfetch()ãå ¶ç¨äºé²èè·¨ç«èæ¬æ»å»ï¼XSSï¼ã Max-Age=<number>å¯é-
å¨ cookie è¿æä¹åéè¦ç»è¿çç§æ°ãç§æ°ä¸º 0 æè´å¼å°ä¼ä½¿ cookie ç«å»è¿æãåå¦åæ¶è®¾ç½®äº
ExpiresåMax-Age屿§ï¼é£ä¹Max-Ageçä¼å 级æ´é«ã Partitionedå¯é-
表示åºä½¿ç¨ååºå卿¥åå¨ cookieãæå ³æ´å¤è¯¦ç»ä¿¡æ¯ï¼è¯·åè§å ·æç¬ç«ååºç¶æç Cookieï¼CHIPSï¼ã
Path=<path-value>å¯é-
表示æµè§å¨è¦åé该
Cookieæ 头æ¶ï¼è¯·æ±ç URL ä¸æå¿ é¡»åå¨çè·¯å¾ãæ£ææ ï¼
/ï¼å符å¯ä»¥è§£é为ç®å½åé符ï¼ä¸åç®å½ä¹æ»¡è¶³å¹é çæ¡ä»¶ãä¾å¦ï¼å¦æpath=/docsï¼é£ä¹- 请æ±è·¯å¾
/docsã/docs/ã/docs/Web/å/docs/Web/HTTP齿»¡è¶³å¹é æ¡ä»¶ã - 请æ±è·¯å¾
/ã/docsetsæè/fr/docså䏿»¡è¶³å¹é æ¡ä»¶ã
- 请æ±è·¯å¾
SameSite=<samesite-value>å¯é-
æ§å¶ cookie æ¯å¦éè·¨ç«è¯·æ±ä¸èµ·åéï¼è¿æ ·å¯ä»¥å¨ä¸å®ç¨åº¦ä¸é²èè·¨ç«è¯·æ±ä¼ªé æ»å»ï¼CSRFï¼ã
å¯éç屿§å¼æï¼
Strict-
è¿æå³æµè§å¨ä» 对åä¸ç«ç¹ç请æ±åé cookieï¼å³è¯·æ±æ¥èªè®¾ç½® cookie çç«ç¹ãå¦æè¯·æ±æ¥èªä¸åçååæåè®®ï¼å³ä½¿æ¯ç¸åååï¼ï¼åæºå¸¦æ
SameSite=Strict屿§ç cookie ä¸ä¼è¢«åéã Lax-
è¿æå³ç cookie ä¸ä¼å¨è·¨ç«è¯·æ±ä¸è¢«åéï¼å¦ï¼å è½½å¾åææ¡æ¶ï¼frameï¼ç请æ±ãä½ cookie å¨ç¨æ·ä»å¤é¨ç«ç¹å¯¼èªå°æºç«æ¶ï¼cookie ä¹ä¼è¢«åéï¼ä¾å¦ï¼è®¿é®ä¸ä¸ªé¾æ¥ï¼ãè¿æ¯
SameSite屿§æªè¢«è®¾ç½®æ¶çé»è®¤è¡ä¸ºã None-
è¿æå³çæµè§å¨å¨è·¨ç«ååç«è¯·æ±ä¸åä¼åé cookieãå¨è®¾ç½®è¿ä¸å±æ§å¼æ¶ï¼å¿ é¡»åæ¶è®¾ç½®
Secure屿§ï¼å°±åè¿æ ·ï¼SameSite=None; Secureã妿æªè®¾ç½®Secureï¼åä¼åºç°ä»¥ä¸é误ï¼Cookie "myCookie" rejected because it has the "SameSite=None" attribute but is missing the "secure" attribute. This Set-Cookie was blocked because it had the "SameSite=None" attribute but did not have the "Secure" attribute, which is required in order to use "SameSite=None".
夿³¨ï¼
Securecookie ä» å¨ä½¿ç¨ HTTPS åè®®åéå å¯è¯·æ±æ¶æä¼è¢«åéå°æå¡å¨ã请注æï¼éå®å ¨ç«ç¹ï¼http:ï¼æ æ³ä¸º cookie 设置Secureæä»¤ï¼å æ¤ä¹æ æ³ä½¿ç¨SameSite=Noneã
Secureå¯é-
è¡¨ç¤ºä» å½è¯·æ±éè¿
https:åè®®ï¼localhost ä¸åæ¤éå¶ï¼åéæ¶æä¼å°è¯¥ cookie åéå°æå¡å¨ï¼å æ¤å ¶æ´è½å¤æµæä¸é´äººæ»å»ã夿³¨ï¼ä¸è¦å设
Secureä¼é»æ¢ææç对 cookie 䏿æä¿¡æ¯ï¼ä¼è¯å¯é¥ãç»å½ä¿¡æ¯ï¼ççï¼ç访é®ãæºå¸¦è¿ä¸å±æ§ç cookie å¨ä¸è®¾ç½®HttpOnly屿§çæ åµä¸ä»è½ä»å®¢æ·ç«¯çç¡¬çææ¯ä» JavaScript ä¸è®¿é®åæ´æ¹ãéå®å ¨ç«ç¹ï¼
http:ï¼ä¸è½å¨ cookie ä¸è®¾ç½®Secure屿§ï¼ä» Chrome 52 å Firefox 52 å¼å§ï¼ãå½Secure屿§ç± localhost 设置æ¶ï¼https:çè¦æ±ä¼è¢«å¿½ç¥ï¼ä» Chrome 89 å Firefox 75 å¼å§ï¼ã
示ä¾
>ä¼è¯æ cookie
ä¼è¯æ cookie ä¼å¨å®¢æ·ç«¯å
³éæ¶è¢«ç§»é¤ãè¥ cookie ä¸è®¾ç½® Expires æ Max-Age 屿§ï¼åå
¶ä¸ºä¼è¯æ cookieã
Set-Cookie: sessionId=38afes7a8
æä¹ å cookie
æä¹
å cookie ä¸ä¼å¨å®¢æ·ç«¯å
³éæ¶å¤±æï¼èæ¯å¨ç¹å®çæ¥æï¼Expiresï¼æè
ç»è¿ä¸æ®µç¹å®çæ¶é´ï¼Max-Ageï¼ä¹åæä¼å¤±æã
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT
Set-Cookie: id=a3fWa; Max-Age=2592000
æ æåå
妿 cookie çååä¸å å«è®¾ç½®è¯¥ååçæå¡å¨ï¼åå ¶åºè¯¥è¢«ç¨æ·ä»£çæç»ã
以ä¸ç cookie 妿æ¯ç±æç®¡å¨ originalcompany.com ä¸çæå¡å¨è®¾ç½®çï¼åä¼è¢«æç»ï¼
Set-Cookie: qwerty=219ffwef9w0f; Domain=somecompany.co.uk
æå¡å¨å°è¯ä¸ºå ¶ååçååå设置ç cookie ä¹ä¼è¢«æç»ã
以ä¸ç cookie å妿¯ç±æç®¡å¨ example.com ä¸çæå¡å¨è®¾ç½®çï¼åä¼è¢«æç»ï¼
Set-Cookie: sessionId=e8bb43229de9; Domain=foo.example.com
Cookie åç¼
ä»
å¨ä½¿ç¨äºå®å
¨ï¼HTTPSï¼æ¥æºï¼å¹¶åæ¶è®¾ç½® secure 屿§æ¶æè½ä½¿ç¨åç§°ä¸å
å« __Secure- æ __Host- åç¼ç cookieã
å¦å¤ï¼åå¦ cookie 以 __Host- 为åç¼ï¼é£ä¹ path 屿§çå¼å¿
须为 /ï¼è¡¨ç¤ºä¸»æºçä»»ä½è·¯å¾ï¼ï¼ä¸ä¸è½å«æ Domain 屿§ã
è¦åï¼å¯¹äºä¸æ¯æ cookie åç¼ç客æ·ç«¯ï¼æ æ³ä¿è¯è¿äºéå çæ¡ä»¶æç«ï¼æä»¥å¸¦åç¼ç cookie å°å§ç»è¢«æ¥åã
// å½ååºæ¥èªå®å
¨æ¥æºï¼HTTPSï¼æ¶ï¼äºè
é½ä¼è¢«æ¥å
Set-Cookie: __Secure-ID=123; Secure; Domain=example.com
Set-Cookie: __Host-ID=123; Secure; Path=/
// ç¼ºå° Secure 屿§ï¼ä¼è¢«æç»
Set-Cookie: __Secure-id=1
// ç¼ºå° Path=/ 屿§ï¼ä¼è¢«æç»
Set-Cookie: __Host-id=1; Secure
// ç±äºè®¾ç½®äº Domain 屿§ï¼ä¼è¢«æç»
Set-Cookie: __Host-id=1; Secure; Path=/; domain=example.com
ååº cookie
Set-Cookie: __Host-example=34d8g; SameSite=None; Secure; Path=/; Partitioned;
夿³¨ï¼ååº cookie å¿
须设置 Secure å Path=/ãæ¤å¤ï¼å»ºè®®å¨è®¾ç½®ååº cookie æ¶ä½¿ç¨ __Host åç¼ï¼ä»¥ä½¿å
¶ç»å®å°ä¸»æºåè䏿¯å¯æ³¨åçååã
è§è
| è§è |
|---|
| HTTP State Management Mechanism > # sane-set-cookie > |
æµè§å¨å ¼å®¹æ§
å ¼å®¹æ§è¯´æ
- ä» Chrome 52 å Firefox 52 å¼å§ï¼éå®å
¨ç«ç¹ï¼
http:ï¼æ æ³å¨ cookie ä¸è®¾ç½®Secure屿§ã
åè§
- HTTP cookie
CookieDocument.cookie- SameSite Cookie 说æï¼web.developers.google.cn å客ï¼