SOP and CORS
Table of contents
λμΌ μΆμ² μ μ± κ³Ό κ΅μ°¨ μΆμ² 리μμ€ κ³΅μ
νλ‘ νΈμλ κ°λ°μ νλ€ λ³΄λ©΄ νλ²μ κ²½ννκ² λλ CORS μ΄μμ SOPλ₯Ό μ€λͺ νλ μ¬λ¬ κΈμ μ°Έκ³ νμ¬ μ€μν μ λ§ μ‘°κ° λͺ¨μ ν΄λ΄€λ€.
SOP(Same-origin policy, λμΌ μΆμ² μ μ± )
μλ°μ€ν¬λ¦½νΈ μμ§ νμ€ μ€νμ 보μ κ·μΉμΌλ‘ νλμ μΆμ²(Origin)μμ λ‘λλ μμ(λ¬Έμλ μ€ν¬λ¦½νΈ)μ΄ νΈμ€νΈλ νλ‘ν μ½, ν¬νΈλ²νΈκ° μΌμΉνμ§ μλ μμκ³Ό μνΈμμ© νμ§ λͺ»νλλ‘ μμ² λ°μμ μ ννκ³ , λμΌ μΆμ²(Same Origin)μμλ§ μ κ·Όμ΄ κ°λ₯ν μ μ±
λ URLμ Port(λͺ μν κ²½μ°), Protocol, Hostκ° λͺ¨λ κ°μμΌ Same Origin
"scheme/host/port νν(tuple)" νΉμ κ·Έλ₯ "tuple"μ΄λΌκ³ νκΈ°λ νλ€.
Internet Explorer μμΈμ¬ν π
IEλ λμΌ μΆμ² μ μ± μ λ κ°μ§ μ€μν μμΈκ° μκ³ λΉνμ€μ΄λ©° λ€λ₯Έ λΈλΌμ°μ μμλ μ§μνμ§ μλλ€.
μ λ’°ν μ μλ μ¬μ΄νΈ
μμͺ½ λλ©μΈ λͺ¨λκ° λμ λ¨κ³μ 보μ μμ€μ κ°μ§κ³ μλ κ²½μ° λμΌ μΆμ² μ μ½μ μ μ©νμ§ μλλ€.
ν¬νΈ
Internet Explorerλ λμΌ μΆμ² μ μ± κ²μ¬μ ν¬νΈλ₯Ό ν¬ν¨νμ§ μλλ€.
CORS(Cross-Origin Resource Sharing, κ΅μ°¨ μΆμ² 리μμ€ κ³΅μ )
μΉ μ ν리μΌμ΄μ μ μμ μ μΆμ²μ λμΌν 리μμ€λ§ λΆλ¬μ¬ μ μμΌλ©°, λ€λ₯Έ μΆμ²μ 리μμ€λ₯Ό λΆλ¬μ€λ €λ©΄ κ·Έ μΆμ²μμ μ¬λ°λ₯Έ CORS ν€λλ₯Ό ν¬ν¨ν μλ΅μ λ°νν΄μΌ νλ€. μ΄λ μμ€ν μμ€μμ ν λλ©μΈ κ° μμ νΈμΆμ μΉμΈνκ±°λ μ°¨λ¨νλ κ²μ κ²°μ νλ κ²μ΄λ€.
CORSλ μΉνμ΄μ§μμμ μλ°μ€ν¬λ¦½νΈλ₯Ό μ΄μ©νμ¬ XHR(XMLHttpRequest)μ λ€λ₯Έ λλ©μΈμΌλ‘ λ°μ μν¬ μ μλλ‘ ν΄μ£Όλ κΈ°λ₯μ κ°μ§κ³ μκ³ XHR κΈ°λ° cross-origin HTTP μμ²μ μ΄μ©νμ¬ μμμ 곡μ ν΄μΌ νλ λΈλΌμ°μ μ μλ² κ°μ μμ ν κ΅μ°¨ μΆμ² μμ² λ° λ°μ΄ν° μ μ‘μ μ§μνλ€.
CORS ν΄κ²°? CORS μ΄μ ν΄κ²°!
νν 'CORS ν΄κ²°'μ΄λΌκ³ νννκΈ° λλ¬Έμ CORS μμ²΄κ° μ΄μλ μλ¬λΌκ³ μ°©κ°νκΈ° μ¬μ΄ κ² κ°λ€.
CORSλ μλ¬κ° μλκ³ μμ μ 리 νλ― μλ‘ λ€λ₯Έ origin κ°μ 리μμ€λ₯Ό μ λ¬νλ λ°©μμ μ μ΄νλ 맀컀λμ¦μ΄λ€.
CORS μ΄μλ λμΌ μΆμ² μ μ± (SOP)μ μκ±°ν΄ λ€λ₯Έ μΆμ²μ 리μμ€λ₯Ό μ¬μ©νκ±°λ μνΈμμ©μ νμ§ λͺ»νλλ‘ λ§κ³ κ²½κ³ κ° λ°μ νλ κ² μ΄κ³ , μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ κ΅μ°¨ μΆμ² 리μμ€ κ³΅μ (CORS)λ₯Ό μ¬μ©ν΄ μ κ·Όμ νμ© νλλ‘ μ€μ νλ κ²μ΄λ€.
κ·Έλ¬λ 'CORS ν΄κ²°'μ λ λͺ ννκ² νννλ©΄ 'CORS μ΄μ ν΄κ²°'μ΄λΌ ν μ μκ² λ€.
CORS μ΄μ ν΄κ²° λ°©λ²
μ¬λ¬κ°μ§ λ°©λ²μ΄ μμ§λ§ CORS μ΄μλ₯Ό ν΄κ²°νκΈ° μν΄ λ§μ΄ μ¬μ©νλ λ°©λ²μ κ°λ¨νκ² μ 리 ν΄λ΄€λ€.
λμΌ μΆμ²λ‘ μ΄λ
μ λ§ λ¨μνκ² κ°μ μΆμ²λ‘ μ΄λ μν€λ©΄ ν΄κ²°! π€
μλ²μμ Access-Control-allow-origin ν€λ μΆκ°
μλ²μμ λͺ¨λ ν΄λΌμ΄μΈνΈμ μμ²μ λν cross-origin HTTP μμ²μ νκ°νλ Access-Control-Allow-Origin: *
ν€λλ₯Ό μΆκ°νλ©΄ λλ€. νμ§λ§ μ΄λ κ² μ€μ νλ©΄ μ 체 νΈμ€νΈμ λν μμ²μ νμ©νλ κ²μ΄κΈ° λλ¬Έμ 보μμ μ·¨μ½ ν μ μλ€.
Access-Control-Allow-Origin
Access-Control-Allow-Origin
μλ΅ ν€λλ μ΄ μλ΅μ΄ μ£Όμ΄μ§ originμΌλ‘λΆν°μ μμ² μ½λμ 곡μ λ μ μλμ§λ₯Ό λνλΈλ€.
Proxy
Proxy Serverλ ν€λλ₯Ό μΆκ°νκ±°λ μμ²μ νμ©/κ±°λΆνλ μν μ μ€κ°μμ ν΄μ€ μ μκΈ° λλ¬Έμ μλ΅μ μ£Όκ³ λ°μλ νλ‘μ μλ²μμ Access-Control-Allow-Origin: *
ν€λλ₯Ό λ΄μ μλ΅ν΄ μ£Όλ©΄ λλ€.
νλ‘μ νΈλ₯Ό κ°λ° ν λ proxyλ₯Ό μ¬μ©νλ κ²μ νμμ μΈκ±΄ μλμ§λ§, λ°±μλμμ κ°λ°μλ²λ₯Ό μν CORS μ€μ μ μν΄λ λΌμ λΆνμν μ½λλ₯Ό μλ μ μλ€.
webpack-dev-server proxy
νλ‘ νΈμλμμ webpack-dev-server proxy κΈ°λ₯μ μ¬μ©νλ©΄ μλ²μͺ½ μ½λλ₯Ό μμ νμ§ μκ³ ν΄κ²° ν μ μλ€.
sequenceDiagramBrowser->>+WebPackDevSever: μμ²WebPackDevSever->Proxy:μμ²Proxy->>Server: μμ²Server-->>Proxy: μλ΅Proxy-->WebPackDevSever: μλ΅WebPackDevSever-->>-Browser: μλ΅
webpack-dev-serverμ νλ‘μλ₯Ό μ¬μ©νλ©΄, λΈλΌμ°μ μμ APIλ₯Ό μμ² ν λ λ°±μλ μλ²μ μ§μ μ μΌλ‘ μμ²μ νμ§ μκ³ , νμ¬ κ°λ°μλ²μ μ£Όμλ‘ μμ²μ νκ² λλ€. ν΄λΉ μμ²μ λ°μ κ·Έλλ‘ λ°±μλ μλ²λ‘ μ λ¬, λ°±μλ μλ²μμ μλ΅ν λ΄μ©μ λ€μ λΈλΌμ°μ μͺ½μΌλ‘ λ°ννλ€.
CRA(create-react-app)λ‘ μμ±ν νλ‘μ νΈλΌλ©΄ package.jsonμ proxy κ°μ μ€μ νμ¬ κ°λ¨νκ² webpack-dev-server proxy κΈ°λ₯μ νμ±ν ν μ μλ€.
λ°°ν¬ ν λλ
APIκ° λμΌν λλ©μΈμμ μ 곡μ΄λλ κ²½μ°λ λ¬Έμ μμ§λ§ APIμ λλ©μΈκ³Ό μλΉμ€μ λλ©μΈμ΄ λ€λ₯΄λ€λ©΄ axiosμ κΈλ‘λ² baseURLμ μ€μ νλ©΄ λλ€.
axios.defaults.baseURL = process.env.NODE_ENV === 'development' ? '/' : '{API λλ©μΈ}';
process.env.NODE_ENV
λ νμ¬ νκ²½μ΄ νλ‘λμ μΈμ§ κ°λ°λͺ¨λμΈμ§ μ μ μλ κ° (μ°Έκ³ )
κ°λ° νκ²½μμ νλ‘μ μλ² μͺ½μΌλ‘ μμ²νκ³ , νλ‘λμ μμ μ€μ API μλ²λ‘ μμ²μ νκ² λλ€.
(λΆλ‘) CORS κ΄λ ¨ 보μ μ΄μ
CORSμ κ·Όλ³Έμ μΈ λ³΄μλ¬Έμ λ XHRμ λ€λ₯Έ λλ©μΈμΌλ‘ λ°μμν¬ λ, μ¬μ©μμκ² νκ° μμ²μ λ°μ§ μλλ€λ κ²μ΄λ€.
μ΄λ¬ν λ¬Έμ λ μ¬μ©μμ μΈμ
μ μ€μ©ν μ κ·Όμ μ΄μ κ΄λ ¨λ 보μ λ¬Έμ λ₯Ό μΌκΈ°ν μ μλ€. 곡격μκ° μ¬μ©μμ μΈμ
μ μ€μ©ν μ μκ² λλ€λ κ²μ μ κ·Όμ μ΄λ₯Ό μ°ννμ¬ νκ°λμ§ μμ 리μμ€μ μ κ·Όν μ μλ€λ μλ―Έμ΄λ€.
μ κ·Όμ μ΄ μ°ν
μ¬μ©μκ° μν΄μλ λ΄λΆ λ€νΈμν¬μ μ‘΄μ¬νλ μΉμ¬μ΄νΈκ° βAccess-Control-AllowOriginβ μλ΅ ν€λλ₯Ό μλͺ» μ μνμ κ²½μ° κ³΅κ²©μλ μΈλΆμμ μ§μ μ κ·Όν μ μλ λ΄λΆ λ€νΈ μν¬μ μΉμ¬μ΄νΈμ μ κ·Όν μ μλ€.
CORSμ Web Socketμ μ΄μ©ν μ격 μ
XHRκ³Ό Web Socket κΈ°μ μ μ΄μ©νλ©΄ μ¬μ©μμ λΈλΌμ°μ μΈμ μ νμ·¨νκ³ νλμ μ μ΄ν μ μλ€. λνμ μΈ μλ‘ μΈμ νμ΄μ¬νΉ κ³΅κ²©μ΄ μλ€.
CORSμ Web Socketμ μ΄μ©ν μΉ κΈ°λ°
CORSμ Web Socket κΈ°μ μ μ΄μ©νλ©΄ μ¬μ©μμ λΈλΌμ°μ λ€μ μ μ΄νμ¬ λ€μν μ 보λ₯Ό μ μ§νκ±°λ λͺ λ Ήμ λ΄λ¦΄ μ μλ€.
CORSμ Web Workerλ₯Ό μ΄μ©ν DDoS 곡격
CORSμ Web Workerλ₯Ό μ΄μ©νλ©΄ λ³΄λ€ ν¨κ³Όμ μΌλ‘ DDoS 곡격μ μνν μ μλ€.
μΆμ²: HTML5 μ κ· μΉμλΉμ€ νκ²½μμμ 보μ μ΄μ - νκ΅μΈν°λ·μ§ν₯μ
TL ; DR
- SOPλ μΆμ²κ° λ€λ₯Έ μμκ³Ό μνΈμμ© νμ§ λͺ»νλλ‘ μ ννλ€.
SOPλ μ μ¬μ μΌλ‘ ν΄λ‘μΈ μ μλ λ€λ₯Έ μΆμ²μμ κ°μ Έμ¨ 리μμ€μ μνΈμμ©νλ κ²μ μ ννκ³ λΆλ¦¬ν¨μΌλ‘μ¨ κ°λ₯ν 곡격 κ²½λ‘λ₯Ό μ€μ¬ μ€λ€.
- CORSλ₯Ό νμ© νλ €λ©΄ μλ²μμ cross-origin HTTP μμ²μ νκ°νλ ν€λλ₯Ό μ€μ ν΄μ£Όμ΄μΌ νλ€.
CORSλ μΆμ²(λλ©μΈ, ν¬νΈ, νλ‘ν μ½)κ° λ€λ₯Έ μλ²μ μμμ μ κ·Όν μ μλ κΆνμ λΆμ¬νλλ‘ λΈλΌμ°μ μ μμ²νλ 맀컀λμ¦, 리μμ€κ° μμ μ μΆμ²μ λ€λ₯Ό λ cross-origin HTTP μμ²μ μ€ννλ€.
- CORS μ΄μλ SOPμ μκ±°ν΄ λ°μνλ€.
SOPμ μκ±°ν΄ λ€λ₯Έ μΆμ²μ 리μμ€μ μνΈμμ© νλ κ²μ΄ μ°¨λ¨λλλ° CORSλ₯Ό μ€μ ν¨μΌλ‘μ¨ μνΈμμ©μ΄ κ°λ₯ ν΄μ§λ€.
- ν΄λΌμ΄μΈνΈ μ¬μ΄λ κ°λ° κ³Όμ μμλ νλ‘μλ₯Ό μ¬μ©ν΄ ν΄κ²° κ°λ₯νλ€.
λ°±μλ κ°λ°μμκ² μμ²ν΄ μλ²μμ μ€μ ν΄λ λμ§λ§, ν΄λΌμ΄μΈνΈμ μλ² μ¬μ΄ νλ‘μλ₯Ό ν΅ν΄ Access-Control-Allow-Origin ν€λλ₯Ό μ€μ ν μ μλ€. μ΄λ κ² νλ©΄ λ°±μλμμ λ°λ‘ μ€μ ν νμκ° μμ΄μ§λ€!
λ μ€ μμ½
SOPλ κ°μ originμ κ°μ§ 리μμ€λ§ μ κ·Όμ΄ κ°λ₯νλλ‘ μ ννλ€.
CORSλ λλ©μΈ λλ ν¬νΈκ° μλ‘ λ€λ₯Έ origin κ°μ 리μμ€λ₯Ό μ λ¬νλ λ°©μμ μ μ΄νλ 맀컀λμ¦μ΄λ€.
reference
κ΅μ°¨ μΆμ² 리μμ€ κ³΅μ (CORS) - HTTP | MDN
Access-Control-Allow-Origin - HTTP | MDN
λμΌ μΆμ² μ μ± - μΉ λ³΄μ | MDN
CORSμ λν κ°λ¨ν κ³ μ°° | Velog
CORS μ ν΄κ²°λ°©λ² (express, proxy) | Velog
CORS μ Webpack DevServer Proxy Β· GitBook
ajax - What are the security risks of setting Access-Control-Allow-Origin? | Stack Overflow
HTML5 μ κ· μΉμλΉμ€ νκ²½μμμ 보μ μ΄μ - νκ΅μΈν°λ·μ§ν₯μ