CORS

RHUK2Β·2021λ…„ 6μ›” 19일
0

Network

λͺ©λ‘ 보기
2/6

πŸ“’ 22/05/18 볡슡


πŸ“š Reference


MDN, https://developer.mozilla.org/ko/docs/Web/HTTP/CORS
MDN, https://developer.mozilla.org/ko/docs/Web/Security/Same-origin_policy
Evans Library, https://evan-moon.github.io/2020/05/21/about-cors/
λ²¨λ‘œνΌνŠΈμ™€ ν•¨κ»˜ν•˜λŠ” λͺ¨λ˜ λ¦¬μ•‘νŠΈ, https://react.vlpt.us/redux-middleware/09-cors-and-proxy.html

μ°Έκ³  μ‚¬μ΄νŠΈμ— λ‚΄μš©μ„ 개인적으둜 λ³΅μŠ΅ν•˜κΈ° νŽΈν•˜λ„λ‘ μž¬κ΅¬μ„±ν•œ κΈ€μž…λ‹ˆλ‹€.
μžμ„Έν•œ μ„€λͺ…은 μ°Έκ³  μ‚¬μ΄νŠΈλ₯Ό μ‚΄νŽ΄λ³΄μ‹œκΈ° λ°”λžλ‹ˆλ‹€.


SOP


CORSλ₯Ό μ•Œμ•„λ³΄κΈ° 전에 SOP κ°œλ…λΆ€ν„° μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. SOPλŠ” same-origin policy의 μ•½μžλ‘œ 동일 좜처 정책을 λœ»ν•©λ‹ˆλ‹€. μ„œλ²„ μž…μž₯μ—μ„œ 같은 μΆœμ²˜μ— λŒ€ν•œ HTTP μš”μ²­λ§Œμ„ ν—ˆλ½ν•˜λŠ” μ •μ±…μœΌλ‘œ, μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ€‘μš”ν•œ λ³΄μ•ˆ λͺ¨λΈμž…λ‹ˆλ‹€.

동일 μΆœμ²˜λΌλŠ” 말은 ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„μ˜ URL의 ν”„λ‘œν† μ½œ, 호슀트, ν¬νŠΈκ°€ λͺ¨λ‘ 동일해야함을 μ˜λ―Έν•©λ‹ˆλ‹€.

보톡 μžλ°”μŠ€ν¬λ¦½νŠΈμ— μ˜ν•œ 데이터 접근을 μ œν•œν•˜λ©°, HTML νƒœκ·Έλ₯Ό ν†΅ν•œ 이미지, CSS, Script μš”μ²­μ€ μ œν•œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.ν•˜μ§€λ§Œ μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜λ‹€λ³΄λ©΄ μ™ΈλΆ€ λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•΄μ•Όν•  일이 맀우 많기 λ•Œλ¬Έμ—, 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ‚˜μ˜¨ 정책이 CORSμž…λ‹ˆλ‹€.


CORSλž€?


Cross-Origin Resource Sharing의 μ•½μžλ‘œ λ²ˆμ—­ν•˜λ©΄ ꡐ차 좜처 λ¦¬μ†ŒμŠ€ 곡유 정책이닀. μΆœμ²˜κ°€ λ‹€λ₯Έ 곳의 μžμ›μ— μ ‘κ·Όν•  수 μžˆλ„λ‘ λΈŒλΌμš°μ €μ—κ²Œ κΆŒν•œμ„ λΆ€μ—¬ν•˜λŠ” μ •μ±…μž…λ‹ˆλ‹€.

λ„€μ΄λ²„μ—μ„œ 카카였 μ„œλ²„μ˜ μžμ›μ„ λ°›μ•„μ˜€λ €λ©΄ SOP에 μ˜ν•΄ μ œν•œλ©λ‹ˆλ‹€. μ΄λ ‡κ²Œ λ‹€λ₯Έ 좜처의 λ¦¬μ†ŒμŠ€λ₯Ό 뢈러였렀면 κ·Έ 좜처의 μ„œλ²„μ—μ„œ λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•˜λŠ” 좜처λ₯Ό ν—ˆμš©ν•˜λŠ” CORS 응닡 헀더λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ μ„€μ •ν•΄μ•Όν•©λ‹ˆλ‹€.


CORSκ°€ λ™μž‘ν•˜λŠ” 3가지 μ‹œλ‚˜λ¦¬μ˜€


CORSκ°€ λ™μž‘ν•˜λŠ” 3가지 μ‹œλ‚˜λ¦¬μ˜€λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

πŸ“Œ λ‹¨μˆœ μš”μ²­
πŸ“Œ ν”„λ¦¬ν”ŒλΌμ΄νŠΈ(preflight) μš”μ²­
πŸ“Œ 인증정보(credentialed)λ₯Ό ν¬ν•¨ν•œ μš”μ²­

λ‹¨μˆœ μš”μ²­

λ‹¨μˆœ μš”μ²­μ€ ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ 헀더에 Origin(좜처)에 λŒ€ν•œ 정보λ₯Ό λ‹΄μ•„ μš”μ²­μ„ 보내면, μ„œλ²„μ—μ„œ Access-Control-Allow-Origin 헀더에 접근을 ν—ˆμš©ν•  Origin에 정보λ₯Ό λ‹΄μ•„ μ‘λ‹΅ν•˜κ³ , λΈŒλΌμš°μ €κ°€ μš”μ²­ν•œ Originκ³Ό ν—ˆμš©λœ Origin의 비ꡐλ₯Ό 톡해 μš”μ²­ν•œ 응닡을 μ œκ³΅ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

ν”„λ¦¬ν”ŒλΌμ΄νŠΈ μš”μ²­

ν”„λ¦¬ν”ŒλΌμ΄νŠΈ μš”μ²­μ€ 일반적으둜 μš°λ¦¬κ°€ μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  λ•Œ 자주 λ§ˆμ£ΌμΉ˜λŠ” μ‹œλ‚˜λ¦¬μ˜€μž…λ‹ˆλ‹€. 이 μ‹œλ‚˜λ¦¬μ˜€μ— ν•΄λ‹Ήν•˜λŠ” 상황일 λ•Œ λΈŒλΌμš°μ €λŠ” μš”μ²­μ„ ν•œλ²ˆμ— 보내지 μ•Šκ³  μ˜ˆλΉ„ μš”μ²­κ³Ό λ³Έ μš”μ²­μœΌλ‘œ λ‚˜λˆ„μ–΄μ„œ μ„œλ²„λ‘œ μ „μ†‘ν•©λ‹ˆλ‹€.

μ΄λ•Œ λ³΄λ‚΄λŠ” μ˜ˆλΉ„ μš”μ²­μ„ ν”„λ¦¬ν”ŒλΌμ΄νŠΈλΌκ³  λΆ€λ₯΄λ©°, 이 μš”μ²­μ—λŠ” HTTP λ©”μ„œλ“œ 쀑 OPTIONS λ©”μ„œλ“œκ°€ μ‚¬μš©λ©λ‹ˆλ‹€. μ˜ˆλΉ„ μš”μ²­μ˜ 역할은 λ³Έ μš”μ²­μ„ 보내기 전에 λΈŒλΌμš°μ € 슀슀둜 이 μš”μ²­μ„ λ³΄λ‚΄λŠ” 것이 μ•ˆμ „ν•œμ§€ ν™•μΈν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€.

μ˜ˆλΉ„ μš”μ²­μ— λŒ€ν•œ μ‘λ‹΅μœΌλ‘œ μ„œλ²„κ°€ μ–΄λ–€ 것듀을 ν—ˆμš©ν•˜κ³ , κΈˆμ§€ν•˜κ³  μžˆλŠ”μ§€μ— λŒ€ν•œ 정보λ₯Ό λ³΄λƒ…λ‹ˆλ‹€. 이후 μžμ‹ μ΄ 보낸 μ˜ˆλΉ„ μš”μ²­κ³Ό μ„œλ²„κ°€ 응닡에 λ‹΄μ•„μ€€ ν—ˆμš© 정책을 λΉ„κ΅ν•œ ν›„, 이 μš”μ²­μ„ λ³΄λ‚΄λŠ” 것이 μ•ˆμ „ν•˜λ‹€κ³  νŒλ‹¨λ˜λ©΄ λ³Έ μš”μ²­μ„ λ³΄λƒ…λ‹ˆλ‹€. 이후 μ„œλ²„κ°€ λ³Έ μš”μ²­μ— λŒ€ν•œ 응닡을 ν•˜κ²Œ 되면 λΈŒλΌμš°μ €λŠ” μ΅œμ’…μ μœΌλ‘œ 이 응닡 데이터λ₯Ό μžλ°”μŠ€ν¬λ¦½νŠΈμ—κ²Œ λ„˜κ²¨μ€λ‹ˆλ‹€.

인증정보λ₯Ό ν¬ν•¨ν•œ μš”μ²­

인증정보λ₯Ό ν¬ν•¨ν•œ μš”μ²­μ€ μ’€ 더 λ³΄μ•ˆμ„ κ°•ν™”ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. 기본적으둜 λΈŒλΌμš°μ €κ°€ μ œκ³΅ν•˜λŠ” 비동기 λ¦¬μ†ŒμŠ€ μš”μ²­ APIλŠ” λ³„λ„μ˜ μ˜΅μ…˜ 없이 μΏ ν‚€ μ •λ³΄λ‚˜ 인증과 κ΄€λ ¨λœ 헀더λ₯Ό ν•¨λΆ€λ‘œ μš”μ²­μ— 담지 μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λ•Œ μš”μ²­μ— 인증과 κ΄€λ ¨λœ 정보λ₯Ό 담을 수 있게 ν•΄μ£ΌλŠ” μ˜΅μ…˜μ΄ credentials μ˜΅μ…˜μž…λ‹ˆλ‹€.

이 μ˜΅μ…˜μ—λŠ” 3가지 값을 μ‚¬μš©ν•  수 있으며, λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

same-origin(κΈ°λ³Έκ°’)
같은 좜처 κ°„ μš”μ²­μ—λ§Œ 인증 정보λ₯Ό 담을 수 μžˆμŠ΅λ‹ˆλ‹€.

include
λͺ¨λ“  μš”μ²­μ— 정보λ₯Ό 담을 수 μžˆμŠ΅λ‹ˆλ‹€.

omit
λͺ¨λ“  μš”μ²­μ— 인증 정보λ₯Ό 담지 μ•ŠμŠ΅λ‹ˆλ‹€.

λ§Œμ•½ μš°λ¦¬κ°€ same-originμ΄λ‚˜ include와 같은 μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ λ¦¬μ†ŒμŠ€ μš”μ²­μ— 인증 정보가 ν¬ν•¨λœλ‹€λ©΄, λΈŒλΌμš°μ €λŠ” λ‹€λ₯Έ 좜처의 λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•  λ•Œ λ‹¨μˆœνžˆ Access-Control-Allow-Origin만 ν™•μΈν•˜λŠ” 것이 μ•„λ‹ˆλΌ 두 가지 쑰건을 더 κ²€μ‚¬ν•˜κ²Œ λ©λ‹ˆλ‹€.

πŸ“Œ Access-Control-Allow-Originμ—λŠ” *λ₯Ό μ‚¬μš©ν•  수 μ—†μœΌλ©°, λͺ…μ‹œμ μΈ URL이어야 ν•©λ‹ˆλ‹€.
πŸ“Œ 응닡 ν—€λ”μ—λŠ” λ°˜λ“œμ‹œ Access-Control-Allow-Credentials: trueκ°€ μ‘΄μž¬ν•΄μ•Όν•©λ‹ˆλ‹€.

profile
생각 많이 ν•˜μ§€ μ•ŠκΈ° 😎

0개의 λŒ“κΈ€