Cookie æ¯ç´æ¥åå¨å¨æµè§å¨ä¸çä¸å°ä¸²æ°æ®ãå®ä»¬æ¯ HTTP åè®®çä¸é¨åï¼ç± RFC 6265 è§èå®ä¹ã
Cookie é常æ¯ç± Web æå¡å¨ä½¿ç¨ååº Set-Cookie HTTP-header 设置çãç¶åæµè§å¨ä½¿ç¨ Cookie HTTP-header å°å®ä»¬èªå¨æ·»å å°ï¼å ä¹ï¼æ¯ä¸ªå¯¹ç¸ååç请æ±ä¸ã
æå¸¸è§çç¨å¤ä¹ä¸å°±æ¯èº«ä»½éªè¯ï¼
- ç»å½åï¼æå¡å¨å¨ååºä¸ä½¿ç¨
Set-CookieHTTP-header æ¥è®¾ç½®å ·æå¯ä¸âä¼è¯æ è¯ç¬¦ï¼session identifierï¼âç cookieã - 䏿¬¡å½è¯·æ±è¢«åéå°åä¸ä¸ªåæ¶ï¼æµè§å¨ä¼ä½¿ç¨
CookieHTTP-header éè¿ç½ç»åé cookieã - æä»¥æå¡å¨ç¥éæ¯è°åèµ·äºè¯·æ±ã
æä»¬è¿å¯ä»¥ä½¿ç¨ document.cookie 屿§ä»æµè§å¨è®¿é® cookieã
å ³äº cookie åå ¶éé¡¹ï¼æå¾å¤æ£æçäºæ ã卿¬ç« ä¸ï¼æä»¬å°è¯¦ç»ä»ç»å®ä»¬ã
ä» document.cookie ä¸è¯»å
ä½ çæµè§å¨æ¯å¦åå¨äºæ¬ç½ç«çä»»ä½ cookieï¼è®©æä»¬æ¥ççï¼
// å¨ javascript.infoï¼æä»¬ä½¿ç¨è°·æåææ¥è¿è¡ç»è®¡ï¼
// æä»¥åºè¯¥åå¨ä¸äº cookie
alert( document.cookie ); // cookie1=value1; cookie2=value2;...
document.cookie çå¼ç± name=value å¯¹ç»æï¼ä»¥ ; åéãæ¯ä¸ä¸ªé½æ¯ç¬ç«ç cookieã
ä¸ºäºæ¾å°ä¸ä¸ªç¹å®ç cookieï¼æä»¬å¯ä»¥ä»¥ ; ä½ä¸ºåéï¼å° document.cookie åå¼ï¼ç¶åæ¾å°å¯¹åºçååãæä»¬å¯ä»¥ä½¿ç¨æ£åè¡¨è¾¾å¼æè
æ°ç»å½æ°æ¥å®ç°ã
æä»¬æè¿ä¸ªçç»è¯»è å½ä½ç»ä¹ ãæ¤å¤ï¼å¨æ¬ç« çæåï¼ä½ å¯ä»¥æ¾å°ä¸äºæä½ cookie çè¾ å©å½æ°ã
åå ¥ document.cookie
æä»¬å¯ä»¥åå
¥ document.cookieãä½è¿ä¸æ¯ä¸ä¸ªæ°æ®å±æ§ï¼å®æ¯ä¸ä¸ª 访é®å¨ï¼getter/setterï¼ã对å
¶çèµå¼æä½ä¼è¢«ç¹æ®å¤çã
对 document.cookie çåå
¥æä½åªä¼æ´æ°å
¶ä¸æå°ç cookieï¼èä¸ä¼æ¶åå
¶ä» cookieã
ä¾å¦ï¼æ¤è°ç¨è®¾ç½®äºä¸ä¸ªå称为 user ä¸å¼ä¸º John ç cookieï¼
document.cookie = "user=John"; // åªä¼æ´æ°å称为 user ç cookie
alert(document.cookie); // å±ç¤ºææ cookie
å¦æä½ è¿è¡äºä¸é¢è¿æ®µä»£ç ï¼ä½ ä¼çå°å¤ä¸ª cookieãè¿æ¯å 为 document.cookie= æä½ä¸æ¯éåæ´ææ cookieãå®åªè®¾ç½®ä»£ç 䏿å°ç cookie userã
仿æ¯ä¸è®²ï¼cookie çåç§°åå¼å¯ä»¥æ¯ä»»ä½å符ã为äºä¿æææçæ ¼å¼ï¼å®ä»¬åºè¯¥ä½¿ç¨å
建ç encodeURIComponent 彿°å¯¹å
¶è¿è¡è½¬ä¹ï¼
// ç¹æ®å符ï¼ç©ºæ ¼ï¼ï¼éè¦ç¼ç
let name = "my name";
let value = "John Smith"
// å° cookie ç¼ç 为 my%20name=John%20Smith
document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value);
alert(document.cookie); // ...; my%20name=John%20Smith
åå¨ä¸äºéå¶ï¼
encodeURIComponentç¼ç åçname=value对ï¼å¤§å°ä¸è½è¶ è¿ 4KBãå æ¤ï¼æä»¬ä¸è½å¨ä¸ä¸ª cookie ä¸ä¿å大çä¸è¥¿ã- æ¯ä¸ªåç cookie æ»æ°ä¸å¾è¶ è¿ 20+ å·¦å³ï¼å ·ä½éå¶åå³äºæµè§å¨ã
Cookie æå 个é项ï¼å ¶ä¸å¾å¤é½å¾éè¦ï¼åºè¯¥è®¾ç½®å®ã
é项被åå¨ key=value ä¹åï¼ä»¥ ; åéï¼åè¿æ ·ï¼
document.cookie = "user=John; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT"
path
path=/mypath
url è·¯å¾åç¼å¿ é¡»æ¯ç»å¯¹è·¯å¾ãå®ä½¿å¾è¯¥è·¯å¾ä¸ç页é¢å¯ä»¥è®¿é®è¯¥ cookieãé»è®¤ä¸ºå½åè·¯å¾ã
妿ä¸ä¸ª cookie 带æ path=/admin 设置ï¼é£ä¹è¯¥ cookie å¨ /admin å /admin/something ä¸é½æ¯å¯è§çï¼ä½æ¯å¨ /home æ /adminpage ä¸ä¸å¯è§ã
éå¸¸ï¼æä»¬åºè¯¥å° path è®¾ç½®ä¸ºæ ¹ç®å½ï¼path=/ï¼ä»¥ä½¿ cookie 对æ¤ç½ç«çææé¡µé¢å¯è§ã
domain
domain=site.com
domain æ§å¶äºå¯è®¿é® cookie çåã使¯å¨å®é ä¸ï¼æä¸äºéå¶ãæä»¬æ æ³è®¾ç½®ä»»ä½åã
æ æ³ä»å¦ä¸ä¸ªäºçº§åè®¿é® cookieï¼å æ¤ other.com æ°¸è¿ä¸ä¼æ¶å°å¨ site.com 设置ç cookieã
è¿æ¯ä¸é¡¹å®å ¨éå¶ï¼ä¸ºäºå 许æä»¬å°æææ°æ®åå¨å¨åºè¯¥ä» å¨ä¸ä¸ªç«ç¹ä¸å¯ç¨ç cookie ä¸ã
é»è®¤æ åµä¸ï¼cookie åªæå¨è®¾ç½®çå䏿è½è¢«è®¿é®å°ã
请注æï¼é»è®¤æ
åµä¸ï¼cookie ä¹ä¸ä¼å
±äº«ç»ååï¼ä¾å¦ forum.site.comã
// 妿æä»¬å¨ site.com ç½ç«ä¸è®¾ç½®äº cookieâ¦â¦
document.cookie = "user=John"
// â¦â¦å¨ forum.site.com åä¸æä»¬æ æ³è®¿é®å®
alert(document.cookie); // 没æ user
â¦â¦ä½è¿æ¯å¯ä»¥è®¾ç½®çã妿æä»¬æ³å
许å forum.site.com è¿æ ·çååå¨ site.com ä¸è®¾ç½® cookieï¼ä¹æ¯å¯ä»¥å®ç°çã
为æ¤ï¼å½å¨ site.com 设置 cookie æ¶ï¼æä»¬åºè¯¥æç¡®å°å° domain éé¡¹è®¾ç½®ä¸ºæ ¹åï¼domain=site.comãé£ä¹ï¼ææååé½å¯ä»¥è®¿é®å°è¿æ ·ç cookieã
ä¾å¦ï¼
// å¨ site.com
// 使 cookie å¯ä»¥è¢«å¨ä»»ä½åå *.site.com 访é®ï¼
document.cookie = "user=John; domain=site.com"
// ä¹å
// å¨ forum.site.com
alert(document.cookie); // æ cookie user=John
åºäºåå²åå ï¼domain=.site.comï¼site.com å颿ä¸ä¸ªç¹ç¬¦å·ï¼ä¹ä»¥ç¸åçæ¹å¼å·¥ä½ï¼å
许ä»ååè®¿é® cookieãè¿æ¯ä¸ä¸ªæ§ç表示æ¹å¼ï¼å¦ææä»¬éè¦æ¯æé常æ§çæµè§å¨ï¼é£ä¹åºè¯¥ä½¿ç¨å®ã
æ»ç»ä¸ä¸ï¼éè¿ domain é项ç设置ï¼å¯ä»¥å®ç°å
许å¨ååè®¿é® cookieã
expiresï¼max-age
é»è®¤æ åµä¸ï¼å¦æä¸ä¸ª cookie è¿ä¸¤ä¸ªåæ°é½æ²¡æè®¾ç½®ï¼é£ä¹å¨å ³éæµè§å¨ä¹åï¼å®å°±ä¼æ¶å¤±ãæ¤ç±» cookie 被称为 "session cookieâã
为äºè®© cookie 卿µè§å¨å
³éåä»ç¶åå¨ï¼æä»¬å¯ä»¥è®¾ç½® expires æ max-age é项ä¸çä¸ä¸ªã
expires=Tue, 19 Jan 2038 03:14:07 GMT
cookie çè¿ææ¶é´å®ä¹äºæµè§å¨ä¼èªå¨æ¸ é¤è¯¥ cookie çæ¶é´ã
æ¥æå¿
é¡»å®å
¨éç¨ GMT æ¶åºçè¿ç§æ ¼å¼ãæä»¬å¯ä»¥ä½¿ç¨ date.toUTCString æ¥è·åå®ãä¾å¦ï¼æä»¬å¯ä»¥å° cookie 设置为 1 天åè¿æã
// å½åæ¶é´ +1 天
let date = new Date(Date.now() + 86400e3);
date = date.toUTCString();
document.cookie = "user=John; expires=" + date;
妿æä»¬å° expires 设置为è¿å»çæ¶é´ï¼å cookie ä¼è¢«å é¤ã
max-age=3600
宿¯ expires çæ¿ä»£éé¡¹ï¼ææäº cookie çè¿ææ¶é´è·ç¦»å½åæ¶é´çç§æ°ã
妿å°å ¶è®¾ç½®ä¸º 0 æè´æ°ï¼å cookie ä¼è¢«å é¤ï¼
// cookie ä¼å¨ä¸å°æ¶å失æ
document.cookie = "user=John; max-age=3600";
// å é¤ cookieï¼è®©å®ç«å³è¿æï¼
document.cookie = "user=John; max-age=0";
secure
secure
Cookie åºåªè½è¢«éè¿ HTTPS ä¼ è¾ã
é»è®¤æ
åµä¸ï¼å¦ææä»¬å¨ http://site.com ä¸è®¾ç½®äº cookieï¼é£ä¹è¯¥ cookie ä¹ä¼åºç°å¨ https://site.com ä¸ï¼åä¹äº¦ç¶ã
ä¹å°±æ¯è¯´ï¼cookie æ¯åºäºåçï¼å®ä»¬ä¸åºååè®®ã
ä½¿ç¨æ¤é项ï¼å¦æä¸ä¸ª cookie æ¯éè¿ https://site.com 设置çï¼é£ä¹å®ä¸ä¼å¨ç¸ååç HTTP ç¯å¢ä¸åºç°ï¼ä¾å¦ http://site.comãæä»¥ï¼å¦æä¸ä¸ª cookie å
å«ç»ä¸åºè¯¥éè¿æªå å¯ç HTTP åè®®åéçææå
容ï¼é£ä¹å°±åºè¯¥è®¾ç½® secure æ è¯ã
// å设æä»¬ç°å¨å¨ HTTPS ç¯å¢ä¸
// 设置 cookie secureï¼åªå¨ HTTPS ç¯å¢ä¸å¯è®¿é®ï¼
document.cookie = "user=John; secure";
samesite
è¿æ¯å¦å¤ä¸ä¸ªå ³äºå®å ¨çç¹æ§ã宿¨å¨é²æ¢ XSRFï¼è·¨ç½ç«è¯·æ±ä¼ªé ï¼æ»å»ã
为äºäºè§£å®æ¯å¦ä½å·¥ä½çï¼ä»¥å使¶æç¨ï¼è®©æä»¬çä¸ä¸ XSRF æ»å»ã
XSRF æ»å»
æ³è±¡ä¸ä¸ï¼ä½ ç»å½äº bank.com ç½ç«ãæ¤æ¶ï¼ä½ æäºæ¥èªè¯¥ç½ç«ç身份éªè¯ cookieãä½ çæµè§å¨ä¼å¨æ¯æ¬¡è¯·æ±æ¶å°å
¶åéå° bank.comï¼ä»¥ä¾¿è¯å«ä½ ï¼å¹¶æ§è¡ææææçè´¢å¡ä¸çæä½ã
ç°å¨ï¼å¨å¦å¤ä¸ä¸ªçªå£ä¸æµè§ç½é¡µæ¶ï¼ä½ ä¸å°å¿è®¿é®äºå¦ä¸ä¸ªç½ç« evil.comã该ç½ç«å
·æå bank.com ç½ç«æäº¤ä¸ä¸ªå
·æå¯å¨ä¸é»å®¢è´¦æ·äº¤æçåæ®µç表å <form action="https://bank.com/pay"> ç JavaScript 代ç ã
ä½ æ¯æ¬¡è®¿é® bank.com æ¶ï¼æµè§å¨é½ä¼åé cookieï¼å³ä½¿è¯¥è¡¨åæ¯ä» evil.com æäº¤è¿æ¥çãå æ¤ï¼é¶è¡ä¼è¯å«ä½ ç身份ï¼å¹¶æ§è¡çå®ç仿¬¾ã
è¿å°±æ¯æè°çâè·¨ç½ç«è¯·æ±ä¼ªé ï¼Cross-Site Request Forgeryï¼ç®ç§° XSRFï¼âæ»å»ã
å½ç¶ï¼å®é
çé¶è¡ä¼é²æ¢åºç°è¿ç§æ
åµãææç± bank.com çæç表åé½å
·æä¸ä¸ªç¹æ®çåæ®µï¼å³æè°ç âXSRF ä¿æ¤ tokenâï¼æ¶æé¡µé¢æ¢ä¸è½çæï¼ä¹ä¸è½ä»è¿ç¨é¡µé¢æåå®ãå®å¯ä»¥å¨é£éæäº¤è¡¨åï¼ä½æ¯æ æ³è·åæ°æ®ãå¹¶ä¸ï¼ç½ç« bank.com ä¼å¯¹æ¶å°çæ¯ä¸ªè¡¨åé½è¿è¡è¿ç§ token çæ£æ¥ã
使¯ï¼å®ç°è¿ç§é²æ¤éè¦è±è´¹æ¶é´ãæä»¬éè¦ç¡®ä¿æ¯ä¸ªè¡¨åé½å ·ææéç token åæ®µï¼å¹¶ä¸æä»¬è¿å¿ é¡»æ£æ¥ææè¯·æ±ã
è¾å ¥ cookie samesite é项
Cookie ç samesite é项æä¾äºå¦ä¸ç§é²æ¢æ¤ç±»æ»å»çæ¹å¼ï¼ï¼ç论ä¸ï¼ä¸éè¦è¦æ± âXSRF ä¿æ¤ tokenâã
å®æä¸¤ä¸ªå¯è½çå¼ï¼
samesite=strictï¼å没æå¼çsamesite䏿 ·)
å¦æç¨æ·æ¥èªåä¸ç½ç«ä¹å¤ï¼é£ä¹è®¾ç½®äº samesite=strict ç cookie æ°¸è¿ä¸ä¼è¢«åéã
æ¢å¥è¯è¯´ï¼æ è®ºç¨æ·æ¯éè¿é®ä»¶é¾æ¥è¿æ¯ä» evil.com æäº¤è¡¨åï¼æè
è¿è¡äºä»»ä½æ¥èªå
¶ä»åä¸çæä½ï¼cookie é½ä¸ä¼è¢«åéã
å¦æèº«ä»½éªè¯ cookie å
·æ samesite é项ï¼é£ä¹ XSRF æ»å»æ¯æ²¡ææºä¼æåçï¼å 为æ¥èª evil.com çæäº¤æ²¡æ cookieãå æ¤ï¼bank.com å°æ æ³è¯å«ç¨æ·ï¼ä¹å°±ä¸ä¼ç»§ç»è¿è¡ä»æ¬¾ã
è¿ç§ä¿æ¤æ¯ç¸å½å¯é çãåªææ¥èª bank.com çæä½æä¼åé samesite cookieï¼ä¾å¦æ¥èª bank.com çå¦ä¸é¡µé¢ç表åæäº¤ã
è½ç¶ï¼è¿æ ·æä¸äºä¸æ¹ä¾¿ã
å½ç¨æ·éè¿åæ³ç龿¥è®¿é® bank.com æ¶ï¼ä¾å¦ä»ä»ä»¬èªå·±çç¬è®°ï¼ä»ä»¬ä¼æå°æè®¶ï¼bank.com æ æ³è¯å«ä»ä»¬ç身份ãå®é
ä¸ï¼å¨è¿ç§æ
åµä¸ä¸ä¼åé samesite=strict cookieã
æä»¬å¯ä»¥éè¿ä½¿ç¨ä¸¤ä¸ª cookie æ¥è§£å³è¿ä¸ªé®é¢ï¼ä¸ä¸ª cookie ç¨äºâä¸è¬è¯å«âï¼ä»
ç¨äºè¯´ âHello, Johnâï¼å¦ä¸ä¸ªå¸¦æ samesite=strict ç cookie ç¨äºè¿è¡æ°æ®æ´æ¹çæä½ãè¿æ ·ï¼ä»ç½ç«å¤é¨æ¥çç¨æ·ä¼çå°æ¬¢è¿ä¿¡æ¯ï¼ä½æ¯æ¯ä»æä½å¿
é¡»æ¯ä»é¶è¡ç½ç«å¯å¨çï¼è¿æ ·ç¬¬äºä¸ª cookie æè½è¢«åéã
samesite=lax
ä¸ç§æ´è½»æ¾çæ¹æ³ï¼è¯¥æ¹æ³è¿å¯ä»¥é²æ¢ XSRF æ»å»ï¼å¹¶ä¸ä¸ä¼ç ´åç¨æ·ä½éªã
宽æ¾ï¼laxï¼æ¨¡å¼ï¼å strict 模å¼ç±»ä¼¼ï¼å½ä»å¤é¨æ¥å°ç½ç«ï¼åç¦æ¢æµè§å¨åé cookieï¼ä½æ¯å¢å äºä¸ä¸ªä¾å¤ã
妿以ä¸ä¸¤ä¸ªæ¡ä»¶åæç«ï¼åä¼åéå« samesite=lax ç cookieï¼
-
HTTP æ¹æ³æ¯âå®å ¨çâï¼ä¾å¦ GET æ¹æ³ï¼è䏿¯ POSTï¼ã
ææå®å ¨ç HTTP æ¹æ³è¯¦è§ RFC7231 è§èãåºæ¬ä¸ï¼è¿äºé½æ¯ç¨äºè¯»åè䏿¯åå ¥æ°æ®çæ¹æ³ãå®ä»¬ä¸å¾æ§è¡ä»»ä½æ´æ¹æ°æ®çæä½ãè·é龿¥å§ç»æ¯ GETï¼æ¯å®å ¨çæ¹æ³ã
-
该æä½æ§è¡é¡¶çº§å¯¼èªï¼æ´æ¹æµè§å¨å°åæ ä¸ç URLï¼ã
è¿éå¸¸æ¯æç«çï¼ä½æ¯å¦æå¯¼èªæ¯å¨ä¸ä¸ª
<iframe>䏿§è¡çï¼é£ä¹å®å°±ä¸æ¯é¡¶çº§çãæ¤å¤ï¼ç¨äºç½ç»è¯·æ±ç JavaScript æ¹æ³ä¸ä¼æ§è¡ä»»ä½å¯¼èªï¼å æ¤å®ä»¬ä¸éåã
æä»¥ï¼samesite=lax æåçæ¯åºæ¬ä¸å
许æå¸¸è§çâåå¾ URLâæä½æºå¸¦ cookieãä¾å¦ï¼ä»ç¬è®°ä¸æå¼ç½ç«é¾æ¥å°±æ»¡è¶³è¿äºæ¡ä»¶ã
使¯ï¼ä»»ä½æ´å¤æçäºå¿ï¼ä¾å¦æ¥èªå¦ä¸ä¸ªç½ç«çç½ç»è¯·æ±æè¡¨åæäº¤é½ä¼ä¸¢å¤± cookieã
妿è¿ç§æ
åµéåä½ ï¼é£ä¹æ·»å samesite=lax å°ä¸ä¼ç ´åç¨æ·ä½éªå¹¶ä¸å¯ä»¥å¢å ä¿æ¤ã
æ»ä½èè¨ï¼samesite æ¯ä¸ä¸ªå¾å¥½çé项ã
ä½å®æä¸ªç¼ºç¹ï¼
samesiteä¼è¢«å° 2017 å¹´å·¦å³çæ§çæ¬æµè§å¨å¿½ç¥ï¼ä¸å ¼å®¹ï¼ã
å æ¤ï¼å¦ææä»¬ä»
ä¾é samesite æä¾ä¿æ¤ï¼é£ä¹å¨æ§çæ¬çæµè§å¨ä¸å°å¾å®¹æåå°æ»å»ã
使¯ï¼æä»¬è¯å®å¯ä»¥å° samesite ä¸å
¶ä»ä¿æ¤æªæ½ä¸èµ·ä½¿ç¨ï¼ä¾å¦ XSRF tokenï¼è¿æ ·å¯ä»¥å¤å¢å ä¸å±ä¿æ¤ï¼å°æ¥ï¼å½æ§çæ¬çæµè§å¨æ·æ±°æ¶ï¼æä»¬å¯è½å°±å¯ä»¥å é¤ xsrf token è¿ç§æ¹å¼äºã
httpOnly
è¿ä¸ªé项å JavaScript 没æå ³ç³»ï¼ä½æ¯æä»¬å¿ 须为äºå®æ´æ§ä¹æä¸ä¸å®ã
Web æå¡å¨ä½¿ç¨ Set-Cookie header æ¥è®¾ç½® cookieãå¹¶ä¸ï¼å®å¯ä»¥è®¾ç½® httpOnly é项ã
è¿ä¸ªéé¡¹ç¦æ¢ä»»ä½ JavaScript è®¿é® cookieãæä»¬ä½¿ç¨ document.cookie çä¸å°æ¤ç±» cookieï¼ä¹æ æ³å¯¹æ¤ç±» cookie è¿è¡æä½ã
è¿æ¯ä¸ç§é¢é²æªæ½ï¼å½é»å®¢å°èªå·±ç JavaScript ä»£ç æ³¨å ¥ç½é¡µï¼å¹¶çå¾ ç¨æ·è®¿é®è¯¥é¡µé¢æ¶åèµ·æ»å»ï¼èè¿ä¸ªé项å¯ä»¥é²æ¢æ¤æ¶çè¿ç§æ»å»ãè¿åºè¯¥æ¯ä¸å¯è½åççï¼é»å®¢åºè¯¥æ æ³å°ä»ä»¬çä»£ç æ³¨å ¥æä»¬çç½ç«ï¼ä½æ¯ç½ç«æå¯è½åå¨ bugï¼ä½¿å¾é»å®¢è½å¤å®ç°è¿æ ·çæä½ã
é常æ¥è¯´ï¼å¦æåçäºè¿ç§æ
åµï¼å¹¶ä¸ç¨æ·è®¿é®äºå¸¦æé»å®¢ JavaScript 代ç ç页é¢ï¼é»å®¢ä»£ç å°æ§è¡å¹¶éè¿ document.cookie è·åå°å
å«ç¨æ·èº«ä»½éªè¯ä¿¡æ¯ç cookieãè¿å°±å¾ç³ç³äºã
使¯ï¼å¦æ cookie è®¾ç½®äº httpOnlyï¼é£ä¹ document.cookie åçä¸å° cookieï¼æä»¥å®åå°äºä¿æ¤ã
éå½: Cookie 彿°
è¿éæä¸ç»æå
³ cookie æä½ç彿°ï¼æ¯æå¨ä¿®æ¹ document.cookie æ¹ä¾¿å¾å¤ã
æå¾å¤è¿ç§ cookie åºï¼æä»¥è¿äºå½æ°åªç¨äºæ¼ç¤ºãè½ç¶å®ä»¬é½è½æ£å¸¸ä½¿ç¨ã
getCookie(name)
è·å cookie æç®ççæ¹å¼æ¯ä½¿ç¨ æ£å表达å¼ã
getCookie(name) 彿°è¿åå
·æç»å® name ç cookieï¼
// è¿åå
·æç»å® name ç cookieï¼
// å¦ææ²¡æ¾å°ï¼åè¿å undefined
function getCookie(name) {
let matches = document.cookie.match(new RegExp(
"(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
));
return matches ? decodeURIComponent(matches[1]) : undefined;
}
è¿éç new RegExp æ¯å¨æçæçï¼ä»¥å¹é
; name=<value>ã
请注æ cookie ç弿¯ç»è¿ç¼ç çï¼æä»¥ getCookie 使ç¨äºå
å»ºæ¹æ³ decodeURIComponent 彿°å¯¹å
¶è¿è¡è§£ç ã
setCookie(name, value, options)
å° cookie ç name 设置为å
·æé»è®¤å¼ path=/ï¼å¯ä»¥ä¿®æ¹ä»¥æ·»å å
¶ä»é»è®¤å¼ï¼åç»å®å¼ valueï¼
function setCookie(name, value, options = {}) {
options = {
path: '/',
// 妿éè¦ï¼å¯ä»¥å¨è¿éæ·»å å
¶ä»é»è®¤å¼
...options
};
if (options.expires instanceof Date) {
options.expires = options.expires.toUTCString();
}
let updatedCookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);
for (let optionKey in options) {
updatedCookie += "; " + optionKey;
let optionValue = options[optionKey];
if (optionValue !== true) {
updatedCookie += "=" + optionValue;
}
}
document.cookie = updatedCookie;
}
// 使ç¨èä¾ï¼
setCookie('user', 'John', {secure: true, 'max-age': 3600});
deleteCookie(name)
è¦å é¤ä¸ä¸ª cookieï¼æä»¬å¯ä»¥ç»å®è®¾ç½®ä¸ä¸ªè´çè¿ææ¶é´æ¥è°ç¨å®ï¼
function deleteCookie(name) {
setCookie(name, "", {
'max-age': -1
})
}
请注æï¼å½æä»¬æ´æ°æå é¤ä¸ä¸ª cookie æ¶ï¼æä»¬åºè¯¥ä½¿ç¨å设置 cookie æ¶ç¸åçè·¯å¾ååé项ã
ä»£ç æ¾å¨ï¼cookie.jsã
éå½ï¼ç¬¬ä¸æ¹ cookie
妿 cookie æ¯ç±ç¨æ·æè®¿é®ç页é¢çå以å¤çåæ¾ç½®çï¼åç§°å ¶ä¸ºç¬¬ä¸æ¹ cookieã
ä¾å¦ï¼
-
site.comç½ç«çä¸ä¸ªé¡µé¢å è½½äºå¦å¤ä¸ä¸ªç½ç«ç bannerï¼<img src="https://ads.com/banner.png">ã -
ä¸ banner ä¸èµ·ï¼
ads.comçè¿ç¨æå¡å¨å¯è½ä¼è®¾ç½®å¸¦æid=1234è¿æ ·ç cookie çSet-Cookieheaderãæ¤ç±» cookie æºèªads.comåï¼å¹¶ä¸ä» å¨ads.comä¸å¯è§ï¼ -
䏿¬¡è®¿é®
ads.comç½ç«æ¶ï¼è¿ç¨æå¡å¨è·å cookieidå¹¶è¯å«ç¨æ·ï¼ -
æ´ä¸ºéè¦çæ¯ï¼å½ç¨æ·ä»
site.comç½ç«è·³è½¬è³å¦ä¸ä¸ªä¹å¸¦æ banner çç½ç«other.comæ¶ï¼ads.comä¼è·å¾è¯¥ cookieï¼å 为å®å±äºads.comï¼ä»èè¯å«ç¨æ·å¹¶å¨ä»å¨ç½ç«ä¹é´åæ¢æ¶å¯¹å ¶è¿è¡è·è¸ªï¼
ç±äºå®çæ§è´¨ï¼ç¬¬ä¸æ¹ cookie é常ç¨äºè·è¸ªå广åæå¡ãå®ä»¬è¢«ç»å®å¨åå§åä¸ï¼å æ¤ ads.com å¯ä»¥å¨ä¸åç½ç«ä¹é´è·è¸ªåä¸ç¨æ·ï¼å¦æè¿äºç½ç«é½å¯ä»¥è®¿é® ads.com çè¯ã
å½ç¶ï¼æäºäººä¸å欢被è·è¸ªï¼å æ¤æµè§å¨å è®¸ç¦æ¢æ¤ç±» cookieã
æ¤å¤ï¼ä¸äºç°ä»£æµè§å¨å¯¹æ¤ç±» cookie éåç¹æ®çç¥ï¼
- Safari æµè§å¨å®å ¨ä¸å è®¸ç¬¬ä¸æ¹ cookieã
- Firefox æµè§å¨é带äºä¸ä¸ªç¬¬ä¸æ¹åçé»ååï¼å®é»æ¢äºæ¥èªååå çåçç¬¬ä¸æ¹ cookieã
妿æä»¬å è½½äºä¸ä¸ªæ¥èªç¬¬ä¸æ¹åçèæ¬ï¼ä¾å¦ <script src="https://google-analytics.com/analytics.js">ï¼å¹¶ä¸è¯¥èæ¬ä½¿ç¨ document.cookie è®¾ç½®äº cookieï¼é£ä¹æ¤ç±» cookie 就䏿¯ç¬¬ä¸æ¹çã
妿ä¸ä¸ªèæ¬è®¾ç½®äºä¸ä¸ª cookieï¼é£ä¹æ è®ºèæ¬æ¥èªä½å¤ ââ è¿ä¸ª cookie é½å±äºå½åç½é¡µçåã
éå½: GDPR
æ¬ä¸»é¢å JavaScript æ å ³ï¼åªæ¯è®¾ç½® cookie æ¶çä¸äºæ³¨æäºé¡¹ã
欧洲æä¸é¡¹å为 GDPR çç«æ³ï¼è¯¥æ³è§é对ç½ç«å°éç¨æ·å®æ½äºä¸ç³»åè§åãå ¶ä¸ä¹ä¸å°±æ¯éè¦æç¡®çè®¸å¯æå¯ä»¥è·è¸ªç¨æ·ç cookieã
请注æï¼è¿ä» ä¸è·è¸ª/è¯å«/ææ cookie æå ³ã
æä»¥ï¼å¦ææä»¬è®¾ç½®ä¸ä¸ªåªä¿åäºä¸äºä¿¡æ¯ç cookieï¼ä½æ¯æ¢ä¸è·è¸ªä¹ä¸è¯å«ç¨æ·ï¼é£ä¹æä»¬å¯ä»¥èªç±å°è®¾ç½®å®ã
使¯ï¼å¦ææä»¬è¦è®¾ç½®å¸¦æèº«ä»½éªè¯ä¼è¯ï¼sessionï¼æè·è¸ª id ç cookieï¼é£ä¹å¿ é¡»å¾å°ç¨æ·çå 许ã
ç½ç«ä¸ºäºéµå¾ª GDPR é常æä¸¤ç§åæ³ãä½ ä¸å®å·²ç»å¨ç½ç«ä¸çå°è¿å®ä»¬äºï¼
-
妿ä¸ä¸ªç½ç«æ³è¦ä» 为已ç»ç»è¿èº«ä»½éªè¯çç¨æ·è®¾ç½®è·è¸ªç cookieã
为æ¤ï¼æ³¨å表åä¸å¿ é¡»è¦æä¸ä¸ªå¤éæ¡ï¼ä¾å¦âæ¥åéç§æ¿çâï¼æè¿°æä¹ä½¿ç¨ cookieï¼ï¼ç¨æ·å¿ é¡»å¾éå®ï¼ç¶åç½ç«å°±å¯ä»¥èªç±è®¾ç½®èº«ä»½éªè¯ cookie äºã
-
妿ä¸ä¸ªç½ç«æ³è¦ä¸ºææäººè®¾ç½®è·è¸ªç cookieã
为äºåæ³å°è¿æ ·åï¼ç½ç«ä¸ºæ¯ä¸ªæ°ç¨æ·æ¾ç¤ºä¸ä¸ªâåå§å±å¹âå¼¹çªï¼å¹¶è¦æ±ä»ä»¬åæè®¾ç½® cookieãä¹åç½ç«å°±å¯ä»¥è®¾ç½® cookieï¼å¹¶å¯ä»¥è®©ç¨æ·çå°ç½ç«å 容äºãä¸è¿ï¼è¿å¯è½ä¼ä½¿æ°ç¨æ·æå°åæã没æäººå欢çå°âå¿ é¡»ç¹å»âçåå§å±å¹å¼¹çªè䏿¯ç½ç«å 容ã使¯ GDPR è¦æ±å¿ é¡»å¾å°ç¨æ·æç¡®å°å许ã
GDPR ä¸ä» æ¶å cookieï¼è¿æ¶åå ¶ä»ä¸éç§ç¸å ³çé®é¢ï¼ä½è¿è¶ åºäºæä»¬ç讨论èå´ã
æ»ç»
document.cookie æä¾äºå¯¹ cookie ç访é®
- åå ¥æä½åªä¼ä¿®æ¹å ¶ä¸æå°ç cookieã
- name/value å¿ é¡»è¢«ç¼ç ã
- ä¸ä¸ª cookie æå¤§ä¸è½è¶ è¿ 4KBãæ¯ä¸ªå䏿å¤å 许æ 20+ 个左å³ç cookieï¼å ·ä½åå³äºæµè§å¨ï¼ã
Cookie é项ï¼
path=/ï¼é»è®¤ä¸ºå½åè·¯å¾ï¼ä½¿ cookie ä» å¨è¯¥è·¯å¾ä¸å¯è§ãdomain=site.comï¼é»è®¤ cookie ä» å¨å½ååä¸å¯è§ã妿æ¾å¼å°è®¾ç½®äºåï¼å¯ä»¥ä½¿ cookie å¨ååä¸ä¹å¯è§ãexpiresæmax-age设å®äº cookie è¿ææ¶é´ãå¦ææ²¡æè®¾ç½®ï¼å彿µè§å¨å ³éæ¶ cookie å°±ä¼å¤±æãsecure使 cookie ä» å¨ HTTPS 䏿æãsamesiteï¼å¦æè¯·æ±æ¥èªå¤é¨ç½ç«ï¼ç¦æ¢æµè§å¨åé cookieãè¿æå©äºé²æ¢ XSRF æ»å»ã
å¦å¤ï¼
- æµè§å¨å¯è½ä¼ç¦ç¨ç¬¬ä¸æ¹ cookieï¼ä¾å¦ Safari æµè§å¨é»è®¤ç¦æ¢ææç¬¬ä¸æ¹ cookieã
- å¨ä¸ºæ¬§çå ¬æ°è®¾ç½®è·è¸ª cookie æ¶ï¼GDPR è¦æ±å¿ é¡»å¾å°ç¨æ·æç¡®è®¸å¯ã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼