跨域:浏览器到底拦住了什么
è·¨åï¼æµè§å¨å°åºæ¦ä½äºä»ä¹
Lihuaå¥ 2026-08-08 0 é 读4åéè·¨åçæ ¹æ¬é®é¢
å å设ä¸ä¸ªå±é©çæ åµï¼ç½ç« A å¯ä»¥éæè¯»åç½ç« B çååºã
ç¨æ·å·²ç»ç»å½é¶è¡ï¼æµè§å¨å¯è½å¸¦çé¶è¡ç Cookieãæ¤æ¶ï¼æ¶æç½é¡µåªéè¦è°ç¨é¶è¡çä½é¢ãè½¬è´¦è®°å½æ¥å£ï¼åæååºåç»æ»å»è ï¼ç¨æ·çæææ°æ®å°±æ³é²äºã
æä»¥ï¼æµè§å¨ç**åæºçç¥ï¼Same-Origin Policyï¼**åå¨çæ ¸å¿ç®çï¼æ¯é»æè¿ç§è·¨ç½ç«è¯»åæææ°æ®çè¡ä¸ºã
è CORSï¼Cross-Origin Resource Sharingï¼ï¼åæ¯æå¡å¨åæµè§å¨å£°æçãåè§å约æçä¾å¤æºå¶ï¼æå¡å¨å¯ä»¥æç¡®åè¯æµè§å¨ï¼åªäºå ¶ä»æ¥æºçç½é¡µå¯ä»¥è¯»åèªå·±çååºã
ä»ä¹å«âåæºâï¼
ä¸ä¸ªæºç±ä¸é¨åå ±åç»æï¼
Origin = åè®® + ä¸»æº + 端å£
è¿ä¸è åªè¦æä¸ä¸ªä¸åï¼å°±æ¯ä¸åæºï¼
http://localhost:5173
-> http://localhost:3000 ä¸å端å£ï¼è·¨æº
http://localhost:3000
-> https://localhost:3000 ä¸ååè®®ï¼è·¨æº
http://localhost:3000
-> http://127.0.0.1:3000 ä¸å主æºï¼è·¨æº
è·¨åä¸çäºè¯·æ±ç»å¯¹åä¸åºå»
æµè§å¨éè¦å 许å¾å¤è·¨æºèµæºå è½½ï¼å¦åç½é¡µæ ¹æ¬æ æ³ä½¿ç¨å¾çãæ ·å¼è¡¨æè·³è½¬é¾æ¥ã
çæ£åä¿æ¤çéç¹æ¯ï¼
æä»¥ï¼çå° CORS æ¥éæ¶ï¼æ´åç¡®ççè§£æ¯ï¼
æµè§å¨ä¸å 许å½åç½é¡µç JavaScript 读åè¿æ¬¡è·¨æºååºã
è¿å¥è¯å¾éè¦ãCORS ä¸çäºè¯·æ±ä¸å®æ²¡æå°è¾¾æå¡å¨ã 对äºä¸äºè¯·æ±ï¼æµè§å¨å¯è½ä¼åé请æ±ï¼ä½æååºæ¦å¨ç½é¡µ JavaScript ä¹å¤ã
è¿ä¹æ¯ä¸ºä»ä¹ CORS ä¸è½å½ä½å端ç认è¯ãæææ CSRF 鲿¤ãæå¡ç«¯ä»ç¶å¿ é¡»èªå·±éªè¯ç¨æ·èº«ä»½ãæéåè¯·æ±æ¯å¦åæ³ã
CORS å¦ä½è¡¨è¾¾âåæâï¼
å½ç½é¡µ A è¯·æ±æå¡å¨ B æ¶ï¼æµè§å¨ä¼å¸¦ä¸è¯·æ±æ¥æºä¿¡æ¯ï¼
Origin: https://a.example
妿æå¡å¨ B å
许 https://a.example çç½é¡µè¯»åååºï¼åºå¨ååºä¸è¿åï¼
Access-Control-Allow-Origin: https://a.example
Access-Control-Allow-Origin çå«ä¹æ¯ï¼
å 许æ¥èª
https://a.exampleçç½é¡µè¯»åè¿æ¬¡ååºã
å ¶å æé¾å¦ä¸ï¼
æä»¥ï¼æµè§å¨ä¸æ¯å¨ä¿¡ä»»ç½é¡µ Aï¼èæ¯å¨æ§è¡æå¡å¨ B 对ç½é¡µ A ååºçææå£°æã
ä½è¿éçâææâåªé对æµè§å¨è½å¦æååºäº¤ç»ç½é¡µ JavaScriptï¼ä¸æ¿ä»£ä¸å¡å±é¢çç»å½è®¤è¯åæé夿ã
颿£è¯·æ±
并䏿¯ææè·¨æºè¯·æ±é½éè¦æå¡å¨å å 许ã
åæäºæ»¡è¶³ CORSâç®å请æ±âæ¡ä»¶ç请æ±ï¼æµè§å¨ä¼ç´æ¥åéï¼èæäºè¯·æ±ä¸æ»¡è¶³è¿äºæ¡ä»¶ï¼æµè§å¨ä¼å
åéä¸ä¸ª OPTIONS 请æ±è¯¢é®ç®æ æå¡å¨ãè¿ä¸ªâå
é®âçè¡ä¸ºï¼å°±å«é¢æ£è¯·æ±ï¼Preflight Requestï¼ã
è¿é䏿¯æµè§å¨å¤æâè¿ä¸ªä¸å¡é£é©é«ä¸é«âï¼èæ¯æµè§å¨æ ¹æ®æ¹æ³ã请æ±å¤´å Content-Type æ¯å¦å±äº CORS safelist æ¥å³å®æ¯å¦é¢æ£ã
颿£é常ä¼è¯¢é®ä¸ä»¶äºï¼
Origin: https://a.example
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: authorization, content-type
æå¡å¨å¿ é¡»åå«ååºï¼
- æ¯å¦å 许è¿ä¸ªæ¥æºã
- æ¯å¦å 许è¿ä¸ª HTTP æ¹æ³ã
- æ¯å¦å 许è¿äºé¢å¤è¯·æ±å¤´ã
ä¾å¦ï¼
Access-Control-Allow-Origin: https://a.example
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Authorization, Content-Type
å PUTãDELETEãAuthorization 请æ±å¤´ãapplication/json çæ
åµï¼é常ä¼è§¦å颿£ã
颿£çç®çå¨äºï¼
è®©ç®æ æå¡å¨å 声æï¼æµè§å¨æ¯å¦å¯ä»¥ä»è¿ä¸ªæºï¼ä»¥è¿ä¸ªæ¹æ³ã带çè¿äºè¯·æ±å¤´ï¼åèµ·å®é è·¨æºè¯·æ±å¹¶è¯»åååºã
å³ä½¿é¢æ£éè¿ï¼æå¡å¨å¨çæ£æ¶å°å®é 请æ±åï¼ä»ç¶å¿ é¡»å®æè®¤è¯ãææåä¸å¡æ ¡éªã
ä¸ä¸ªå®æ´çè·¨å请æ±
1. 颿£è¯·æ±
æµè§å¨å
åé OPTIONSã妿æå¡å¨è¿åç CORS ååºå¤´æ»¡è¶³è¦æ±ï¼æµè§å¨æç»§ç»åéå®é
请æ±ã
2. å®é 请æ±
å®é ååºä¹éè¦å å«ç¸åºç CORS ååºå¤´ï¼æµè§å¨æä¼æååºå 容交ç»ç½é¡µ JavaScriptã
è·¨åè¯·æ±æ³æºå¸¦ Cookieï¼è¿éè¦ä»ä¹ï¼
è·¨æºè¯·æ±æ¯å¦æºå¸¦ Cookieï¼ä¸æ¯åªé
ç½® Access-Control-Allow-Origin å°±å¤äºã
å端éè¦æ¾å¼å£°æï¼
fetch('https://api.example.com/orders', {
credentials: 'include'
})
æå¡ç«¯åéè¦è¿åï¼
Access-Control-Allow-Origin: https://a.example
Access-Control-Allow-Credentials: true
å½ä»¤è¡æå端æå¡ä¸å CORS å½±å
妿æ»å»è 䏿¯ä»æµè§å¨è°ç¨ï¼èæ¯ä½¿ç¨å½ä»¤è¡ç¨åºæå端æå¡ï¼åä¸ä¼éå° CORS æ¥éã
å 为 CORS ä»ä¸å¼å§å°±æ¯æµè§å¨çåæºçç¥æºå¶ãcurlãå端æå¡ä¸åæµè§å¨è§å约æï¼å®ä»¬è½å¦è®¿é®æ¥å£ï¼ä»åºè¯¥ç±æå¡ç«¯ç身份认è¯ãæéææåç½ç»å®å
¨çç¥å³å®ã
æ»ç»
åæºçç¥é»è®¤ä¸è®©ç½é¡µ JavaScript 读åè·¨æºååºï¼CORS æ¯æå¡å¨æäºç¹å®æ¥æºè¯»åæéç声æï¼å®ä¸æ¯æå¡ç«¯å®å ¨è¾¹çï¼æ´ä¸è½æ¿ä»£è®¤è¯ãææå CSRF 鲿¤ã
Aitishiku.com