CORSã®ä»çµã¿ââãªããã©ãŠã¶ã¯ãããã®ãµãŒããŒããèŠæããã®ã
CORSã¯ãCross-Origin Resource Sharingãã®ç¥ã§ãæ¥æ¬èªã ãšããªãªãžã³éãªãœãŒã¹å ±æãã ãããã©ãŠã¶ã«ã¯ãåäžãªãªãžã³ããªã·ãŒãã£ãŠããã»ãã¥ãªãã£ã«ãŒã«ããã£ãŠãããWebããŒãžããå¥ã®ãªãªãžã³ã®ãµãŒããŒãžãªã¯ãšã¹ããéãã®ãååãããã¯ãããã ãCORSã¯ãã®ãããã¯ãå®å šã«è§£é€ããããã®ä»çµã¿ã ãã
ããªãªãžã³ãã£ãŠäœïŒURLã®ããšïŒ
ãªãªãžã³ã¯ãã¹ããŒã ïŒãã¹ãïŒããŒããã®3ã€ã®çµã¿åããã ããäŸãã° https://example.com:443 ãš http://example.com:80 ã¯ã¹ããŒã ãéãããå¥ãªãªãžã³ãhttps://example.com ãš https://api.example.com ããã¹ããéãããå¥ãªãªãžã³ã3ã€å šéšäžèŽããŠåããŠãåäžãªãªãžã³ãã«ãªããã ã
ãªãã§ãã©ãŠã¶ã¯ãããªã«å³ããã®ïŒå¥ã«èªç±ã«ã¢ã¯ã»ã¹ãããŠãããã°ããã®ã«ã
ããå¶éããªãã£ãããæªæã®ãããµã€ããéããã ãã§ããã®ããŒãžã®JavaScriptãããªãã®ãã°ã€ã³æžã¿ã®éè¡ãµã€ããSNSã«åæã«ãªã¯ãšã¹ããéãã¡ãããã ãCookieãäžç·ã«éããããããæ®é«ãèŠããééãããã§ããŠããŸããåäžãªãªãžã³ããªã·ãŒã¯ãããããæ»æãããŠãŒã¶ãŒãå®ãããã®ãã©ãŠã¶ã®é²å£ã ãã
æãâŠâŠïŒãããCORSã§ã©ããã£ãŠå®å šã«èš±å¯ããã®ïŒ
ãµãŒããŒåŽãã¬ã¹ãã³ã¹ããããŒã§ããã®ãªãªãžã³ããã®ã¢ã¯ã»ã¹ã¯èš±å¯ãããããšæç€ºãããã ã代衚çãªã®ã Access-Control-Allow-Origin ããããŒã§ãäŸãã° Access-Control-Allow-Origin: https://myapp.com ãšè¿ãã°ãmyapp.comããã®ãªã¯ãšã¹ãã ãèš±å¯ããããã¯ã€ã«ãã«ãŒã * ãæå®ããã°å šãªãªãžã³èš±å¯ã ãã©ãã»ãã¥ãªãã£çã«ã¯å¿ èŠæå°éã«ããã®ãéåã ãã
GETãªã¯ãšã¹ããªãæ®éã«éãããšãããããïŒãããªãã©ã€ããã£ãŠããã®ãé£ã¶ãšããšé£ã°ãªããšããããã¿ããã ãã©âŠâŠ
ãã質åã ãããã©ãŠã¶ã¯ãã·ã³ãã«ãªã¯ãšã¹ãããšããã以å€ããåºå¥ãããã ãGETãPOSTã§ãContent-Typeã application/x-www-form-urlencodedãmultipart/form-dataãtext/plain ã®ãããããªããã·ã³ãã«ãªã¯ãšã¹ããšããŠãã®ãŸãŸéä¿¡ããããã§ãPUTãDELETEããããã¯Content-Typeã application/json ã®POSTãªã©ã¯ãæ¬çªãªã¯ãšã¹ãã®åã«OPTIONSã¡ãœããã§ãããªãã©ã€ããªã¯ãšã¹ãããé£ã¶ãã ã
ããªãã©ã€ãã£ãŠå ·äœçã«ã©ããªããåããªã®ïŒ
ãã©ãŠã¶ããŸãOPTIONSãªã¯ãšã¹ããéã£ãŠãAccess-Control-Request-MethodïŒäœ¿ãããHTTPã¡ãœããïŒãš Access-Control-Request-HeadersïŒäœ¿ãããããããŒïŒãäŒããããµãŒããŒã¯ããã«å¯Ÿã㊠Access-Control-Allow-MethodsãAccess-Control-Allow-HeadersãAccess-Control-Max-AgeïŒããªãã©ã€ãçµæã®ãã£ãã·ã¥ç§æ°ïŒãã¬ã¹ãã³ã¹ã§è¿ãããã©ãŠã¶ã¯ãã®å¿çãèŠãŠãOKãèš±å¯ãããŠããªããšå€æããŠããæ¬çªãªã¯ãšã¹ããéããã ãã
ã¯ã¬ãã³ã·ã£ã«ïŒCookieãHTTPèªèšŒæ å ±ïŒãéãã«ã¯ãã¯ã©ã€ã¢ã³ãåŽã§ fetch ã® credentials: 'include' ãæå®ããŠããµãŒããŒåŽã§ Access-Control-Allow-Credentials: true ãè¿ãå¿ èŠããããã ãããã§éèŠãªã®ããAllow-Originã«ã¯ã€ã«ãã«ãŒã * ã¯äœ¿ããªããšããããšãå¿ ãå ·äœçãªãªãªãžã³ãæå®ããªããšãããªããããã¯ãã©ãŠã¶ããå šäžçã«Cookieãéã£ãŠOKããšããç¶æ ãé²ãããã ãã
CORSãšã©ãŒãåºããšããã©ããã£ãŠãããã°ããã°ããã®ïŒã³ã³ãœãŒã«ã«èµ€åã§åºããã©ããåãããªããŠâŠâŠ
ãŸããã©ãŠã¶ã®DevToolsã®Networkã¿ããéããŠãOPTIONSãªã¯ãšã¹ããé£ãã§ãããããã®ã¬ã¹ãã³ã¹ããããŒã«æ£ããAllowç³»ããããŒããããã確èªãããããããããã¹ã¯ããµãŒããŒãOPTIONSã«200ãè¿ããŠããªããAllow-Originãèšå®ãããŠããªããAllow-Headersã« Authorization ãå ¥ã£ãŠããªãããªã©ã ããCORSãšã©ãŒã®ã¡ãã»ãŒãžã¯ãã©ãŠã¶ã«ãã£ãŠåŸ®åŠã«éããã©ãChromeãªãåå ãããªãå ·äœçã«æžãããããèªãã§ã¿ããšãããã
ãµãŒããŒå士ã®éä¿¡ã§ãCORSãšã©ãŒã£ãŠèµ·ããã®ïŒããã¯ãšã³ãããAPIãå©ããšããšãã
èµ·ããªãããCORSã¯ãããŸã§ãã©ãŠã¶ã ãã®ã»ãã¥ãªãã£æ©æ§ãªãã ãcurlãNode.jsã®fetchãPythonã®requestsãªã©ãµãŒããŒãµã€ãããã®HTTPãªã¯ãšã¹ãã«ã¯CORSå¶éã¯äžåããããªããã ãããããŒã«ã«ã®curlã§ã¯åãã®ã«ãã©ãŠã¶ããã ãšåããªãããšããã®ã¯å žåçãªCORSåé¡ã ãããããã·ãµãŒããŒãæãã§åé¿ãããã¿ãŒã³ããã®æ§è³ªãå©çšããŠãããã ãã
CORSã®èšå®ãééãããšã»ãã¥ãªãã£çã«ãŸããããšãããïŒ
ããããç¹ã«å±éºãªã®ãããªã¯ãšã¹ãã®OriginããããŒããã®ãŸãŸ Access-Control-Allow-Origin ã«åå°ããå®è£ ã ããããã ãšä»»æã®ãµã€ãããã®ã¢ã¯ã»ã¹ãèš±å¯ããŠããã®ãšåãã§ãCredentials: trueãšçµã¿åããããšãæ»æè ã®ãµã€ããããŠãŒã¶ãŒã®Cookieä»ãã§APIãå©ãæŸé¡ã«ãªããããšãCORSãšCSRF察çãæ··åãã人ãå€ããã©ãCORSã¯ãã¬ã¹ãã³ã¹ã®èªã¿åãããå¶åŸ¡ãããã®ã§ããªã¯ãšã¹ãéä¿¡èªäœã¯ãããã¯ããªããCSRF察çã«ã¯CSRFããŒã¯ã³ãªã©å¥ã®ä»çµã¿ãå¿ èŠã ãã
CORSã£ãŠå¥¥ãæ·±ããã ãâŠâŠã¡ãããšããããŒãèªãçãã€ãããïŒ
ããã ããCORSã¯ããã©ãŠã¶ããŠãŒã¶ãŒãå®ãããã®ä»çµã¿ãã§ããµãŒããŒããã©ãããã®ã¢ã¯ã»ã¹ãä¿¡é ŒãããããããããŒã§å®£èšããä»çµã¿ã ãšèŠããŠããããDevToolsã®Networkã¿ãã§OPTIONSãªã¯ãšã¹ããšã¬ã¹ãã³ã¹ããããŒã確èªããç¿æ £ãã€ããã°ãCORSãšã©ãŒã«æ©ãŸãããããšã¯æ¿æžãããã