22.09.22 ์์
์๊ฐ ์ค ์ค์ค๋ก ๊ณต๋ถํ ๋ด์ฉ๋ค์ ์ ๋ฆฌํ์์ต๋๋ค ๐
ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์์
๋๋ค! ๐
CORS ๊ฐ๋
- Cross Origin Resource Sharing
- ๊ต์ฐจ ์ถ์ฒ ์ ๋ณด ๊ณต์ ์ ๊ดํ ์ ์ฑ
- ๋ณด์ ์์ ์ด์ ๋ก ๋ชจ๋ ์น์ฌ์ดํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก SOP(Same-Origin Policy)๋ฅผ ๋ฐ๋ฅธ๋ค. ๋ค์ ๋งํด, ๊ฐ์ ์ถ์ฒ์ ๋ํ ๋ฐ์ดํฐ ์์ฒญ์ ํญ์ ํ๋ฝ๋์ง๋ง, ๋ค๋ฅธ ์ถ์ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๊ฒฝ์ฐ ํน๋ณํ ๊ท์น์ ๋ฐ๋ผ ํ๋ฝ์ ๋ฐ์์ผ ํ๋ค.
- ํด๋น ๊ท์น์ด CORS๋ก, ๋ค๋ฅธ ์ถ์ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๋ CORS๋ฅผ ์งํค์ง ์์ผ๋ฉด ์๋ฒ๊ฐ ์ ์์ ์ผ๋ก ์๋ตํ๋๋ผ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ต์ ํ๊ธฐํ๊ณ ํด๋ผ์ด์ธํธ์ ์๋ฌ๋ฅผ ๋์ง๋ค.
์ถ์ฒ
- CORS์์ ์ด์ผ๊ธฐํ๋ ์ถ์ฒ๋ URI๋ฅผ ๊ตฌ์ฑํ๋ ์์ ์ค Scheme, Host, Port๋ฅผ ๋งํ๋ค.
- 3๊ฐ์ง ์ค ํ๋๋ผ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ถ์ฒ๋ก ๊ฐ์ฃผํ๋ฉฐ, ํฌํธ ๋ฒํธ์ ๊ฒฝ์ฐ ๋ฐ๋ก ๋ช
์๋์ง ์์ ๊ฒฝ์ฐ HTTP/HTTPS์ ๊ธฐ๋ณธ ํฌํธ๋ฒํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ค.
- ์ถ์ฒ์ ๊ตฌ์ฑ ์์
- Scheme
http://
, https://
์ ๊ฐ์ ํ๋กํ ์ฝ. http์ https๋ ๋ค๋ฅธ ํ๋กํ ์ฝ์ด๊ธฐ ๋๋ฌธ์, ํธ์คํธ๊ฐ ๊ฐ๋๋ผ๋ ์๋ก ๋ค๋ฅธ ์ถ์ฒ๋ก ์ธ์ํ์ฌ CORS์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- Host
www.naver.com
๊ณผ ๊ฐ์ด, ๋ค๋ฅธ ์น์ฌ์ดํธ์ ๊ตฌ๋ถ๋๋ ๋
๋ฆฝ์ ์ธ ์ด๋ฆ. ์ฐ๋ฆฌ๊ฐ ํํ ์ฃผ์๋ผ๊ณ ๋ถ๋ฅด๋ ๋ถ๋ถ์ ๋งํ๋ฉฐ, ๋ท๋ถ๋ถ์ ํ๋ผ๋ฏธํฐ์ ์ฟผ๋ฆฌ์คํธ๋ง ๋ฑ์ ํฌํจํ์ง ์๋๋ค.
- Port
- ์๋ต๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฉฐ, ๋ช
์ํ ๊ฒฝ์ฐ ํธ์คํธ ๋ค์ ๋ถ๋๋ค.
- ์:
https://www.pereng.com:8000
- http์ ๊ธฐ๋ณธ ํฌํธ๋ฒํธ๋
:80
, https์ ๊ธฐ๋ณธ ํฌํธ๋ฒํธ๋ :443
์ด๋ค.
๋๊ฐ ํ์ธํ์ง?
- CORS๋ ๋ธ๋ผ์ฐ์ ์์ ํ๋จํ๊ณ ์ ์ฉํ๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ ์์ ์ด ๋๊ตฌ์ธ์ง, ์ด๋ค ์์ฒญ์ ํ๋ฝํ ๊ฒ์ธ์ง๋ฅผ ์์ฒญ ํค๋์ ๋ด์ ์ ์กํ๊ณ , CORS์๋ฐ ์ฌ๋ถ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋จํ๋ค.
- ๋ฐ๋ผ์ CORS๋ฅผ ์๋ฐํ ๊ฒฝ์ฐ ์๋ฒ์์๋ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ผ๋ ๋ธ๋ผ์ฐ์ ์์ ์๋ต์ ํ๊ธฐํ๋ค.
- ์๋ฒ ๋ก๊ทธ์๋ ์ ์์ ์ธ ํต์ ์ผ๋ก ๊ธฐ๋ก๋๋ค๋ ์๋ฏธ
- ๋ธ๋ผ์ฐ์ ๋ง๋ค ํ๋จ ๊ธฐ์ค์ด ์กฐ๊ธ์ฉ ๋ค๋ฅผ ์ ์์ผ๋ฉฐ, ํนํ IE์ ๊ฒฝ์ฐ ์ถ์ฒ ํ๋จ ์ ํฌํธ ๋ฒํธ๋ฅผ ๋ฌด์ํ๋ค.
CORS ๊ด์ ์์ ๋ณด๋ 3๊ฐ์ง ํต์ ๋ฐฉ๋ฒ
- Preflight
- ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ ์๋น ์์ฒญ์ ๋ณด๋ธ๋ค
- ์๋น ์์ฒญ์ ๋ํด, ์๋ฒ๋ ์ด๋ค ๊ฒ๋ค์ด ํ์ฉ๋๊ณ ๊ธ์ง๋๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ์๋ต ํค๋์ ๋ด์ ๋ณด๋ธ๋ค.
- origin, credential, method ๋ฑ
- ๋ธ๋ผ์ฐ์ ๋ ์๋น ์์ฒญ๊ณผ ๊ทธ์ ๋ํ ์๋ฒ์ ์๋ต์ ๋น๊ตํ์ฌ ์์ ํ๋ค๊ณ ํ๋จ๋ ๊ฒฝ์ฐ ๋ณธ ์์ฒญ์ ์๋ฒ๋ก ๋ณด๋ธ๋ค
- ์ดํ ์๋ฒ๊ฐ ์๋ตํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์๋ต ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ์ ๋๊ฒจ์ค๋ค
- Simple Request
- ๋ธ๋ผ์ฐ์ ๋ ์๋น ์์ฒญ ์์ด ์๋ฒ์ ๋ฐ๋ก ๋ณธ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ต ํค๋์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก CORS ์ ์ฑ
์๋ฐ ์ฌ๋ถ๋ฅผ ํ์
ํ์ฌ ์ฒ๋ฆฌํ๋ค
- ์๋น ์์ฒญ์ด ์๋ค๋ ์ ์ ์ ์ธํ๊ณ , 1๋ฒ๊ณผ ๋ก์ง์ด ๊ฐ๋ค
- ์ ์ฝ ์กฐ๊ฑด์ด ๊น๋ค๋ก์, ์ค์ ๋ก ์ฌ์ฉ๋๋ ์ผ์ด ๋๋ฌผ๋ค
- ์ฌ์ฉ ๊ฐ๋ฅํ method ์ ํ,
- ์ฌ์ฉ ๊ฐ๋ฅํ header ์ ํ,
- ์ฌ์ฉ ๊ฐ๋ฅํ Content-type ์ ํ
- Credentialed Request
- ์์ฒญ ํค๋์ Credentials๋ฅผ ์ถ๊ฐํ์ฌ ์์ฒญ์ ๋ณด๋ผ ๋ ์ฟ ํค์ ๊ฐ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ํจ๊ป ์ ์ก
- Same-origin: ๊ฐ์ ์ถ์ฒ์ ๋ณด๋ผ ๋๋ง ์ธ์ฆ ์ ๋ณด ์ ์ก
- Include: ๋ชจ๋ ์์ฒญ์ ๋ํด ์ธ์ฆ ์ ๋ณด ์ ์ก
- Omit: ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ง ์์
- ์ธ์ฆ ์ ๋ณด๊ฐ ๋ด๊ธด ์ํ์์ ๋ค๋ฅธ ์ถ์ฒ๋ก ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๊ฒฝ์ฐ ๊ธฐ์กด CORS ๋ฃฐ์ ์๋ก์ด ๊ท์น์ 2๊ฐ ์ถ๊ฐํจ
- ์๋ฒ์ธก์์
Access-Control-Allow-Credentials: true
๋ฅผ ๊ผญ ์ฌ์ฉํด์ผ ํจ
- ์๋ฒ์ธก์์
Access-Control-Allow-Origin
์ ๋ช
ํํ ์ถ์ฒ๋ฅผ ๋ช
์ํด์ผ ํจ
- ๋ณด์ ์์ ์ด์๋ก
*
๋ฅผ ์ฌ์ฉํ ์ ์์
CORS ์ด์๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
์๋ฒ
Access-Control-Allow-Origin
์ค์ ํ๊ธฐ
- ๊ฐ๊ธ์
*
๋ณด๋ค๋ ๊ตฌ์ฒด์ ์ธ ์ถ์ฒ๋ฅผ ๋ช
์ํ ๊ฒ(๋ณด์ ์ด์)
- ํด๋ผ์ด์ธํธ์์ ์์ฒญ์
Credentials: include
์ต์
์ ์ฌ์ฉํ ๊ฒฝ์ฐ, *
๋ฅผ ์ฌ์ฉํ๋ฉด CORS ์๋ฌ ๋ฐ์
Access-Control-Allow-Credentials: true
ํ์ธํ๊ธฐ
- ํด๋ผ์ด์ธํธ์์
Credentials: include
์ต์
์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ๊ทธ์ ๋ํด ํด๋น ์ต์
์ ์ฌ์ฉํ์ง ์์ผ๋ฉด CORS ์๋ฌ๊ฐ ๋ฐ์ํจ.
ํด๋ผ์ด์ธํธ
- Proxy ์ค์ ํ๊ธฐ
-
Proxy๋?
- ์์ฒญ์ Proxy์์ ์ค์ ํ ์ฃผ์๋ก ์ฐํํ์ฌ ์ ์กํ๋ ๋ฐฉ๋ฒ
http-proxy-middleware
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
-
์์
proxy: {
'/api': {
target: 'https://api.evan.com',
changeOrigin: true,
pathRewrite: { '^/api': '' },
},
}
-
์ฃผ์์ฌํญ
- ๊ฐ๋ฐ ๋จ๊ณ์์๋ง ์ ์ฉ๋๋ฏ๋ก, ์ค์ ํ๋ก๋์
ํ๊ฒฝ์์๋ ํ๋ก์ ์ฒ๋ฆฌ๊ฐ ๋์ง ์๋๋ค
- ๋น๋ ์ดํ์๋ ์ ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ
์ฐธ๊ณ ์๋ฃ
https://evan-moon.github.io/2020/05/21/about-cors/#cors๋ฅผ-ํด๊ฒฐํ -์-์๋-๋ฐฉ๋ฒ
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
https://phase-dryosaurus-8ac.notion.site/CORS-9f5a68d44a8f4b46bbb647a9b50c2638