๐ฅ CORS
๐ CORS๋?
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (Cross-Origin Resource Sharing)๋ ์ถ๊ฐ HTTP Header๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ถ์ฒ์์ ์คํ ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฆฌ์์ค๊ฐ ์์ ์ ์ถ์ฒ(๋๋ฉ์ธ, ํ๋กํ ์ฝ, ํฌํธ)์ ๋ค๋ฅผ ๋, ๊ต์ฐจ ์ถ์ฒ HTTP ์์ฒญ์ ์คํํ๋ค.
ex) https://domain-a.com์ ํ๋ก ํธ ์๋ JavaScript ์ฝ๋๊ฐ XMLHttpRequest๋ฅผ ์ฌ์ฉํ์ฌ https://domain-b.com/data.json์ ์์ฒญํ๋ ๊ฒฝ์ฐ ๋ณด์ ์์ ์ด์ ๋ก
- CORS ์ฒด์ ๋ ๋ธ๋ผ์ฐ์ ์ ์๋ฒ ๊ฐ์ ์์ ํ ๊ต์ฐจ ์ถ์ฒ ์์ฒญ ๋ฐ ๋ฐ์ดํฐ ์ ์ก์ ์ง์ํ๋ค.
- CORS ํ์ค์ ๋ง์ถ๋ค๋ ๊ฒ์ ์๋ฒ์์๋ ์๋ก์ด ์์ฒญ๊ณผ ์๋ต Header๋ฅผ ์ฒ๋ฆฌํด์ผํ๋ค.
๐คฟ DeepDive
CORS ํ์ค์ ์น ๋ธ๋ผ์ฐ์ ์์ ํ์ฉ๋ ์ถ์ฒ๋ฅผ ์๋ฒ์์ ์๋ก์ด HTTP Header์ ์ถ๊ฐํจ์ผ๋ก์จ ๋์ํ๋ค.
๐ฎ Simple Request
HTTP ์์ฒญ ๋ฉ์๋๊ฐ GET, POST ์ผ ๋ ์ฌ์ฉํ๋ค.
๋ค๋ฅธ ์ถ์ฒ๋ผ๋ฆฌ ์์ฒญ์ ๋ณด๋ผ ๋, ์์ฒญ์ Origin์ด๋ผ๋ Header๋ฅผ ์ถ๊ฐํ๋ค.
1
https://loco9939.com:5000
- Origin์ ์์ฒญํ๋ ์ชฝ์ Scheme, ๋๋ฉ์ธ, ํฌํธ๊ฐ ๋ด๊ฒจ์๋ค.
- scheme : https
- ๋๋ฉ์ธ : loco9939.com
- ํฌํธ : :5000
์์ฒญ ๋ฐ์ ์๋ฒ๋ ์๋ต Header์ ์ง์ ๋ ACAO(Access Control Allow Origin) ์ ๋ณด๋ฅผ ์ค์ด์ ๋ณด๋ธ๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ ACAO ์ ๋ณด๊ฐ ๋ด๊ธด ์๋ต๊ณผ ์์ฒญ์ Origin์ ๋น๊ตํ์ฌ ๋์ผํ๋ฉด ํ๋ฝํ๋ค.
โ๏ธ Preflight
๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ์ ์์ฒญ์ ๋จผ์ ๋ณด๋ธ ํ ์๋ฒ์ ์๋ต์ ๋ณด๊ณ ์์ ํ์ง ํ์ธํ ํ ๋ณธ ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ์์ด๋ค. ๋ณธ ์์ฒญ์ Simple Request ๋ฐฉ์๊ณผ ๋์ผํ๋ค.
๐ CORS ์ค๋ฅ ํด๊ฒฐ ๋ฐฉ๋ฒ
๐จ ์๋ฒ ์ธก
- ACAO(Access Control Allow Origin) ์ค์ ํ๊ธฐ
- ๊ตฌ์ฒด์ ์ธ ์ถ์ฒ ๋ช ์ํ๊ธฐ
- Credentials: include ์ต์ ์ฌ์ฉํ ๊ฒฝ์ฐ * ์ฌ์ฉํ ๊ฒฝ์ฐ CORS ์๋ฌ๋ฐ์
1 | var http = require("http"); |
Access-Control-Allow-origin ํค๋ ๊ฐ์ผ๋ก * ์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ Origin์์ ์ค๋ ์์ฒญ์ ํ์ฉํ๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ๋น์ฅ์ ํธํ ์ ์๊ฒ ์ง๋ง, ๋ฐ๊ฟ์ ์๊ฐํ๋ฉด ์ ์ฒด๋ ๋ชจ๋ฅด๋ ์ด์ํ ์ถ์ฒ์์ ์ค๋ ์์ฒญ๊น์ง ๋ชจ๋ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ณด์์ ๋ ํ์ ํด์ง๋ค. ๊ทธ๋ฌ๋ ๊ฐ๊ธ์ ์ด๋ฉด ๊ท์ฐฎ๋๋ผ๋ ๋ค์๊ณผ ๊ฐ์ด ์ถ์ฒ๋ฅผ ์ง์ ๋ช ์ํด์ฃผ๋๋ก ํ์.
๐ ํด๋ผ์ด์ธํธ ์ธก
- Proxy ์ค์
- ๋ธ๋ผ์ฐ์ ์์ฒญ์ Proxy์์ ์ค์ ํ ์ฃผ์๋ก ์ฐํํ์ฌ ์ ์กํ๋ ๋ฐฉ๋ฒ
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๋ค
- ๊ฐ๋ฐ๋จ๊ณ์์๋ง ์ฌ์ฉํ๊ณ
Production ํ๊ฒฝ์์๋ Proxy ์ฒ๋ฆฌ๊ฐ ๋์ง ์๋๋ค.