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 μμ²μ λ³΄λΌ κ²μ΄λ€. μ΄ μ¬μ©μμ λΈλΌμ°μ λ¨μλ μΈμ¦ μ λ³΄κ° μ‘΄μ¬νκΈ° λλ¬Έμ, μ΄κ²μ΄ ν΄λΉ μμ²μ ν¨κ» μ€μ΄μ μ μ‘λλ©΄ μλ²λ μΈμ¦λ μμ²μ΄λΌ μκ°νμ¬ κ°μΈ μ 보λ₯Ό μλ΅ν΄μ€ κ²μ΄λ€. κ·Έλ¬κ³ λλ©΄ κ·Έ κ°μΈ μ 보λ₯Ό ν΄μ»€κ° λΉΌλ릴 μ μκ² λλ€. (μ΄κ²μ΄ λ°λ‘ CSRF 곡격μ΄λ€.)
λ§μ½ 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
Last updated