ããä»»æã® web ãµã¤ããã fetch ãè¡ã£ãå ´åããã®ãªã¯ã¨ã¹ãã¯æãã失æããã§ãããã
ããã§ä¸å¿ã¨ãªãæ¦å¿µã¯ ãªãªã¸ã³ â ãã¡ã¤ã³/ãã¼ã/ãããã³ã«ã®ï¼ã¤æãã§ãã
ã¯ãã¹ãªãªã¸ã³ãªã¯ã¨ã¹ã(ãããã¯å¥ã®ãã¡ã¤ã³(ãµããã¡ã¤ã³ã)ããããã³ã«ããããã¯ãã¼ãã«éä¿¡ããããã®)ã«ã¯ããªã¢ã¼ãå´ããã®ç¹å¥ãªããããå¿ è¦ã§ãããã®ããªã·ã¼ã¯ âCORSâ (Cross-Origin Resource Sharing) ã¨å¼ã°ãã¦ãã¾ãã
ä¾ãã°ãhttp://example.com ã¸ã®ãã§ããããã¦ã¿ã¾ãããã:
try {
await fetch('http://example.com');
} catch(err) {
alert(err); // Failed to fetch
}
äºæ³éããfetch ã¯å¤±æãã¾ãã
ãªã?
ãªããªããã¯ãã¹ãªãªã¸ã³å¶ç´ãæªæã®ããããã«ã¼ããã¤ã³ã¿ã¼ããããä¿è·ããããã§ãã
è±ç·ãã¾ãããç°¡åã«æ´å²çãªèæ¯ãæ¯ãè¿ãã¾ãããã
é·ãéãJavaScript ã¯ãããã¯ã¼ã¯ãªã¯ã¨ã¹ããå®è¡ããããã®ç¹å¥ãªã¡ã½ãããæã£ã¦ãã¾ããã§ããã
ãããµã¤ãã®ã¹ã¯ãªãããå¥ã®ãµã¤ãã®ã³ã³ãã³ãã¸ã¢ã¯ã»ã¹ãããã¨ã¯ã§ãã¾ããã§ããã
ãã®ã·ã³ãã«ã ãã©å¼·åãªã«ã¼ã«ã¯ã¤ã³ã¿ã¼ãããã»ãã¥ãªãã£ã®åºç¤ã§ãããä¾ãã°ããã¼ã¸ hacker.com ã®ã¹ã¯ãªãã㯠gmail.com ã«ããã¦ã¼ã¶ã®ã¡ã¼ã«ããã¯ã«ã¯ã¢ã¯ã»ã¹ã§ãã¾ããã§ãããã¦ã¼ã¶ã¯ãããå®å
¨ã¨æãã¾ããã
ããããweb éçºè ã¯ããå¼·åãªåãæ±ãã¾ãããããã¦ãããåé¿ããããã®æ§ã ãªããªãã¯ãèæ¡ããã¾ããã
å¥ã®ãµã¼ãã¨ããåãããæ¹æ³ã®ï¼ã¤ã¯ãããã« <form> ãéä¿¡ãããã¨ã§ãããæ¬¡ã®ããã«ãç¾å¨ã®ãã¼ã¸ã«çã¾ãããã« <iframe> ã«éä¿¡ãã¾ããã:
<!-- form target -->
<iframe name="iframe"></iframe>
<!-- JavaScript ã«ãã form ã¯åçã«çæããããµããããããã¾ãã -->
<form target="iframe" method="POST" action="http://another.com/â¦">
...
</form>
- ããã«ããããããã¯ã¼ãã³ã°ã®ã¡ã½ããããªãã¦ããå¥ã®ãµã¤ã㸠GET/POST ãªã¯ã¨ã¹ããéããã¨ã¯å¯è½ã§ããã
- ããããå¥ã®ãµã¤ããã
<iframe>ã®ã³ã³ãã³ãã«ã¢ã¯ã»ã¹ãããã¨ã¯ç¦æ¢ããã¦ããã®ã§ãã¬ã¹ãã³ã¹ãèªããã¨ã¯ã§ãã¾ããã§ããã
ãããã£ã¦ã<form> ã¯ã©ãã«ã§ããã¼ã¿ããµãããããããã¨ãå¯è½ã«ãã¾ããããã¬ã¹ãã³ã¹ã®ã³ã³ãã³ãã«ã¯ã¢ã¯ã»ã¹ã§ãã¾ããã§ããã
å¥ã®æ¹æ³ã¯ <script src="http://another.com/â¦"> ã¿ã°ã使ç¨ãããã¨ã§ãããã¹ã¯ãªããã¯ä»»æã®ãã¡ã¤ã³ã® src ãæã¤ãã¨ãã§ãã¾ããããããæ¹ã㦠â ãã®ãããªã¹ã¯ãªããã®çã®ã³ã³ãã³ãã«ã¢ã¯ã»ã¹ãããã¨ã¯ä¸å¯è½ã§ããã
ãã another.com ããã®ãããªç¨®é¡ã®ã¢ã¯ã»ã¹ã«å¯¾ãã¦ãã¼ã¿ãå
¬éããã¤ããã ã£ãå ´åããããã âJSONP (JSPN with padding)â ãããã³ã«ã使ããã¾ããã
ããã¯ãã®ããã¼ã§ã:
- ã¾ããäºåã« e.g.
gotWeatherã®ãããªããã¼ã¿ãåãåãããã®ã°ãã¼ãã«é¢æ°ã宣è¨ãã¾ãã - 次ã«
<script>ãä½ãããã®ååãcallbackã¯ã¨ãªã¼ãã©ã¡ã¼ã¿ã¨ãã¦æ¸¡ãã¾ããe.g.src="http://another.com/weather.json?callback=gotWeather". - ãªã¢ã¼ããµã¼ãã¯ããã¼ã¿ã
gotWeather(...)å¼ã³åºãã«ã©ãããããããªã¬ã¹ãã³ã¹ãåçã«çæãã¾ãã - ã¹ã¯ãªãããå®è¡ãããã¨ã
gotWeatherãå®è¡ãããã¼ã¿ãå¾ããã¾ãã
ãã㯠JSONP ã§ãã¼ã¿ãåãåãã³ã¼ãã®ä¾ã§ã:
// 1. ãã¼ã¿ãå¦çãã颿°ã宣è¨ãã¾ã
function gotWeather({ temperature, humidity }) {
alert(`temperature: ${temperature}, humidity: ${humidity}`);
}
// 2. ã¹ã¯ãªããã«å¯¾ãã¦ã?callback ãã©ã¡ã¼ã¿ã¨ãã¦ãã®ååãæ¸¡ãã¾ã
let script = document.createElement('script');
script.src = `https://cors.javascript.info/article/fetch-crossorigin/demo/script?callback=gotWeather`;
document.body.append(script);
// 3. ãµã¼ãããæå¾
ããå¿çã¯æ¬¡ã®ããã«ãªãã¾ã:
/*
gotWeather({
temperature: 25,
humidity: 78
});
*/
ããã¯åä½ããã»ãã¥ãªãã£ã«ãéåãã¾ããããªããªããåæ¹ããã®æ¹æ³ã§ãã¼ã¿ã渡ããã¨ã«åæãã¦ããããã§ããåæ¹ãåæããã¨ãã¯ããã¯ã§ã¯ããã¾ãããããã¯é常ã«å¤ããã©ã¦ã¶ã§ãåä½ããããããã®ãããªã¢ã¯ã»ã¹ãæä¾ãããµã¼ãã¹ã¯ã¾ã åå¨ãã¾ãã
ãã°ããããã¨ãç¾å¨ã®ãããã¯ã¼ã¯ã¡ã½ãããç»å ´ãã¾ãããå½åã¯ã¯ãã¹ãªãªã¸ã³ãªã¯ã¨ã¹ãã¯ç¦æ¢ããã¦ãã¾ãããããããé·ãè°è«ã®çµæããµã¼ãã«ãã£ã¦æç¤ºçã«è¨±å¯ããã¦ããå ´åã«éããã¯ãã¹ãªãªã¸ã³ãªã¯ã¨ã¹ãã¯è¨±å¯ããã¾ããã
åç´ãªã¯ã¨ã¹ã(Simple requests)
Simple requests ã¯æ¬¡ã®æ¡ä»¶ãæºããå¿ è¦ãããã¾ãã:
- Simple method: GET, POST ã¾ã㯠HEAD
- Simple headers â 許å¯ããã¦ãããã®ã ã(以ä¸):
Accept,Accept-Language,Content-Language,- å¤ã
application/x-www-form-urlencoded,multipart/form-dataãããã¯text/plainã®Content-Type.
ãã®ä»ã®ãªã¯ã¨ã¹ã㯠âåç´ã§ã¯ãªã(non-simple)â ã¨ã¿ãªããã¾ããä¾ãã°ãPUT ã¡ã½ãããã API-Key HTTP ããããæã¤ãªã¯ã¨ã¹ãã¯ããã«éãã¾ããã
æ¬è³ªçãªéãã¯ãâåç´ãªã¯ã¨ã¹ãâ ã¯ãç¹å¥ãªæ¹æ³ã使ããã¨ãªã <form> ã¾ã㯠<script> ã使ã£ã¦ä½æãããã¨ãã§ãããã¨ã§ãã
ãã®ããããã¨ãé常ã«å¤ããµã¼ãã§ããåç´ãªã¯ã¨ã¹ããåãå ¥ããæºåãã§ãã¦ããã¯ãã§ãã
éã«ã鿍æºã®ãããããããã¯ä¾ãã° DELETE ã¡ã½ããã®ãªã¯ã¨ã¹ãã¯ãã®æ¹æ³ã§ã¯ä½ããã¨ã¯ã§ãã¾ãããé·ãéãJavaScript ã¯ãã®ãããªãªã¯ã¨ã¹ããè¡ããã¨ãã§ãã¾ããã§ããããªã®ã§ãå¤ããµã¼ãã¯ããã®ãããªãªã¯ã¨ã¹ãã¯ç¹æ¨©ã®ããéä¿¡å
ããæ¥ããã®ã§ããã¨æ³å®ããå ´åãããã¾ã(web ãã¼ã¸ã§ã¯ãã®ãããªãªã¯ã¨ã¹ãã¯éä¿¡ã§ããªããã)ã
åç´ã§ãªããªã¯ã¨ã¹ãããããã¨ããã¨ããã©ã¦ã¶ã¯ç¹å¥ãª âpreflightâ ãªã¯ã¨ã¹ããéä¿¡ãã¾ããããã¯ããµã¼ãã«ãã®ãããªã¯ãã¹ãªãªã¸ã³ãªã¯ã¨ã¹ããåãå ¥ãããã¨ã«åæãããå¦ããå°ãããã®ã§ãã
ããã¦ããµã¼ãããããã§æç¤ºçã«ããã確èªããªãéããåç´ã§ãªããªã¯ã¨ã¹ãã¯éä¿¡ããã¾ããã
ããã§ã¯è©³ç´°ã«é²ã¿ã¾ãããããããã¯ãã¹ã¦1ã¤ã®ç®çã®ããã«ããã¾ããããã¯ãæ°ããã¯ãã¹ãªãªã¸ã³ã®æ©è½ããµã¼ãããã®æç¤ºçãªè¨±å¯ãããå ´åã«ã®ã¿ã¢ã¯ã»ã¹å¯è½ã§ãããã¨ãä¿è¨¼ããããã§ãã
åç´ãªã¯ã¨ã¹ãã«å¯¾ãã CORS
ãªã¯ã¨ã¹ããã¯ãã¹ãªãªã¸ã³ã§ããå ´åããã©ã¦ã¶ã¯å¸¸ã« Origin ãããã追å ãã¾ãã
ä¾ãã°ãhttps://javascript.info/page ãã https://anywhere.com/request ã«ãªã¯ã¨ã¹ããè¡ãå ´åããããã¯æ¬¡ã®ããã«ãªãã§ããã:
GET /request
Host: anywhere.com
Origin: https://javascript.info
...
ã覧ã®éããOrigin ã¯ãã¹ãªãã®æ£ç¢ºãªãªãªã¸ã³(ãã¡ã¤ã³/ãããã³ã«/ãã¼ã)ãå«ã¿ã¾ãã
ãµã¼ã㯠Origin ãæ¤æ»ãããã¨ãã§ãããã®ãããªãªã¯ã¨ã¹ããåãå
¥ãããã¨ã«åæããã¨ãã¬ã¹ãã³ã¹ã« Access-Control-Allow-Origin ã¨ããç¹å¥ãªãããã追å ãã¾ãããã®ãããã¯è¨±å¯ããããªãªã¸ã³(ãã®ã±ã¼ã¹ã§ã¯ https://javascript.info)ããããã¯ã¢ã¹ã¿ãªã¹ã¯ * ãå«ãå¿
è¦ãããã¾ããããã¦å¿çã¯æåãã¾ããããã§ãªããã°ã¨ã©ã¼ã«ãªãã¾ãã
ãã©ã¦ã¶ã¯ããã§ã¯ä¿¡é ¼ããã仲ä»è ã®å½¹å²ãæããã¾ãã:
- æ£ãã
Originãã¯ãã¹ãã¡ã¤ã³ãªã¯ã¨ã¹ãã¨ä¸ç·ã«éä¿¡ããããã¨ãä¿è¨¼ãã¾ãã - ã¬ã¹ãã³ã¹ã®ä¸ã§æ£ãã
Access-Control-Allow-Originã確èªããã¨ã次㯠JavaScript ã¢ã¯ã»ã¹ãããã§ãªããã°ã¨ã©ã¼ã¨å ±ã«ç¦æ¢ãã¾ãã
ãã㯠âåãå ¥ãã«åæããâ å¿çã®ä¾ã§ã:
200 OK
Content-Type:text/html; charset=UTF-8
Access-Control-Allow-Origin: https://javascript.info
ã¬ã¹ãã³ã¹ããã
ã¯ãã¹ãªãªã¸ã³ãªã¯ã¨ã¹ãã®å ´åãããã©ã«ãã§ã¯ JavaScript 㯠âåç´ã¬ã¹ãã³ã¹ãããâ ã«ããã¢ã¯ã»ã¹ã§ãã¾ããã:
Cache-ControlContent-LanguageContent-TypeExpiresLast-ModifiedPragma
ä»ã®ã¬ã¹ãã³ã¹ãããã¯ç¦æ¢ããã¦ãã¾ãã
Content-Length ã¯ããã¾ããæ³¨æ: ä¸ã®ãªã¹ãã« Content-Length ãããã¯ããã¾ãã!
ãã®ãããä½ãããã¦ã³ãã¼ããã¦ãã¦é²æå ·åã追跡ãããå ´åã¯ããããã«ã¢ã¯ã»ã¹ããããã«è¿½å ã®è¨±å¯ãå¿ è¦ã«ãªãã¾ã(ä¸è¨åç §)ã
JavaScript ãä»ã®ã¬ã¹ãã³ã¹ãããã¸ã¢ã¯ã»ã¹ããã®ã許å¯ããã«ã¯ããµã¼ã㯠Access-Control-Expose-Headers ãããã«ãã¢ã¯ã»ã¹ã許å¯ãããããããªã¹ãããå¿
è¦ãããã¾ãã
ä¾:
200 OK
Content-Type:text/html; charset=UTF-8
Content-Length: 12345
API-Key: 2c9de507f2c54aa1
Access-Control-Allow-Origin: https://javascript.info
Access-Control-Expose-Headers: Content-Length,API-Key
ãã®ãã㪠Access-Control-Expose-Headers ãããã使ããã¨ã§ãã¹ã¯ãªããã Content-Length 㨠API-Key ãããã«ã¢ã¯ã»ã¹ãããã¨ã許å¯ãã¾ãã
âåç´ã§ã¯ãªãâ ãªã¯ã¨ã¹ã
ç§ãã¡ã¯åãªã GET/POST ã ãã§ãªããPATCH ã DELETE ãªã©ã® HTTP ã¡ã½ããã使ããã¨ãã§ãã¾ãã
以å㯠web ãã¼ã¸ããã®ãããªãªã¯ã¨ã¹ããè¡ããã¨ãã§ããã¨ã¯ãèª°ãæ³å®ãã¦ãã¾ããã§ããããã®ãããæ¨æºã§ã¯ãªãã¡ã½ããã âãã©ã¦ã¶ã§ã¯ãªãâ ã¨ããåå³ã¨ãã¦æ±ã web ãµã¼ãã¹ãåå¨ããå¯è½æ§ãããã¾ããThey can take it into account when checking access rights.
ãã®ãããè§£ééããé¿ããããã«ãæã¯æ±ããªãã£ã âåç´ã§ã¯ãªãâ ãªã¯ã¨ã¹ãã«ã¤ãã¦ã¯ããã©ã¦ã¶ã¯ããã«ã¯ãã®ãããªãªã¯ã¨ã¹ããè¡ãã¾ããããã®åã«ã許å¯ãæ±ããããã®æºåçãªããããã âpreflightâ ãªã¯ã¨ã¹ããéä¿¡ãã¾ãã
preflight ãªã¯ã¨ã¹ã㯠OPTIONS ã¡ã½ããã使ããæ¬æã¯ããã¾ããã
Access-Control-Request-Methodãããã¯è¦æ±ãããã¡ã½ãããæã¡ã¾ããAccess-Control-Request-Headersãããã¯åç´ã§ãªã HTTP ãããã®ã«ã³ãåºåãã®ãªã¹ããæä¾ãã¾ãã
ãµã¼ãããªã¯ã¨ã¹ããå¦çããã®ã«åæããå ´åãã¹ãã¼ã¿ã¹ 200 ã§æ¬æãªãã®å¿çãè¿ãã¾ãã
- ã¬ã¹ãã³ã¹ããã
Access-Control-Allow-Methodsã¯è¨±å¯ãããã¡ã½ãããæããªããã°ãªãã¾ããã - ã¬ã¹ãã³ã¹ããã
Access-Control-Allow-Headersã¯è¨±å¯ããããããã®ãªã¹ããæããªããã°ãªãã¾ããã - å ãã¦ãããã
Access-Control-Max-Ageã§ãã¼ããã·ã§ã³ãã£ãã·ã¥ããç§æ°ãæå®ããå ´åãããã¾ãããã®å ´åããã©ã¦ã¶ã¯ä¸ããããã¼ããã·ã§ã³ãæºããå¾ç¶ã®ãªã¯ã¨ã¹ãã«å¯¾ã㦠preflight ãéä¿¡ããå¿ è¦ã¯ããã¾ããã
ã¯ãã¹ãã¡ã¤ã³ã® PATCH ãªã¯ã¨ã¹ãã®ä¾ã§ã¹ãããæ¯ã«ã©ã®ããã«åä½ããã®ãè¦ã¦ããã¾ããã(ãã®ã¡ã½ããã¯ãã¼ã¿ãæ´æ°ããã®ã«ãã使ããã¾ã)ã:
let response = await fetch('https://site.com/service.json', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json'
'API-Key': 'secret'
}
});
ãªã¯ã¨ã¹ããåç´ã§ãªãçç±ã3ã¤ããã¾ã:
- ã¡ã½ããã
PATCH Content-Typeã¯æ¬¡ã®ãããã§ããªã:application/x-www-form-urlencoded,multipart/form-data,text/plain.- ã«ã¹ã¿ã ã®
API-Keyããã.
Step 1 (preflight ãªã¯ã¨ã¹ã)
ãã©ã¦ã¶ã¯èªèº«ã§æ¬¡ã®ãã㪠preflight ãªã¯ã¨ã¹ããæãã¾ã:
OPTIONS /service.json
Host: site.com
Origin: https://javascript.info
Access-Control-Request-Method: PATCH
Access-Control-Request-Headers: Content-Type,API-Key
- ã¡ã½ãã:
OPTIONS. - ãã¹ â ã¡ã¤ã³ã®ãªã¯ã¨ã¹ãã¨æ£ç¢ºã«åã:
/service.json. - ã¯ãã¹ãªãªã¸ã³ã®ç¹å¥ãªããã:
Originâ éä¿¡å ã®ãªãªã¸ã³.Access-Control-Request-Methodâ ãªã¯ã¨ã¹ããããã¡ã½ããAccess-Control-Request-Headersâ ã«ã³ãåºåãã® âåç´ã§ã¯ãªãâ ãããã®ãªã¹ã
Step 2 (preflight ã¬ã¹ãã³ã¹)
ãµã¼ãã¯ã¹ãã¼ã¿ã¹ 200 㨠次ã®ããããå¿çããå¿ è¦ãããã¾ã:
Access-Control-Allow-Methods: PATCHAccess-Control-Allow-Headers: Content-Type,API-Key.
ããã¯ä»å¾ã®ããåãã許å¯ãã¾ããããã§ãªããã°ãã¨ã©ã¼ãèµ·ããã§ãããã
ãµã¼ããä»ã®ã¡ã½ããã¨ããããå¾ ã¡åãã¦ããå ´åãä¸åº¦ã«ããããã¹ã¦ããªã¹ãããã®ã¯çã«ããªã£ã¦ãã¾ããä¾:
200 OK
Access-Control-Allow-Methods: PUT,PATCH,DELETE
Access-Control-Allow-Headers: API-Key,Content-Type,If-Modified-Since,Cache-Control
Access-Control-Max-Age: 86400
ããã§ãã©ã¦ã¶ã¯ PATCH ã許å¯ãããã¡ã½ããã®ãªã¹ãã«ããã両æ¹ã®ãããããªã¹ãã«ãããã確èªã§ããã®ã§ãã¡ã¤ã³ã®ãªã¯ã¨ã¹ããéä¿¡ãã¾ãã
å ãã¦ãpreflight ã¬ã¹ãã³ã¹ã¯ Access-Control-Max-Age ãããã§æå®ãããæé(86400 ç§, 1æ¥)ãã£ãã·ã¥ããã¾ãããã®ããå¾ç¶ã®ãªã¯ã¨ã¹ãã§ã¯ preflight ã¯èµ·ãã¾ããããããã¯ãã£ãã·ã¥ã®å
容ããè¨±å®¹ã¨æ³å®ãã¦ãç´æ¥éä¿¡ããã¾ãã
Step 3 (å®éã®ãªã¯ã¨ã¹ã)
preflight ãæåããã¨ããã©ã¦ã¶ã¯æ¬å½ã®ãªã¯ã¨ã¹ããè¡ãã¾ããããã§ã®ããã¼ã¯åç´ãªã¯ã¨ã¹ãã®å ´åã¨åãã§ãã
å®éã®ãªã¯ã¨ã¹ã㯠Origin ããããæã¡ã¾ã(ã¯ãã¹ãªãªã¸ã³ã®ãã)ã:
PATCH /service.json
Host: site.com
Content-Type: application/json
API-Key: secret
Origin: https://javascript.info
Step 4 (å®éã®ã¬ã¹ãã³ã¹)
ãµã¼ã㯠Access-Control-Allow-Origin ãã¬ã¹ãã³ã¹ã«è¿½å ããã®ãå¿ããªãã§ãã ãããããããªãã¨ãæåãã preflight ã¯è§£æ¾ãã¾ããã:
Access-Control-Allow-Origin: https://javascript.info
ããã§ãã¹ã¦OKã§ããJavaScript ã¯å®å ¨ãªã¬ã¹ãã³ã¹ãèªããã¨ãã§ãã¾ãã
Credentials
ããã©ã«ãã§ã¯ãã¯ãã¹ãªãªã¸ã³ãªã¯ã¨ã¹ãã¯ã¯ã¬ãã³ã·ã£ã«(cookie or HTTP èªè¨¼)ãæã¡ã¾ããã
ãã㯠HTTP ãªã¯ã¨ã¹ãã§ã¯ä¸è¬çã§ã¯ããã¾ãããé常 http://site.com ã¸ã®ãªã¯ã¨ã¹ãã¯ãã®ãã¡ã¤ã³ã®ãã¹ã¦ã® cookie ãä¼´ãã¾ããããããJavaScript ã¡ã½ããã«ããä½ãããã¯ãã¹ãªãªã¸ã³ãªã¯ã¨ã¹ãã¯ä¾å¤ã§ãã
ä¾ãã°ãfetch('http://another.com') 㯠cookie ãéä¿¡ãã¾ããããã¨ã another.com ãã¡ã¤ã³ã«å±ãããã®ã§ãã£ã¦ãã
ãªãã§ããã?
ãªããªããã¯ã¬ãã³ã·ã£ã«ãæã¤ãªã¯ã¨ã¹ãã¯å¿åã®ãªã¯ã¨ã¹ããããã¯ããã«å¼·åã ããã§ãããã許å¯ããã¦ããã¨ããã㯠JavaScript ã«ã¦ã¼ã¶ã«ä»£ãã£ã¦æ©å¯æ å ±ã«ã¢ã¯ã»ã¹ããå ¨æ¨©éãä¸ãããã¨ã«ãªãã¾ãã
ãµã¼ãã¯æ¬å½ã« Origin ã®ãã¼ã¸ãããã»ã©ä¿¡é ¼ãã¦ããã®ã§ããããï¼ã¯ã¬ãã³ã·ã£ã«ãæã¤ãªã¯ã¨ã¹ããééããããã®è¿½å ã®ããããå¿
è¦ã§ãã
ã¯ã¬ãã³ã·ã£ã«ãæå¹ã«ããã«ã¯ããªãã·ã§ã³ credentials: "include" ã追å ãã¾ãã:
fetch('http://another.com', {
credentials: "include"
});
ããã§ fetch ã¯ãªã¯ã¨ã¹ãã¨ä¸ç·ã« another.com ããã® cookie ãéä¿¡ãã¾ãã
ãããµã¼ããã¯ã¬ãã³ã·ã£ã«ãå«ããªã¯ã¨ã¹ããåãå
¥ãããå ´åã¯ãAccess-Control-Allow-Origin ã«å ãã¦ãã¬ã¹ãã³ã¹ã«ããã Access-Control-Allow-Credentials: true ã追å ããå¿
è¦ãããã¾ãã
ä¾:
200 OK
Access-Control-Allow-Origin: https://javascript.info
Access-Control-Allow-Credentials: true
注æãã¦ãã ãã: Access-Control-Allow-Origin ã¯ã¯ã¬ãã³ã·ã£ã«ãæã¤ãªã¯ã¨ã¹ãã«å¯¾ãã¦ã¢ã¹ã¿ãªã¹ã¯ * ã使ããã¨ã¯ç¦æ¢ããã¦ãã¾ããä¸ã®ããã«æ£ç¢ºãªãªãªã¸ã³ã§ãªããã°ãªãã¾ãããããã¯ãµã¼ããæ¬å½ã«ä¿¡é ¼ããç¸æãç¥ã£ã¦ãããã¨ãä¿è¨¼ããããã®è¿½å ã®å®å
¨å¯¾çã§ãã
ãµããª
ãããã¯ã¼ã¯ã¡ã½ããã¯ã¯ãã¹ãªãªã¸ã³ãªã¯ã¨ã¹ãã2種é¡ã«åãã¾ã: âåç´â ã¨ãã®ä»ã§ãã
åç´ãªã¯ã¨ã¹ã ã¯æ¬¡ã®æ¡ä»¶ãæºãããªããã°ãªãã¾ãã:
- ã¡ã½ãã: GET, POST or HEAD.
- ããã â æ¬¡ã®ãã®ã ãã»ããã§ãã¾ã:
AcceptAccept-LanguageContent-LanguageContent-Type:application/x-www-form-urlencoded,multipart/form-dataã¾ãã¯text/plainã®ãããã.
æ¬è³ªçãªéãã¯ãåç´ãªã¯ã¨ã¹ãã¯ä»¥åãã <form> ããã㯠<script> ã¿ã°ã使ç¨ãã¦è¡ããã¨ãã§ãã¾ããããã®ä¸æ¹ãåç´ã§ãªããã®ã¯ããã©ã¦ã¶ã§ã¯é·ãéä¸å¯è½ã ã£ããã¨ã§ãã
å®éã®éãã¯ãåç´ãªã¯ã¨ã¹ã㯠Origin ãããã¨ã¨ãã«ããã«éä¿¡ããã¾ãããä»ã®ãªã¯ã¨ã¹ãã§ã¯ããã©ã¦ã¶ã¯è¨±å¯ãæ±ããããã«äºåã® âpriflightâ ãªã¯ã¨ã¹ããè¡ãã¾ãã
åç´ãªã¯ã¨ã¹ãã®å ´å:
- â ãã©ã¦ã¶ã¯éä¿¡å
ããã¤
Originããããéä¿¡ãã¾ãã - â ã¯ã¬ãã³ã·ã£ã«ãæããªããªã¯ã¨ã¹ãã®å ´å(ããã©ã«ã)ããµã¼ãã¯ä»¥ä¸ãè¨å®ããå¿
è¦ãããã¾ã:
Access-Control-Allow-Originã«*ã¾ãã¯Originã¨åãå¤
- â ã¯ã¬ãã³ã·ã£ã«ãæã¤ãªã¯ã¨ã¹ãã®å ´åããµã¼ãã¯ä»¥ä¸ãè¨å®ããå¿
è¦ãããã¾ã:
Access-Control-Allow-Originã«OriginAccess-Control-Allow-Credentialsã«true
ããã«ãJavaScript ã§åç´ã§ãªãã¬ã¹ãã³ã¹ããã(ä¸è¨ä»¥å¤)ã«ã¢ã¯ã»ã¹ãããå ´å:
Cache-ControlContent-LanguageContent-TypeExpiresLast-ModifiedPragma
â¦ãµã¼ãã¯è¨±å¯ããããã®ã Access-Control-Expose-Headers ãããã«ãªã¹ãããå¿
è¦ãããã¾ãã
åç´ã§ãªããªã¯ã¨ã¹ãã®å ´åãè¦æ±ããããã®ã®åã«äºåã® âpreflightâ ãªã¯ã¨ã¹ããçºè¡ããã¾ãã
- â ãã©ã¦ã¶ã¯æ¬¡ã®ãããã¨å
±ã«åã URL ã«
OPTIONSãªã¯ã¨ã¹ããéä¿¡ãã¾ãã:Access-Control-Request-Methodã¯è¦æ±ãããã¡ã½ãããæã¡ã¾ãAccess-Control-Request-Headersã¯è¦æ±ãããåç´ã§ãªããããã®ãªã¹ãã§ã
- â ãµã¼ãã¯ã¹ãã¼ã¿ã¹ 200 ã¨æ¬¡ã®ããããå¿çãã¾ã:
Access-Control-Allow-Methodsã¯è¨±å¯ãããã¡ã½ããã®ãªã¹ããå«ã¿ã¾ã,Access-Control-Allow-Headersã¯è¨±å¯ããããããã®ãªã¹ããå«ã¿ã¾ã,Access-Control-Max-Ageã¯è¨±å¯(ãã¼ããã·ã§ã³)ã®ãã£ãã·ã¥ã®ç§æ°ã§ãã
- ãã®å¾ãå®éã®ãªã¯ã¨ã¹ããéä¿¡ãããåã® âåç´ãªâ ã¹ãã¼ã ãé©ç¨ããã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã