CORS

CORSλž€?

CORS (Cross Origin Resource Sharing)λž€ 도메인이 λ‹€λ₯Έ 2개의 μ‚¬μ΄νŠΈκ°€ 데이터λ₯Ό μ£Όκ³  받을 λ•Œ λ°œμƒν•˜λŠ” λ¬Έμ œμ΄λ‹€. 예λ₯Ό λ“€μ–΄ custom-domain.comμ—μ„œ custom2-domain.com으둜 데이터λ₯Ό μš”μ²­ν•œλ‹€κ³  ν•  λ•Œ, λ³„λ„μ˜ 섀정이 μ—†μœΌλ©΄ CORSλ₯Ό λ§Œλ‚˜κ²Œ 될 것이닀.

CORSκ°€ μƒκΈ°κ²Œ 된 μ΄μœ λŠ” μ„œλ²„ λ‚΄μ—μ„œ μš”μ²­μ΄ ν—ˆλ½λœ λ„λ©”μΈμ—λ§Œ 데이터λ₯Ό μ£Όλ©΄μ„œ λ³΄μ•ˆμ„ κ°•ν™”ν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€. μš”μ²­μ„ ν—ˆλ½ν•˜κΈ° μœ„ν•΄μ„œλŠ” Access-Control-Alow-Origin: {도메인}κ³Ό 같은 섀정을 Response 헀더에 μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.

λ§Œμ•½ 도메인을 μ™€μΌλ“œμΉ΄λ“œ(*)둜 μ„€μ •ν•˜λ©΄ λͺ¨λ“  도메인에 λŒ€ν•œ μš”μ²­μ„ ν—ˆμš©ν•  수 μžˆλ‹€. κ·Έ μ™Έμ˜ 헀더도 μ„€μ • κ°€λŠ₯ν•˜λ‹€.

  • Access-Control-Allow-Orgin : μš”μ²­μ„ λ³΄λ‚΄λŠ” νŽ˜μ΄μ§€μ˜ 좜처 [ *, 도메인 ]

  • Access-Control-Allow-Methods : μš”μ²­μ„ ν—ˆμš©ν•˜λŠ” λ©”μ†Œλ“œ. Default : GET, POST

  • Access-Control-Max-Age : ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ preflight μš”μ²­ (μ„œλ²„μ˜ 응닡 κ°€λŠ₯여뢀에 λŒ€ν•œ 확인) κ²°κ³Όλ₯Ό μ €μž₯ν•  μ‹œκ°„

  • Access-Control-Allow-Headers : μš”μ²­μ„ ν—ˆμš©ν•˜λŠ” 헀더

자유둭게 λ‹€λ₯Έ Origin으둜 μš”μ²­μ„ 보낼 수 있게 λœλ‹€λ©΄?

μ•…μ˜μ μΈ λ§ˆμŒμ„ ν’ˆμ€ 해컀가 μžμ‹ μ˜ μ›Ήμ‚¬μ΄νŠΈλ₯Ό ꡬ좕해놓고, 이 μ›Ήμ‚¬μ΄νŠΈλ₯Ό κ°€λ¦¬ν‚€λŠ” 링크λ₯Ό 담은 메일을 μ‚¬μš©μžμ—κ²Œ λ³΄λ‚΄λŠ” 것이닀. 그리고 이 μ‚¬μš©μžλŠ” AλΌλŠ” μ›Ήμ‚¬μ΄νŠΈμ— 둜그인이 λ˜μ–΄ μžˆμ–΄μ„œ λΈŒλΌμš°μ € 단에 인증 정보가 μ‘΄μž¬ν•œλ‹€κ³  ν•΄λ³΄μž. λ§Œμ•½ κ·Έ μ‚¬μš©μžκ°€ μ‹€μˆ˜λ‘œ ν•΄λ‹Ή 링크λ₯Ό ν΄λ¦­ν•˜μ—¬ ν•΄μ»€μ˜ μ›Ήμ‚¬μ΄νŠΈμ— μ ‘μ†ν•˜λ©΄, 해컀가 심어둔 JavaScript μ½”λ“œκ°€ μ‹€ν–‰λ˜μ–΄ μžκΈ°λ„ λͺ¨λ₯΄κ²Œ A μ›Ήμ‚¬μ΄νŠΈλ‘œ 개인 정보λ₯Ό μ‘°νšŒν•˜λŠ” API μš”μ²­μ„ 보낼 것이닀. 이 μ‚¬μš©μžμ˜ λΈŒλΌμš°μ € λ‹¨μ—λŠ” 인증 정보가 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ—, 이것이 ν•΄λ‹Ή μš”μ²­μ— ν•¨κ»˜ μ‹€μ–΄μ„œ μ „μ†‘λ˜λ©΄ μ„œλ²„λŠ” 인증된 μš”μ²­μ΄λΌ μƒκ°ν•˜μ—¬ 개인 정보λ₯Ό 응닡해쀄 것이닀. 그러고 λ‚˜λ©΄ κ·Έ 개인 정보λ₯Ό 해컀가 빼돌릴 수 있게 λœλ‹€. (이것이 λ°”λ‘œ CSRFarrow-up-right 곡격이닀.)

λ§Œμ•½ SOPκ°€ μ‘΄μž¬ν•œλ‹€λ©΄ 이런 문제λ₯Ό μ–΄λŠμ •λ„ μ˜ˆλ°©ν•  수 μžˆλ‹€.

Origin

CORSμ—μ„œ Origin은 URLμ—μ„œ ν”„λ‘œν† μ½œ, 도메인, 포트 번호λ₯Ό ν•©μΉœ 것을 μ˜λ―Έν•œλ‹€.

λ‹€μŒκ³Ό 같은 URL이 μ‘΄μž¬ν•  λ•Œ, https://custom-domain.com:9091/pp/1234

ν”„λ‘œν† μ½œ(Scheme) : https://

도메인 : custom-domain.com

포트 : 9091

μ—¬κΈ°μ„œ Origin은 포트 λ²ˆν˜ΈκΉŒμ§€ ν•΄λ‹Ήν•œλ‹€.

SOP (Same Origin Policy)

SOPλŠ” λ‹€λ₯Έ Origin으둜 μš”μ²­μ„ 보낼 수 없도둝 κΈˆμ§€ν•˜λŠ” 정책이닀. λ”°λΌμ„œ λ™μΌν•œ Origin으둜만 μš”μ²­μ„ 보내도둝 ν•œλ‹€. 졜근 기술의 λ°œμ „μœΌλ‘œ μ„œλ‘œ λ‹€λ₯Έ Origin끼리 데이터λ₯Ό μ£Όκ³ λ°›λŠ” κ²½μš°κ°€ λ§Žμ•„μ§€κ²Œ 되고 SOPλŠ” 별도 μ˜ˆμ™Έ 사항을 λ‘κ²Œλœλ‹€. 즉, νŠΉμ • 상황에 μ„œλ‘œ λ‹€λ₯Έ Origin끼리 μš”μ²­μ„ 보내도둝 ν•˜λŠ”κ²ƒμ΄λ‹€.

CORSλŠ” λ‹€λ₯Έ Origin으둜 μš”μ²­μ„ 보내기 μœ„ν•΄ μ§€μΌœμ•Ό ν•˜λŠ” μ •μ±…μœΌλ‘œμ¨ μ›λž˜λΌλ©΄ SOP에 μ˜ν•΄ λ§‰νžˆκ²Œ 될 μš”μ²­μ„ ν’€μ–΄μ£ΌλŠ” 정책이라고 μƒκ°ν•˜λ©΄ λœλ‹€.

  • μš”μ²­μ„ λ§‰μ•„μ£ΌλŠ” 정책인쀄 μ•Œμ•˜λŠ”λ° 였히렀 μš”μ²­μ„ 보내도둝 λ„μ™€μ£ΌλŠ” μ •μ±…μΈκ²ƒμž„γ…‹γ…‹..

μ—¬κΈ°μ„œ μ€‘μš”ν•œ 것은 CORSλŠ” 'λΈŒλΌμš°μ €'의 정책이닀. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λΈŒλΌμš°μ €κ°€ μžμ‹ μ΄ 보낸 μš”μ²­ 및 μ„œλ²„λ‘œλΆ€ν„° 받은 응닡이 CORS 정책을 μ§€ν‚€λŠ”μ§€ κ²€μ‚¬ν•œλ‹€. μ‹€μ œ λΈŒλΌμš°μ €μ˜ κΈ°λ³Έ CORS 정책은 λ‹€λ₯Έ μΆœμ²˜λ‘œλΆ€ν„°μ˜ μš”μ²­μ΄ λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•˜λŠ” 것을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€. λ§Œμ•½ μ„œλ²„μ—μ„œ 보낸 응닡이 μ•ˆμ „ν•œ μš”μ²­μ΄ μ•„λ‹ˆλΌκ³  νŒλ‹¨ν•˜λ©΄ ν•΄λ‹Ή μš”μ²­μ„ 버린닀.

CORS λ™μž‘ 원리

λ™μž‘ μ›λ¦¬λŠ” λ‹¨μˆœν•˜λ‹€. λΈŒλΌμš°μ €λŠ” λ‹€λ₯Έ Origin으둜 μš”μ²­μ„ 보낼 λ•Œ Origin 헀더에 μžμ‹ μ˜ Origin을 μ„€μ •ν•˜κ³  μ„œλ²„λ‘œλΆ€ν„° 응닡을 λ°›μœΌλ©΄ μ‘λ‹΅μ˜ Access-Control-Allow-Origin 헀더에 μ„€μ •λœ Origin λͺ©λ‘μ„ ν™•μΈν•œλ‹€.

  • λΈŒλΌμš°μ €λŠ” μ„œλ²„μ—μ„œ μ„€μ •ν•œ μ‘λ‹΅μ˜ Origin λͺ©λ‘μ„ ν™•μΈν•œλ‹€.

κ·Έλž˜μ„œ μ„œλ²„μ—μ„œ Origin λͺ©λ‘μ„ μ„€μ •ν•˜κ±°λ‚˜ μ™€μΌλ“œμΉ΄λ“œ(*)λ₯Ό μ„€μ •ν•œλ‹€.

  • μ™€μΌλ“œμΉ΄λ“œ(*)λŠ” λͺ¨λ“  Origin을 ν—ˆμš©ν•œλ‹€λŠ” 것을 μ˜λ―Έν•˜λŠ” κΈ°ν˜Έμ΄λ‹€.

CORS μš”μ²­μ—λŠ” μ„Έ κ°€μ§€ μœ ν˜•μ΄ μ‘΄μž¬ν•œλ‹€.

1. λ‹¨μˆœ μš”μ²­ (Simple Request)

μ„œλ²„μ—μ„œ μš”μ²­μ„ 보내고 μ„œλ²„λ‘œλΆ€ν„° 응닡이 λ„μ°©ν–ˆμ„ λ•Œ, λΈŒλΌμš°μ €κ°€ μš”μ²­ν•œ Originκ³Ό 응닡 ν—€λ”μ˜ Access-Control-Request-Headers의 값을 λΉ„κ΅ν•΄μ„œ μœ νš¨ν•œ μš”μ²­μ΄λ©΄ λ¦¬μ†ŒμŠ€λ₯Ό μ‘λ‹΅ν•œλ‹€. λ§Œμ•½ μœ νš¨ν•˜μ§€ μ•Šλ‹€λ©΄ λΈŒλΌμš°μ €λŠ” 이λ₯Ό 막고 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

HTTP Methodκ°€ λ‹€μŒμ€‘ ν•˜λ‚˜μ΄μ–΄μ•Ό ν•œλ‹€.

  • GET, HEAD, POST

User Agentκ°€ μžλ™μœΌλ‘œ μ„€μ •ν•œ 헀더λ₯Ό μ œμ™Έν•˜λ©΄, λ‹€μŒκ³Ό 같은 ν—€λ”λ§Œ μ‚¬μš©ν•  수 μžˆλ‹€. 즉, μžλ™μœΌλ‘œ μ„€μ •λ˜λŠ” ν—€λ”λŠ” μ œμ™Έν•˜κ³  λ‹€μŒ ν—€λ”λ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

  • Accept, Accept-Language => Cotent-Language, Content-Type

Content-Type은 λ‹€μŒκ³Ό 같은 경우

  • application/x-www-form-urlencoded

  • multipart/form-data

  • text/plain

μœ„ 쑰건을 λ§Œμ‘±ν•˜λŠ” μš”μ²­μ„ μ•ˆμ „ν•œ μš”μ²­μœΌλ‘œ μ·¨κΈ‰ν•˜κ³  Simple Requests라고 λΆ€λ₯Έλ‹€.

이 μš”μ²­μ€ μΆ”κ°€μ μœΌλ‘œ ν™•μΈν•˜μ§€ μ•Šκ³  μ‹€μ œ μš”μ²­μ„ 보낸닀.

2. ν”„λ¦¬ν”ŒλΌμ΄νŠΈ μš”μ²­ (Preflight Request)

Simple Request 쑰건에 λ²—μ–΄λ‚œ μš”μ²­κ°™μ€ 경우, μ„œλ²„μ—μ„œ μ‹€μ œ μš”μ²­μ„ 보내기 전에 μ˜ˆλΉ„ μš”μ²­μ— ν•΄λ‹Ήν•˜λŠ” Preflight Request을 λ¨Όμ € λ³΄λ‚΄μ„œ μ‹€μ œ μš”μ²­μ΄ μ „μ†‘ν•˜λŠ”λ° μžˆμ–΄μ„œ μ•ˆμ „ν•œμ§€ νŒλ‹¨ν•œλ‹€. λ§Œμ•½ μ•ˆμ „ν•œ μš”μ²­μ΄λΌκ³  ν™•μΈλ˜λ©΄ μ‹€μ œ μš”μ²­μ„ μ„œλ²„μ— 보낸닀. κ·Έλž˜μ„œ 총 두 번의 μš”μ²­μ„ 보낸닀.

μš”μ²­μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • λ©”μ†Œλ“œλ‘œ OPTIONSλ₯Ό μ‚¬μš©ν•œλ‹€.

  • Origin 헀더에 μžμ‹ μ˜ Origin을 μ„€μ •ν•œλ‹€.

  • Access-Control-Request-Method 헀더에 μ‹€μ œ μš”μ²­μ— μ‚¬μš©ν•  λ©”μ†Œλ“œλ₯Ό μ„€μ •ν•œλ‹€.

  • Access-Control-Request-Headers 헀더에 μ‹€μ œ μš”μ²­μ— μ‚¬μš©ν•  헀더듀을 μ„€μ •ν•œλ‹€.

μ‰½κ²Œ μ–˜κΈ°ν•˜λ©΄, Origin 헀더에 ν˜„μž¬ μš”μ²­ν•˜λŠ” Browser Originκ³Ό, Access-Control-Request-Method 헀더에 μš”μ²­ν•˜λŠ” HTTP Method와 Access-Control-Request-Headers μš”μ²­ μ‹œ μ‚¬μš©ν•  헀더λ₯Ό OPTIONS λ©”μ„œλ“œλ‘œ μ„œλ²„μ— μš”μ²­ν•œλ‹€. μ΄λ•Œ λ‚΄μš©λ¬Όμ€ μ—†κ³  ν—€λ”λ§Œ μ „μ†‘ν•œλ‹€. 이 μš”μ²­μ΄ μœ νš¨ν•˜λ©΄ μ›λž˜ 보내렀고 ν–ˆλ˜ μš”μ²­μ„ 보낸닀.

μ„œλ²„λŠ” Preflight Request μš”μ²­μ— λ‹€μŒκ³Ό 같은 νŠΉμ§•μ„ κ°€μ§„ 응닡을 μ œκ³΅ν•΄μ•Ό ν•œλ‹€.

  • Access-Control-Allow-Origin 헀더에 ν—ˆμš©λ˜λŠ” Originλ“€μ˜ λͺ©λ‘ ν˜Ήμ€ μ™€μΌλ“œμΉ΄λ“œ(*)λ₯Ό μ„€μ •ν•œλ‹€.

    • Browserκ°€ ν•΄λ‹Ή origin이 μžμ›μ— μ ‘κ·Όν•  수 μžˆλ„λ‘ ν—ˆμš©ν•œλ‹€. μ™€μΌλ“œμΉ΄λ“œ(*)λŠ” credentials이 μ—†λŠ” μš”μ²­μ— ν•œν•΄μ„œ λͺ¨λ“  originμ—μ„œ 접근이 κ°€λŠ₯ν•˜λ„λ‘ ν—ˆμš©ν•œλ‹€.

  • Access-Control-Allow-Methods 헀더에 ν—ˆμš©λ˜λŠ” λ©”μ†Œλ“œλ“€μ˜ λͺ©λ‘ ν˜Ήμ€ μ™€μΌλ“œμΉ΄λ“œ(*)λ₯Ό μ„€μ •ν•œλ‹€.

    • preflight μš”μ²­μ— λŒ€ν•œ μ‘λ‹΅μœΌλ‘œ ν—ˆμš©λ˜λŠ” λ©”μ„œλ“œλ“€μ„ λ‚˜νƒ€λ‚Έλ‹€.

  • Access-Control-Allow-Headers 헀더에 ν—ˆμš©λ˜λŠ” ν—€λ”λ“€μ˜ λͺ©λ‘ ν˜Ήμ€ μ™€μΌλ“œμΉ΄λ“œ(*)λ₯Ό μ„€μ •ν•œλ‹€.

    • preflight μš”μ²­μ— λŒ€ν•œ μ‘λ‹΅μœΌλ‘œ μ‹€μ œ μš”μ²­ μ‹œ μ‚¬μš©ν•  수 μžˆλŠ” HTTP 헀더λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

  • Access-Control-Max-Age 헀더에 ν•΄λ‹Ή ν”„λ¦¬ν”ŒλΌμ΄νŠΈ μš”μ²­μ΄ λΈŒλΌμš°μ €μ— μΊμ‹œ 될 수 μžˆλŠ” μ‹œκ°„μ„ 초 λ‹¨μœ„λ‘œ μ„€μ •ν•œλ‹€.

    • μ–Όλ§ˆλ‚˜ μ˜€λž«λ™μ•ˆ preflight μš”μ²­μ΄ 캐싱 될 수 μžˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

BrowserλŠ” μœ„μ™€ 같은 응닡을 λ°›μœΌλ©΄ 응닡 정보λ₯Ό μžμ‹ μ΄ μ „μ†‘ν•œ μš”μ²­μ˜ 정보와 λΉ„κ΅ν•˜μ—¬ μ‹€μ œ μš”μ²­μ˜ μ•ˆμ „μ„±μ„ κ²€μ‚¬ν•œλ‹€. μ•ˆμ „ν•˜λ‹€κ³  νŒλ‹¨λ˜λ©΄ μ‹€μ œ μš”μ²­μ„ μ„œλ²„μ— μ „μ†‘ν•œλ‹€. μ΄λ•Œ Access-Control-Request-XXX ν˜•νƒœμ˜ ν—€λ”λŠ” 보내지 μ•ŠλŠ”λ‹€.

μ‚¬μš©μžκ°€ μ •μ˜ν•œ 헀더(New-Header)λ₯Ό μ‚¬μš©ν•˜λŠ” μš”μ²­μ˜ 경우 Simple Request 쑰건에 λ²—μ–΄λ‚˜κΈ° λ•Œλ¬Έμ— Preflight μš”μ²­μ΄ ν•„μš”ν•˜λ‹€.

3. 인증 정보λ₯Ό ν¬ν•¨ν•œ μš”μ²­ (Credentialed Request)

1번과 2번 μš”μ²­μ€ 인증 정보가 μ—†λŠ” κ²½μš°μ— ν•΄λ‹Ήν•œλ‹€.

μ—¬κΈ°μ„œ 인증 μ •λ³΄λŠ” μΏ ν‚€(Cookie) ν˜Ήμ€ Authorization 헀더에 μ„€μ •ν•˜λŠ” 토큰 κ°’ 등을 μ–˜κΈ°ν•œλ‹€.

μ΄λŸ¬ν•œ 인증 정보λ₯Ό ν•¨κ»˜ λ³΄λ‚΄μ•Όν•˜λŠ” μš”μ²­μ€ λ³„λ„μ˜ CORS 정책이 μ‘΄μž¬ν•œλ‹€.

μΏ ν‚€ 같은 인증 정보λ₯Ό 보내기 μœ„ν•΄μ„œλŠ” ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μš”μ²­ μ‹œ λ³„λ„μ˜ 섀정이 ν•„μš”ν•˜λ‹€.

μ΄λŠ” Ajax μš”μ²­μ„ μœ„ν•΄ μ–΄λ– ν•œ 도ꡬλ₯Ό μ‚¬μš©ν•˜λŠλƒμ— 따라 λ‹¬λΌμ§€λŠ”λ° λ§Œμ•½ XMLHttpRequest, JQuery의 ajax, λ˜λŠ” axiosλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ withCredentialsλ₯Ό true둜 μ„€μ •ν•΄μ•Ό ν•œλ‹€.

반면 fetch APIλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ credentials μ˜΅μ…˜μ„ include둜 μ„€μ •ν•œλ‹€.

μ΄λŸ¬ν•œ 섀정을 ν•΄μ£Όμ§€ μ•ŠμœΌλ©΄ μΏ ν‚€ λ“±μ˜ 인증 μ •λ³΄λŠ” μ ˆλŒ€λ‘œ μ„œλ²„μ—κ²Œ μ „μ†‘λ˜μ§€ μ•ŠλŠ”λ‹€.

μ΄μ™Έμ˜ 응닡 헀더

  • Access-Control-Allow-Credentials

    • credentialsκ°€ true일 λ•Œ μš”μ²­μ— λŒ€ν•œ 응닡이 λ…ΈμΆœλ  수 μžˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

    • preflight μš”μ²­μ— λŒ€ν•œ μ‘λ‹΅μ˜ μΌλΆ€λ‘œ μ‚¬μš©λ˜λŠ” 경우 μ‹€μ œ 자격 증λͺ…을 μ‚¬μš©ν•˜μ—¬ μ‹€μ œ μš”μ²­μ„ μˆ˜ν–‰ν•  수 μžˆλŠ”μ§€ λ‚˜νƒ€λ‚Έλ‹€.

    • κ°„λ‹¨ν•œ GET μš”μ²­μ€ preflightλ˜μ§€ μ•ŠμœΌλ―€λ‘œ 자격 증λͺ…이 μžˆλŠ” λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•˜λ©΄ 헀더가 λ¦¬μ†ŒμŠ€μ™€ ν•¨κ»˜ λ°˜ν™˜λ˜μ§€ μ•ŠμœΌλ©° Browserμ—μ„œ 응닡을 λ¬΄μ‹œν•œλ‹€.

  • Access-Control-Expose-Headers

    • Browserκ°€ μ•‘μ„ΈμŠ€ν•  수 μžˆλŠ” μ„œλ²„ ν™”μ΄νŠΈλ¦¬μŠ€νŠΈ 헀더λ₯Ό ν—ˆμš©ν•œλ‹€.

Summary

CORSλŠ” μ‚¬μš©μžλ₯Ό λ³΄ν˜Έν•˜κΈ° μœ„ν•œ "μ›Ή λΈŒλΌμš°μ €" λ³΄μ•ˆ 정책이닀. μ„œλ²„μ˜ λ³΄μ•ˆ 정책이 μ•„λ‹ˆλ‹€.

κ·Έλž˜μ„œ μ²˜μŒμ— μ„œλ²„λž‘μ€ 연관이 μ—†λŠ”κ±΄κ°€ μƒκ°ν–ˆλ‹€.

CORS 정책은 μ„œλ²„μ—μ„œ κ²°μ •(μ„€μ •)ν•˜κ³ , 이 μ •μ±…μ˜ μ€€μˆ˜ μ—¬λΆ€λŠ” λΈŒλΌμš°μ €κ°€ μ‹€ν–‰ν•œλ‹€.

즉, λΈŒλΌμš°μ €λŠ” μ„œλ²„κ°€ μ„€μ •ν•œ 정책을 ν•΄μ„ν•˜κ³  이λ₯Ό 기반으둜 js μ½”λ“œκ°€ μ–΄λ–€ 데이터에 μ ‘κ·Όν•  수 μžˆλŠ”μ§€λ₯Ό κ²°μ •ν•œλ‹€.

sources

https://fetch.spec.whatwg.org/#http-cors-protocol https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#preflighted_requestsarrow-up-right

Last updated