November 17, 2020
μ λ² μ£Ό λΆν° μκΎΈ cors cors μ΄μΌκΈ°κ° λμμ κ·Έλ₯ λκ° μ΄ν΄νκ³ λμ΄κ°λλ° μμ£Ό μ μ°μ°ν λλμ΄ λ€μ΄ μ€λ λλ¦ νμ΅μ λ€μ ν΄λ³΄κ³ λΈλ‘κΉ μ νλ€.
μΌλ¨ CORS λ Cross-Origin-Resource-Sharing μ μ½μμ΄λ€.
μλ‘ λ€λ₯Έ origin κ°μ 리μμ€λ₯Ό 곡μ νκ² νλ λ°©μμ΄λ©° μΆκ°μ μΈ HTTP ν€λλ₯Ό μ΄μ©ν΄μ,
λΈλΌμ°μ κ° μλ°μ μΌλ‘ μ΄ λΈλΌμ°μ μ μ΄ν리μΌμ΄μ μ μ¬μ©νλ μ μ λ€μ 보νΈνκΈ° μν μ μ± μ΄λΌκ³ νλ€.
λΈλΌμ°μ λ§μ μλ°μ μΈ λ³΄μ μ‘°μΉ.
κ·Όλ° μ΄λ κ² μ κ³ λλΌλ¦¬κ° μλ€.
μ§κΈ
맀μ°
맀μ°
μ°μ°νλ€.
μλ λ¦¬μ¦ μμ μλ μλ²μμ λ΄λ €λ°μ client λ‘λ§ ν΅μ μ νλ€κ³ νλ€.
λ€μμ μ¬μ©μκ° μλ²μμ λ΄λ €μ€ μ체 ν΄λΌμ΄μΈνΈλ‘λ§ ν΅μ μ νλ€.
μ΄ λ μλ² μ μ₯μμλ ν΄λΌμ΄μΈνΈκ° μν΄ λ μμ¬μ μ¬μ§κ° μλ€. Same - Origin μ΄λ€.
μλ² λ΄ μ체 ν΄λΌμ΄μΈνΈλ₯Ό κ°μ§κ³ ν΅μ νκΈ°μ κ°λ³ ν΄λΌμ΄μΈνΈμ μμ²μ μλ² μ μ₯μμ λ§μ νμκ° μμλ€.
Single Page Application μ λ±μ₯μΌλ‘ μ¬λ¬ κ³³μ μλ μμ (resourse) μ νμ©ν νμκ° μκ²Όλ€.
μ체 μλ²μ ν΄λΌμ΄μΈνΈ λΏλ§ μλλΌ ν νλ«νΌμ API λ₯Ό μ°κ² λ μΌμ΄ λ§μμ‘λ€.
μ§κΈ μ΄ λΈλ‘κ·Έ λ§ νλλΌλ μ»€νΌ νμ κ°μ κΈ°λΆλ facebook μ΄λ λ±μ 리μμ€ λ±μ μμ μμ¬λ‘ λ΄μ₯μν¬ μ μμ§ μμκ°?
κ·Έλμ μ΄μ λ Same Origin μ΄ μλλΌ Cross Origin μμ²μ ν΄μΌ νλ€.
κ·Έλμ μ΄μ Cross origin μμ 리μμ€ (μλ²μμ) λ₯Ό μμ²νμ¬ μ¬μ©νκ² λλλ° (κ΅¬κΈ μ§λ©μΌλ‘ κΉνλΈ κ°μ νλ λ±μ)..
보μμμ μ΄μ λ‘ λΈλΌμ°μ μμμ ν¬λ‘μ€ λλ©μΈ μμ²μ κΈ°λ³Έμ μΌλ‘ μ νλμ΄ μλ€κ³ νλ€.
μ΄μ λ λ§μ½ μλ²κ° μμ²μ μ΄μ΄ λμΌλ©΄ ν΄λΌμ΄μΈνΈκ° μλ²μ μ΄λ ν 리μμ€λ₯Ό μμ±ν μ§ νμΈμ ν μ μμ΄μ λΌκ³ νλ€.
κ·Έλ°λ° κ°λ°μλ€μ΄ λΈλΌμ°μ λ²€λμ¬λ€μ βμΉ app κ³ λνβ λ₯Ό μν΄ κ°μ μμ²μ νλ€κ³ νλ€.
κ·Έλμ μ΄μ λ βμλ²κ° Allow ν λ²μβ λ΄μμ cross origin μμ²μ νμ©νκ² λμλ€κ³ νλ€.
κ³ λ‘ μ΄μ λͺ¨λ λλ©μΈμμ ν΄λΉ μλ²λ‘ CORS μμ²μ ν μ μκ² λμλ€. (νμ© μ¬λΆλ ν΄λΉ μλ² λ»λλ‘)
μλλ μλ² μ μ₯μμ λ°λΌλ³Έ νμ© μ건μ΄λ€.
const defaultCorsHeaders = {
'access-control-allow-origin': '*', // λͺ¨λ λλ©μΈμ νμ© (μμΌλμΉ΄λ)
'access-control-allow-methods': 'GET, POST, PUT, DELETE, OPTIONS', // νμ©κ°λ₯ν λ©μλλ€
'access-control-allow-headers': 'content-type, accept', // Header μ μΈ μ μλ νμ
'access-control-max-age': 10, // Preflight request λ 10μ΄κΉμ§ νμ© λλ€.
}
μ΄λ¬ν 쑰건λ€μ κ°μΆ request λ€μ ν¬λ‘μ€ λλ©μΈμμ 리μμ€ μμ²μ΄ κ°λ₯νλλ‘ νμ©ν΄ μ£Όκ² λ€ λΌλ μ€μ μ½λ μ΄λ€.
domain-a.com ν΄λΌμ΄μΈνΈκ° λμΌ domain-a.com λ΄ Web Server μ μΌ λ μ지 λΆλ¬μμΌλΌ νλ©΄μ 리μμ€ μμ²μ (GET Request) λ£λλ€.
κ°μ λλ©μΈμ΄λΌ λ¬Έμ κ° λμ§ μλλ€.(Same-Origin requests, Always allowed.)
μλ²κ° μΉ κ·Έλ κ°μ Έκ°λ ΄~~ μ¬κΈ° μλ€ μ지~
domain-a.com ν΄λΌμ΄μΈνΈ λ λΆλ§μ΄ λ§λ€.
λ΄ μ체 μλ²μ μλ μ지μ μ΄μ μλκ° νμ°Έ μ§λ¬λ¨ λ§μ΄λ€.
κ·Έλμ μμ νΈλ λμ λ§μΆ°μ§ ν μ지 Web Serverμ (domain-b.com)
λΉ μ νν λ μ지 μ΄λ―Έμ§λ₯Ό μμ²νκΈ°μ μ΄λ₯Έλ€.
μ΄κ±Έ μ€ λ§μ΄?
μμ μ΄λ―Έμ§κ° domain-b.com μμ λΆλ €μ§ μλ μκ³ μλ μλ μλ€.
μ§κΈ μν©μ domain-a.com μμ ν λλ©μΈ μλ²μΈ domain-b.com μ μ΄λ―Έμ§λ₯Ό μμ²νλ Cross-Origin requests μ΄λ€.
μ΄λ CORS μ μν΄ μ»¨νΈλ‘€ λλ€.
https://developer.mozilla.org/ko/docs/Web/HTTP/CORS
application / x - www - form - urlencoded // application/json μ΄λ°κ±°λ λΆκ°λ₯.
multipart / form - data
text / plain
μλ‘, ν΄λΌμ΄μΈνΈμμ ν λλ©μΈμ μλ£λ₯Ό μμ²νλ€.
GET /resources/public-data/ HTTP/1.1
Host: bar.other
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:71.0) Gecko/20100101 Firefox/71.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Connection: keep-alive
Origin: https://foo.example
ν λλ©μΈ μλ²μμλ μμ²μ λ―μ΄λ³Έ λ€,
GET μμ²β¦ μλΉ ..
λ©λ΄μΌ ν€λ.. μλλ€ μλΉ ..
Content-Type ν€λ.. ν΄λΉ μ¬νμ ν΄λΉ.. μλΉ ..
μ! μ΄ ν΄λΌμ΄μΈνΈμ μμ²μ Simple Requests μ ν΄λΉνλ ꡬλ!
μλ²λ 200OK λ₯Ό λ λ¦°λ€. μλ΅ μ½λλ₯Ό μμΈν νμΈν΄λ³΄μ!
HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 00:23:53 GMT
Server: Apache/2
Access-Control-Allow-Origin: *
// μ μ€ν°λ¦¬μ€ν¬ (*) λ λͺ¨λ λλ©μΈμμ μ κ·Όμ΄ κ°λ₯ν¨μ μλ―Ένλ€!
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/xml
[β¦XML Dataβ¦]
simple request μλ λ³κ°λ‘ Preflighted Requests λ βOPTIONSβ λΌλ λ©μλμ μν΄ μμ²μ΄ μ΄λ£¨μ΄ μ§λ€.
κ·Έκ² λ?
ν¬λ‘μ€ λλ©μΈμ POST μμ²μ λ λ Έμ λΏμΈλ° POST λ³΄λ€ λ¨Όμ λΈλΌμ°μ μμ μλμΌλ‘
βOPTIONS Requestβ λΌλ Preflighted Requests κ° λ³΄λ΄μ§λ κ²μ΄λ€.
const def = {
Preflighted: 'μ΄μ μ λ¨Όμ λ μκ°λ€',
}
μ¦, POST μμ²λ³΄λ€ λ¨Όμ λ μκ°μ (OPTIONS) λ μ κ·Ό κ°λ₯ν΄ μΌμ°? νλ©΄μ κ°μ 보λ κ²μ΄λ€.
application / x - www - form - urlencoded
multipart / form - data
text / plain
μλ κ²λ€μ application / json μ΄ μκ² μ§. μλ ν리νλΌμ΄νΈλ‘ λ°λλλκ±°λ€.
POST μμ² λ³΄λ΄λ©΄ λ¨Όμ OPTIONS κ° λ λΌκ°λκ±°μΌ μλ²λ‘.
λ§μ§λ§μΌλ‘ κΈ°λ³ΈμΌλ‘ μΈν λλ ν€λκ° μλ λ΄κ° μνλ λλ‘ μ»€μ€ν°λ§μ΄μ§ ν ν€λλ₯Ό μΈν νλ κ²½μ°λ
Preflighted Requests κ° λ°λ λλ€.
π©πΏβπ¦°Client : foo.example μμ μμ²μ λ λ¦°λ€. μΌμ server.b.com μ λ νλ‘νμ μλ‘ μμ§€μ’ μΆκ°ν΄ 보μ?
π₯Server : λμ¬ μλ°©. λ μμ² Simple Request.. μλλ€? Preflight request 보λ΄λΌ!
π©πΏβπ¦°Client : β¦ OPTIONS 리νμ€νΈ κ°μ~~ μ¬λμ 리νμ€νΈ~~
π©πΏβπ¦°Client : λ―Έμ.. λ μ΄λ¬ μ΄λ¬ν λ°©μμΌλ‘ POST μμ²μ λ 리λλ° μ΄κ±° λλ€ μλ²μμ νμ©νκ³ μμ§?
π₯Server : β¦
π©πΏβπ¦°Client : λλβ¦ μλ‘λμ¨ μ μΌλ μ지 λ΄ νλ‘νμ μ μ₯μ’ ν΄λ³΄μ~
π₯Server : Access-Control-Allow-Origin μ foo.example μ΄ λ±λ‘λμ΄ μλ€.. λμ₯ μΎ μΎ ..
π₯Server : 200OKβ¦ νκ³ μΆμ μμ² λ£μ΄λΌ.. 리μμ€ μμ² κ°λ₯νλ€κ³ OPTIONS μ νμ 보λΈλ€.
π©πΏβπ¦°Client : μ€ γ γ λ‘ν μ΄μ λ΄κ° μ§μ§ μνλ μμ²μ λ λ¦°λ€. POST Request (text.xml λ±λ±)..
π₯Server : 200OKβ¦ μΈ λ‘λ‘μ΄ νκ³ μνλλ‘ ν΄~~
λλ POST λ₯Ό λ λ Έμ λΏμΈλ° μλμΌλ‘ OPTIONS Requests λΌλ Preflighted Requests κ° λ μκ°λ€.
μλ²μ νμ΄νΈλ¦¬μ€νΈμ μμΌλ©΄ μλ¬ μ½λκ° λ΄κ²¨μ Έμ μλ΅μ΄ μ¬ κ²μ΄λ€.
μλ²μμ ν΄λΌμ΄μΈνΈ (λΈλΌμ°μ ) μ μΏ ν€λ₯Ό μ¬μ λκ° μλ€. μμ μΈμ ν ν°μ λ£μ λκ° μλ€λλ°..
μ νλΈ μκ³ λ¦¬μ¦ μλ μΆμ²μ΄λΌλ μ§ μΏ ν€ λμλ κ²μμ΄ μ μ₯ λ±μ κ·Έλ¬ν μλ μ 보λ€μ κ°μ΄ 보λΌκ²μΈκ° μ request λΌ νλ€.