IT

πŸ›‘ CORS 였λ₯˜ 원리 μ™„λ²½ ν•΄μ„€: λΈŒλΌμš°μ € λ³΄μ•ˆμ˜ ν•„μˆ˜ κ΄€λ¬Έ! πŸ›‘οΈ

μ›Ή κ°œλ°œμ„ ν•˜λ‹€ 보면 λˆ„κ΅¬λ‚˜ ν•œ 번쯀 뢉은색 κΈ€μ”¨μ˜ CORS 였λ₯˜(Cross-Origin Resource Sharing Error)λ₯Ό λ§Œλ‚˜κ²Œ λ©λ‹ˆλ‹€. 이 였λ₯˜λŠ” μ½”λ”© μ‹€μˆ˜κ°€ μ•„λ‹ˆλΌ, 사싀은 μ‚¬μš©μžμ˜ λ³΄μ•ˆμ„ μ§€ν‚€κΈ° μœ„ν•œ μ›Ή λΈŒλΌμš°μ €μ˜ β€˜μ°©ν•œ λ°©μ–΄ ν–‰λ™β€™μž…λ‹ˆλ‹€.

이 κΈ€μ—μ„œλŠ” CORS 였λ₯˜κ°€ λ°œμƒν•˜λŠ” μ΄μœ μ™€ 원리λ₯Ό 초보자 λˆˆλ†’μ΄μ— 맞좰 μ‰½κ²Œ, 그리고 λ³΄μ•ˆ μΈ‘λ©΄μ—μ„œ 깊이 있게 μ„€λͺ…ν•΄ λ“œλ¦΄κ²Œμš”.


1. 🏠 동일 좜처 μ •μ±… (Same-Origin Policy, SOP)의 탄생

CORSλ₯Ό μ΄ν•΄ν•˜λ €λ©΄ λ¨Όμ € μ›Ή λ³΄μ•ˆμ˜ κ°€μž₯ 기본이 λ˜λŠ” κ·œμΉ™μΈ 동일 좜처 μ •μ±…(SOP)λΆ€ν„° μ•Œμ•„μ•Ό ν•©λ‹ˆλ‹€.

1) 동일 좜처(Origin)λž€ 무엇인가?

λΈŒλΌμš°μ €λŠ” μ›Ήμ‚¬μ΄νŠΈμ˜ μ£Όμ†Œ(URL)λ₯Ό λ‹€μŒ μ„Έ κ°€μ§€ μš”μ†Œλ‘œ κ΅¬λΆ„ν•©λ‹ˆλ‹€. 이 μ„Έ κ°€μ§€κ°€ λͺ¨λ‘ κ°™μ•„μ•Ό β€˜λ™μΌ 좜처(Same-Origin)β€™λ‘œ μΈμ •λ©λ‹ˆλ‹€.

ꡬ성 μš”μ†Œμ˜ˆμ‹œ
ν”„λ‘œν† μ½œhttp: vs https:
도메인 (호슀트)api.google.com vs www.google.com
포트 번호80 vs 3000
URL AURL B동일 좜처 μ—¬λΆ€μ΄μœ 
https://a.com:443https://a.com:443βœ… 동일λͺ¨λ‘ κ°™μŒ
https://a.comhttp://a.com❌ λ‹€λ¦„ν”„λ‘œν† μ½œ (https vs http) 닀름
https://a.com:8080https://a.com❌ λ‹€λ¦„ν¬νŠΈ 번호 (8080 vs 443 λ˜λŠ” μƒλž΅) 닀름

2) SOP의 μ—­ν• : μ•…μ„± μ‚¬μ΄νŠΈ 차단

SOPλŠ” β€œλ‹€λ₯Έ μΆœμ²˜μ—μ„œ κ°€μ Έμ˜¨ λ°μ΄ν„°μ—λŠ” ν•¨λΆ€λ‘œ μ ‘κ·Όν•  수 μ—†λ‹€β€œλŠ” κ·œμΉ™μž…λ‹ˆλ‹€.

λ§Œμ•½ SOPκ°€ μ—†λ‹€λ©΄ μ–΄λ–€ 일이 μƒκΈΈκΉŒμš”?

  • μ‚¬μš©μžκ°€ 금육 μ‚¬μ΄νŠΈ(bank.com)에 λ‘œκ·ΈμΈν•œ μƒνƒœμ—μ„œ, λ™μ‹œμ— μ•…μ„± μ‚¬μ΄νŠΈ(hacker.com)λ₯Ό μ—΄μ–΄λ΄…λ‹ˆλ‹€.
  • hacker.com에 μžˆλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œκ°€ bank.com으둜 μš”μ²­μ„ λ³΄λ‚΄μ„œ μ‚¬μš©μžμ˜ μΏ ν‚€λ‚˜ 민감 정보λ₯Ό ν›”μ³κ°ˆ 수 있게 λ©λ‹ˆλ‹€.

SOPλŠ” λ°”λ‘œ 이런 μ•…μ˜μ μΈ 데이터 νƒˆμ·¨ ν–‰μœ„λ₯Ό λΈŒλΌμš°μ € λ ˆλ²¨μ—μ„œ μ›μ²œμ μœΌλ‘œ μ°¨λ‹¨ν•©λ‹ˆλ‹€.


2. 🚦 CORS (Cross-Origin Resource Sharing): μ˜ˆμ™Έ ν—ˆμš©

SOPλŠ” λ³΄μ•ˆμ„ μœ„ν•΄ ν›Œλ₯­ν•˜μ§€λ§Œ, ν˜„μ‹€μ μœΌλ‘œλŠ” λ‹€λ₯Έ 좜처 κ°„μ˜ 데이터 톡신이 ν•„μˆ˜μ μž…λ‹ˆλ‹€.

  • ν”„λ‘ νŠΈμ—”λ“œ (React, Vue) μ„œλ²„: http://localhost:3000
  • λ°±μ—”λ“œ (API) μ„œλ²„: http://api.myapp.com

이 두 μΆœμ²˜λŠ” λͺ…λ°±νžˆ λ‹€λ¦…λ‹ˆλ‹€. μ΄λ•Œ CORSλŠ” SOP 원칙을 μœ μ§€ν•˜λ©΄μ„œλ„, μ„œλ²„κ°€ λͺ…μ‹œμ μœΌλ‘œ ν—ˆμš©ν•œ κ²½μš°μ— ν•œν•΄ λ‹€λ₯Έ 좜처의 μš”μ²­μ„ 받아주도둝 ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€.

1) CORS 였λ₯˜κ°€ λ°œμƒν•˜λŠ” 이유

  1. ν”„λ‘ νŠΈμ—”λ“œ(http://localhost:3000)κ°€ λ°±μ—”λ“œ(http://api.myapp.com)둜 데이터λ₯Ό μš”μ²­ν•©λ‹ˆλ‹€.
  2. μš”μ²­μ€ μ„œλ²„μ— μ •μƒμ μœΌλ‘œ μ „λ‹¬λ˜κ³ , μ„œλ²„λ„ 응닡 데이터λ₯Ό μ •μƒμ μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€.
  3. 문제 λ°œμƒ: 응닡이 ν΄λΌμ΄μ–ΈνŠΈ(λΈŒλΌμš°μ €)에 λ„μ°©ν–ˆμ„ λ•Œ, λΈŒλΌμš°μ €κ°€ λ³΄μ•ˆ 검사λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  4. λΈŒλΌμš°μ €λŠ” 이 응닡이 β€˜λ‹€λ₯Έ μΆœμ²˜β€™μ—μ„œ μ™”μŒμ„ ν™•μΈν•˜κ³ , μ„œλ²„κ°€ 이 좜처의 접근을 ν—ˆμš©ν–ˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
  5. λ§Œμ•½ μ„œλ²„μ˜ 응닡 헀더에 β€œλ„ˆμ˜ μΆœμ²˜λŠ” ν—ˆμš©λ˜μ§€ μ•Šμ•˜μ–΄!β€λΌλŠ” λ‚΄μš©μ΄ λ‹΄κ²¨μžˆλ‹€λ©΄, λΈŒλΌμš°μ €λŠ” ν•΄λ‹Ή 응닡을 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œμ—μ„œ μ‚¬μš©ν•˜μ§€ λͺ»ν•˜λ„둝 λ§‰μ•„λ²„λ¦½λ‹ˆλ‹€. (이것이 빨간색 CORS 였λ₯˜μž…λ‹ˆλ‹€.)

2) μ„œλ²„κ°€ 보내야 ν•˜λŠ” 핡심 응닡 헀더

CORS 문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄, API μ„œλ²„κ°€ 응닡 헀더에 λ‹€μŒ λ‚΄μš©μ„ λ°˜λ“œμ‹œ ν¬ν•¨μ‹œμΌœμ•Ό ν•©λ‹ˆλ‹€.

  • Access-Control-Allow-Origin: [ν—ˆμš©ν•  좜처]
    • μ˜ˆμ‹œ: Access-Control-Allow-Origin: http://localhost:3000
    • λͺ¨λ“  좜처λ₯Ό ν—ˆμš©ν•˜λ €λ©΄: Access-Control-Allow-Origin: * (λ³΄μ•ˆμƒ ꢌμž₯λ˜μ§€ μ•ŠμŒ)

3. ✈️ Preflight Request (ν”„λ¦¬ν”ŒλΌμ΄νŠΈ μš”μ²­)의 원리

CORS ν†΅μ‹ μ—λŠ” β€˜μΌλ°˜ μš”μ²­β€™ 외에 λ³΄μ•ˆ κ°•ν™”λ₯Ό μœ„ν•œ νŠΉλ³„ν•œ μ ˆμ°¨κ°€ μžˆμŠ΅λ‹ˆλ‹€. λ°”λ‘œ Preflight Request(사전 μš”μ²­)μž…λ‹ˆλ‹€.

1) μ™œ Preflightκ°€ ν•„μš”ν• κΉŒ?

일뢀 HTTP λ©”μ„œλ“œ(예: PUT, DELETE)λ‚˜ νŠΉμ • μ»€μŠ€ν…€ 헀더λ₯Ό μ‚¬μš©ν•˜λŠ” μš”μ²­μ€ 잠재적으둜 μ„œλ²„ 데이터λ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ 민감할 수 μžˆμŠ΅λ‹ˆλ‹€. λΈŒλΌμš°μ €λŠ” 이 μš”μ²­μ„ μ‹€μ œλ‘œ 보내기 전에, β€œμ΄ μš”μ²­μ„ 보내도 λ κΉŒμš”?”라고 μ„œλ²„μ—κ²Œ λ¨Όμ € λ¬Όμ–΄λ΄…λ‹ˆλ‹€.

2) Preflight λ™μž‘ μˆœμ„œ

  1. λΈŒλΌμš°μ € μš”μ²­: μ‹€μ œ μš”μ²­(예: PUT μš”μ²­)을 보내기 직전에, λΈŒλΌμš°μ €λŠ” λ¨Όμ € μ„œλ²„μ— OPTIONS λ©”μ„œλ“œλ‘œ μš”μ²­μ„ λ³΄λƒ…λ‹ˆλ‹€. (이것이 Preflight Requestμž…λ‹ˆλ‹€.)
  2. μ„œλ²„ 응닡: μ„œλ²„λŠ” 이 OPTIONS μš”μ²­μ— λŒ€ν•œ μ‘λ‹΅μœΌλ‘œ β€œμ΄λŸ° λ©”μ„œλ“œμ™€ 이런 헀더λ₯Ό κ°€μ§„ μš”μ²­μ€ 우리 μ„œλ²„κ°€ 받아쀄 수 μžˆμ–΄.” λΌλŠ” 정보λ₯Ό 응닡 헀더에 λ‹΄μ•„ λ³΄λƒ…λ‹ˆλ‹€.
  3. λΈŒλΌμš°μ € 검증: λΈŒλΌμš°μ €λŠ” μ„œλ²„μ˜ 응닡을 보고, μ‹€μ œ 보낼 μš”μ²­μ˜ 쑰건이 μ„œλ²„μ˜ ν—ˆμš© 쑰건과 μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
  4. μ‹€μ œ μš”μ²­ 전솑: 검증에 μ„±κ³΅ν•˜λ©΄, λΈŒλΌμš°μ €λŠ” λΉ„λ‘œμ†Œ μ‹€μ œ PUT μš”μ²­μ„ μ„œλ²„μ— μ „μ†‘ν•©λ‹ˆλ‹€.
μ„œλ²„κ°€ 응닡해야 ν•˜λŠ” ν—€λ”μ˜λ―Έ
Access-Control-Allow-Originμ–΄λ–€ 좜처λ₯Ό ν—ˆμš©ν•  것인가?
Access-Control-Allow-MethodsGET, POST, PUT 쀑 μ–΄λ–€ HTTP λ©”μ„œλ“œλ₯Ό ν—ˆμš©ν•  것인가?
Access-Control-Allow-HeadersContent-Type, Authorization λ“± μ–΄λ–€ 헀더λ₯Ό ν—ˆμš©ν•  것인가?

4. πŸ”‘ κ²°λ‘ : CORSλŠ” μ„œλ²„ μ„€μ • 문제!

CORS 였λ₯˜λŠ” β€œν”„λ‘ νŠΈμ—”λ“œ μ½”λ“œκ°€ 잘λͺ»λ˜μ—ˆλ‹€β€λŠ” μ˜λ―Έκ°€ μ•„λ‹™λ‹ˆλ‹€.

CORS 였λ₯˜λŠ” β€œλ°±μ—”λ“œ μ„œλ²„κ°€ ν”„λ‘ νŠΈμ—”λ“œ μΆœμ²˜λ‘œλΆ€ν„°μ˜ 접근을 ν—ˆμš©ν•˜κ² λ‹€λŠ” λͺ…μ‹œμ μΈ 약속(헀더 μ„€μ •)을 λΈŒλΌμš°μ €μ—κ²Œ 보내지 μ•Šμ•˜λ‹€β€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

infodori1234

Recent Posts

πŸ–₯ NetBIOS over TCP IP NBT μ™„μ „ κ°€μ΄λ“œ

둜컬 λ„€νŠΈμ›Œν¬ ν™˜κ²½μ„ μ‘°κΈˆμ΄λΌλ„ 닀뀄본 μ‚¬λžŒμ΄λΌλ©΄ ν•œ λ²ˆμ―€μ€ λ§ˆμ£ΌμΉ˜λŠ” μ΅μˆ™ν•œ 단어가 μžˆμŠ΅λ‹ˆλ‹€. λ°”λ‘œ NetBIOS와 NBTμž…λ‹ˆλ‹€.…

2κ°œμ›” ago

🏠 JSON Schema: 데이터 μœ νš¨μ„± κ²€μ¦μ˜ ν‘œμ€€ 섀계도 πŸ–₯

μ•ˆλ…•ν•˜μ„Έμš”! ν˜„λŒ€ μ›Ή κ°œλ°œμ—μ„œ 데이터 κ΅ν™˜μ˜ 핡심인 JSON(JavaScript Object Notation)을 λ”μš± κ°•λ ₯ν•˜κ³  μ•ˆμ •μ μœΌλ‘œ λ§Œλ“€μ–΄μ£ΌλŠ” 도ꡬ,…

2κ°œμ›” ago

🏠 ECMAScript 3 ν˜Έν™˜μ„± μ™„μ „ 정리 κ°€μ΄λ“œ

❌ ECMAScript 3(E3)λž€ λ¬΄μ—‡μΌκΉŒ ECMAScript 3λŠ” 1999년에 κ³΅μ‹ν™”λœ μžλ°”μŠ€ν¬λ¦½νŠΈ ν‘œμ€€μ΄λ‹€. μ§€κΈˆ 보면 였래된 기술 κ°™μ§€λ§Œ,…

2κ°œμ›” ago

πŸ–₯ CoffeeScript μ™„μ „ κ°€μ΄λ“œ

CoffeeScriptλŠ” ν•œλ•Œ ν”„λ‘ νŠΈμ—”λ“œ 개발 μƒνƒœκ³„μ—μ„œ 맀우 인기 μžˆμ—ˆλ˜ μ–Έμ–΄μ˜€κ³ , μ§€κΈˆλ„ νŠΉμ • ν”„λ‘œμ νŠΈλ‚˜ λ ˆκ±°μ‹œ μ‹œμŠ€ν…œ, κ°„κ²°ν•œ…

2κ°œμ›” ago

🏠 λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Memory Leak) μ‰½κ²Œ μ΄ν•΄ν•˜κΈ°: πŸ–₯ λ‚­λΉ„λ˜λŠ” μ»΄ν“¨ν„°μ˜ κΈ°μ–΅λ ₯ ❌

ν˜„λŒ€μ μΈ ν”„λ‘œκ·Έλž˜λ° ν™˜κ²½μ—μ„œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Memory Leak)λŠ” μ—¬μ „νžˆ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯ μ €ν•˜μ™€ μΆ©λŒμ„ μΌμœΌν‚€λŠ” μ£Όμš” 원인 쀑…

2κ°œμ›” ago

πŸ–₯️ λΈŒλΌμš°μ € λ Œλ”λ§ κ³Όμ • (CRP) : μ›ΉνŽ˜μ΄μ§€κ°€ λˆˆμ•žμ— λ‚˜νƒ€λ‚˜κΈ°κΉŒμ§€μ˜ λ§ˆλ²•

(Critical Rendering Path, 핡심 λ Œλ”λ§ 경둜 μ™„λ²½ 이해) μ›Ή λΈŒλΌμš°μ €μ— μ£Όμ†Œλ₯Ό μž…λ ₯ν•˜κ³  μ—”ν„°λ₯Ό λˆ„λ₯΄λŠ” μˆœκ°„,…

2κ°œμ›” ago