[도전 기술!] CORS(ꡐ차 좜처 μžμ› 곡유) μ„€μ •

2021. 8. 22. 08:00ㆍFront-End μž‘μ—…μ‹€/기타 μ°Έκ³  자료

728x90
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”? μ£Όλ‹ˆν•˜λž‘ μž…λ‹ˆλ‹€.

λ³Έ λ‚΄μš©μ€ μ£Όλ‹ˆν•˜λž‘μ΄ Web 개발 ν”„λ‘œμ νŠΈλ₯Ό ν•˜λ©΄μ„œ λ„μ „ν–ˆλ˜ κΈ°μˆ λ“€μ— λŒ€ν•œ λ‚΄μš©μ„ μ •λ¦¬ν•˜λŠ” κ³³ μž…λ‹ˆλ‹€!

이 글은 ν•¨κ»˜ ν”„λ‘œμ νŠΈ ν–ˆλ˜ Front End κΏˆλ‚˜λ¬΄ Crewκ°€ μž‘μ„±ν•œ κ²ƒμ΄μ—μš”.

μ£Όλ‹ˆν•˜λž‘μ€ Back End κ°œλ°œμ„ λ§‘μ•˜μ—ˆλ‹΅λ‹ˆλ‹€!




 

 

ν΄λΌμ΄μ–ΈνŠΈλŠ” λ¦¬μ•‘νŠΈ, μ„œλ²„λŠ” μŠ€ν”„λ§ λΆ€νŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ κ°œλ°œμ„ μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

μœ„μ™€ 같은 개발 μƒν™©μ—μ„œ Axiosλ₯Ό μ‚¬μš©ν•œ API 톡신을 μ§„ν–‰ν•˜λ € ν•˜μž CORS μ—λŸ¬κ°€ λ°œμƒν–ˆκ³  이λ₯Ό ν•΄κ²°ν•œ 과정을 μ†Œκ°œ ν•˜λ € ν•˜λŠ” κ²ƒμ΄μ—μš”.

 

CORS μ—λŸ¬λŠ” μ™œ λ°œμƒν•˜λŠ”κ°€?

ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμ„ ν•˜λ©΄μ„œ μ„œλ²„μ™€ 톡신을 진행할 λ•Œ μœ„μ™€ 같은 μ—λŸ¬λ₯Ό μ‹¬μ‹¬μΉ˜ μ•Šκ²Œ λ°œκ²¬ν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή μ—λŸ¬λŠ” CORS 정책을 μœ„λ°˜ν•  λ•Œ λ°œμƒν•˜κ²Œ λ˜λŠ”λ°μš”.

λ¨Όμ € CORS의 기본적인 λ‚΄μš©μ— λŒ€ν•΄μ„œ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

CORS

CORSλŠ” μΆ”κ°€ HTTP 헀더λ₯Ό μ‚¬μš©ν•˜μ—¬, ν•œ μΆœμ²˜μ—μ„œ μ‹€ν–‰ 쀑인 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ‹€λ₯Έ 좜처의 μ„ νƒν•œ μžμ›μ— μ ‘κ·Όν•  수 μžˆλŠ” κΆŒν•œμ„ λΆ€μ—¬ν•˜λ„λ‘ λΈŒλΌμš°μ €μ— μ•Œλ €μ£ΌλŠ” μ²΄μ œμž…λ‹ˆλ‹€.

μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ λ¦¬μ†ŒμŠ€κ°€ μžμ‹ μ˜ 좜처(도메인, ν”„λ‘œν† μ½œ, 포트)와 λ‹€λ₯Ό λ•Œ ꡐ차 좜처 HTTP μš”μ²­μ„ μ‹€ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

동일 좜처 μ •μ±…

λ³΄μ•ˆ μƒμ˜ 이유둜, λΈŒλΌμš°μ €λŠ” μŠ€ν¬λ¦½νŠΈμ—μ„œ μ‹œμž‘ν•œ ꡐ차 좜처 HTTP μš”μ²­μ„ μ œν•œν•©λ‹ˆλ‹€. μ΄λŠ” 동일 좜처 μ •μ±…λ•Œλ¬ΈμΈλ°μš”.

μ–΄λ–€ μΆœμ²˜μ—μ„œ 뢈러온 λ¬Έμ„œλ‚˜ μŠ€ν¬λ¦½νŠΈκ°€ λ‹€λ₯Έ μΆœμ²˜μ—μ„œ κ°€μ Έμ˜¨ λ¦¬μ†ŒμŠ€μ™€ μƒν˜Έμž‘μš©ν•˜λŠ” 것을 μ œν•œν•˜λŠ” μ€‘μš”ν•œ λ³΄μ•ˆ λ°©μ‹μž…λ‹ˆλ‹€.

ν•΄λ‹Ή 정책을 톡해 잠재적으둜 ν•΄λ‘œμšΈ 수 μžˆλŠ” λ¬Έμ„œλ₯Ό λΆ„λ¦¬ν•¨μœΌλ‘œμ¨ 곡격받을 수 μžˆλŠ” 경둜λ₯Ό 쀄일 수 있겠죠?

 

λ°˜μ‘ν˜•

 

μ—λŸ¬ 원인

즉, ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„μ˜ μΆœμ²˜κ°€ λ™μΌν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή μ—λŸ¬κ°€ λ°œμƒν•œ κ²ƒμž…λ‹ˆλ‹€.

μ €ν¬λŠ” κ°œλ°œν™˜κ²½μ—μ„œ 포트λ₯Ό λ”°λ‘œ μ„€μ •ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„λŠ” 각각 κΈ°λ³Έ 포트인 3000 κ³Ό 8080을 μ‚¬μš©ν•˜κ³  μžˆμ—ˆκ³  μ΄λŠ” 동일 좜처 정책에 λΆ€ν•©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

ν•΄κ²° 방법

CORS 정책을 확인해가며 μ €ν¬λŠ” μ—λŸ¬ λ°œμƒ 이유λ₯Ό κΉ¨λ‹¬μ•˜μŠ΅λ‹ˆλ‹€. 이제 μ—λŸ¬λ₯Ό ν•΄κ²°ν•΄μ•Ό 될 μ°¨λ‘€κ΅°μš”.

μ €ν¬λŠ” μ—λŸ¬λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λͺ‡ κ°€μ§€μ˜ 방법을 μ°Ύμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

 

HTTP 응닡 헀더

첫 번째둜 HTTP 응닡 헀더λ₯Ό μ„€μ •ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

Axiosλ₯Ό μ‚¬μš©ν•œ API ν†΅μ‹ μ˜ κΈ°λ³Έ μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

axios.post('uri', { postData } ) 
	.then((res) => {}) 
    .catch((err) => {})

 

μœ„μ˜ μ½”λ“œμ—μ„œ HTTP 응닡 헀더에 CORSλ₯Ό μ„€μ •ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

axios.post('uri', { headers: { 
	'Access-Control-Allow-Origin': 'ν—ˆμš©ν•˜κ³ μž ν•˜λŠ” 도메인', 
    }, { postData } ) 
    .then((res) => {}) 
    .catch((err) => {})

μœ„μ™€ 같은 λ°©λ²•μœΌλ‘œ CORS μ—λŸ¬λ₯Ό ν•΄κ²°ν•  μˆ˜λŠ” μžˆμ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ €ν¬λŠ” API 톡신을 ν•  λ•Œλ§ˆλ‹€ 맀번 axios νŒŒλΌλ―Έν„°λ‘œ HTTP 응닡 ν—€λ”μ˜ 섀정을 μž‘μ„±ν•΄μ•Ό λœλ‹€λŠ” 점을 쒋지 μ•Šκ²Œ μƒκ°ν–ˆμœΌλ©° 이λ₯Ό 뢄리해 관리할 방법을 μ°Ύμ•„λ³΄κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

 

ν”„λ‘μ‹œ(Proxy) μ„€μ •

두 번째둜 찾은 방법은 ν”„λ‘μ‹œ μ„€μ •μž…λ‹ˆλ‹€.

ν”„λ‘μ‹œ

ν”„λ‘μ‹œλŠ” ν”„λ‘œν† μ½œμ— μžˆμ–΄μ„œ λŒ€λ¦¬ 응닡 μ΄λΌλŠ” κ°œλ…μœΌλ‘œ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘μ‹œ μ„œλ²„μ˜ μ—­ν• λ‘œ

  1. 인터넷 츑이 μœ μ €μ˜ μ‹€μ œ IPλ₯Ό μ•Œ 수 없도둝 ν•©λ‹ˆλ‹€.
  2. ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ„œλ²„μ— 데이터λ₯Ό 보낼 λ•Œ ν”„λ‘μ‹œ μ„œλ²„μ—μ„œ 데이터λ₯Ό λ°”κΎΈκ³  μ„œλ²„ 츑에 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ €ν¬λŠ” ν”„λ‘μ‹œ μ„œλ²„λ₯Ό 톡해 CORS μ—λŸ¬μ™€ μ‰¬μš΄ μ½”λ“œ μž‘μ„± 및 μœ μ§€ λ³΄μˆ˜κ°€ κ°€λŠ₯ν•  것이라 μƒκ°ν–ˆκ³  λ°”λ‘œ 저희 개발 ν™˜κ²½μ— μ μš©ν•˜κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€!

proxy: { '/api/': { 
	target: '<http://localhost:8080>', 
    changeOrigin: true, 
    }, 
},

 

μ €ν¬λŠ” create-react-app을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  μ›ΉνŒ© 섀정을 ν–ˆκΈ° λ•Œλ¬Έμ— proxy 섀정을 μœ„μ™€ 같이 μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

μ„œλ²„μ—μ„œ λͺ¨λ“  REST API의 URI섀계λ₯Ό /api둜 μ‹œμž‘ν•˜κ²Œλ” λ³€κ²½ν•˜μ˜€κ³ , ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ /api둜 μ‹œμž‘ν•˜λŠ” λͺ¨λ“  톡신에 ν”„λ‘μ‹œ 섀정을 ν•΄μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.

 

κ²°λ‘ 

CORS μ—λŸ¬λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 방법을 μ°Ύμ•„λ‚΄λ©΄μ„œ μ—¬λŸ¬κ°€μ§€ 방법도 μ•Œκ²Œ λ˜μ—ˆκ³  결과적으둜 ν”„λ‘μ‹œλ₯Ό μ‚¬μš©ν•΄ κΉ”λ”ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμ–΄ λ§Œμ‘±λ„κ°€ 높은 μž‘μ—…μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

첫 번째둜 μ„œλ²„μ™€ API 톡신을 진행할 λ•Œ 이메일 인증 APIλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ μ„œλ²„μ— μΏ ν‚€ 전달이 μ œλŒ€λ‘œ 이루어지지 μ•ŠλŠ” ν˜„μƒμ΄ λ°œμƒν•΄μ„œ μ•Œκ²Œλœ μ΄μŠˆμ˜€λŠ”λ°μš”. (ν•΄λ‹Ή μΏ ν‚€ 정책도 λ‹€λ£° μ˜ˆμ •μž…λ‹ˆλ‹€! 🧐)

λ§Œμ•½ get λ©”μ†Œλ“œλ₯Ό λ¨Όμ € μž‘μ—…ν–ˆλ‹€λ©΄ 개발 쀑간에 ν•΄λ‹Ή 이슈λ₯Ό μ•Œκ²Œ λ˜μ—ˆμ„ν…λ° (맀도 λ¨Όμ € λ§žλŠ”κ²Œ λ‚«λ‹€κ³ ,,, πŸ˜…) 미리 μ•Œμ•„μ„œ 닀행이라고 μƒκ°ν•©λ‹ˆλ‹€.

728x90
λ°˜μ‘ν˜•