๊ฐ๋
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (Cross-Origin Resource Sharing, CORS)๋ ์ถ๊ฐ HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ, ํ ์ถ์ฒ์์ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ฃผ๋ ์ฒด์ ์ด๋ค.
๋ณด์ ์์ ์ด์ ๋ก, ๋ธ๋ผ์ฐ์ ๋ ์คํฌ๋ฆฝํธ์์ ์์ํ ๊ต์ฐจ ์ถ์ฒ HTTP ์์ฒญ์ ์ ํํ๋ค.
์ถ์ฒ๋?
๋๋ฉ์ธ(ํธ์คํธ), ํ๋กํ ์ฝ, ํฌํธ๊ฐ ๋ค๋ฅผ ๋ ์ถ์ฒ๊ฐ ๋ค๋ฅด๋ค๊ณ ๋งํ๋ฉฐ, ์ด๋ ๊ต์ฐจ ์ถ์ฒ HTTP ์์ฒญ์ ์คํํ๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ ์ถ์ฒ์ ๋์ผํ ๋ฆฌ์์ค๋ง ๋ถ๋ฌ์ฌ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ๋ถ๋ฌ์ค๋ ค๋ฉด ๊ทธ ์ถ์ฒ์์ ์ฌ๋ฐ๋ฅธ CORS ํค๋๋ฅผ ํฌํจํ ์๋ต์ ๋ฐํํด์ผ ํ๋ค.
ํด๊ฒฐ(ํ์ฉ) ๋ฐฉ๋ฒ
XMLHttpRequest์ Fetch API๋ ๋์ผ ์ถ์ฒ ์ ์ฑ ์ ๋ฐ๋ฅธ๋ค. ์ฆ, ์ด API๋ฅผ ์ฌ์ฉํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ ์ถ์ฒ์ ๋์ผํ ๋ฆฌ์์ค๋ง ๋ถ๋ฌ์ฌ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ๋ถ๋ฌ์ค๋ ค๋ฉด ๊ทธ ์ถ์ฒ์์ ์ฌ๋ฐ๋ฅธ CORS ํค๋๋ฅผ ํฌํจํ ์๋ต์ ๋ฐํํด์ผ ํฉ๋๋ค.
์ ์
https://foo.example ์ ์น ์ปจํ ์ธ ๊ฐ https://bar.other ๋๋ฉ์ธ์ ์ปจํ ์ธ ๋ฅผ ํธ์ถํ๊ธธ ์ํ๋ค. (foo → bar)
๋ฐฉ๋ฒ 1(๋จ์ ์์ฒญ)
ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ์ ๊ฐ๋จํ ํต์ ์ ํ๊ณ , CORS ํค๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ถํ์ ์ฒ๋ฆฌํ๋ค.
๊ฐ์ฅ ๊ฐ๋จํ ์ ๊ทผ ์ ์ด ํ๋กํ ์ฝ์ Origin ํค๋์ Access-Control-Allow-Origin ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ์ด ๊ฒฝ์ฐ ์๋ฒ๋ Access-Control-Allow-Origin: *, ์ผ๋ก ์๋ตํด์ผ ํ๋ฉฐ, ์ด๋ ๋ชจ๋ ๋๋ฉ์ธ์์ ์ ๊ทผํ ์ ์์์ ์๋ฏธํ๋ค.
https://bar.other ๋ฆฌ์์ค ์์ ์๊ฐ ์ค์ง https://foo.example ์ ์์ฒญ๋ง ๋ฆฌ์์ค์ ๋ํ ์ ๊ทผ์ ํ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ๋ค์์ ์ ์กํ๋ค. Access-Control-Allow-Origin: https://foo.example
๊ทธ๋ฌ๋ฉด ์ด์ https://foo.example ์ด์ธ์ ๋๋ฉ์ธ์ corss-site ๋ฐฉ์์ผ๋ก ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ค. ๋ฆฌ์์ค์ ๋ํ ์ ๊ทผ์ ํ์ฉํ๋ ค๋ฉด, Access-Control-Allow-Origin ํค๋์๋ ์์ฒญ์ Origin ํค๋์์ ์ ์ก๋ ๊ฐ์ด ํฌํจ๋์ด์ผ ํ๋ค.
๋ฐฉ๋ฒ 2(ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ)
๋จผ์ OPTIONS ๋ฉ์๋๋ฅผ ํตํด ๋ค๋ฅธ ๋๋ฉ์ธ์ ๋ฆฌ์์ค๋ก HTTP ์์ฒญ์ ๋ณด๋ด ์ค์ ์์ฒญ์ด ์ ์กํ๊ธฐ์ ์์ ํ์ง ํ์ธํ๋ค. (๋ฏธ๋ฆฌ ์ ์กํ์ฌ ํ์ธํ๋ ๋ฐฉ๋ฒ)
- OPTIONS ์์ฒญ์ ๋ณด๋ด๋ฉด ์๋ต์ Allow ํค๋๊ฐ ํฌํจ๋์ด ์ค๋๋ฐ ์ด๋ฅผ ํตํด ์๋ฒ์์ ํ์ฉ๋๋ ๋ฉ์๋๋ฅผ ํ์ธํ ์ ์๋ค.
Access-Control-Request-Method ํค๋๋ preflight request์ ์ผ๋ถ๋ก, ์ค์ ์์ฒญ์ ์ ์กํ ๋ POST ๋ฉ์๋๋ก ์ ์ก๋๋ค๋ ๊ฒ์ ์๋ ค์ค๋ค.
Access-Control-Request-Headers ํค๋๋ ์ค์ ์์ฒญ์ ์ ์ก ํ ๋ X-PINGOTHER ์ Content-Type ์ฌ์ฉ์ ์ ์ ํค๋์ ํจ๊ป ์ ์ก๋๋ค๋ ๊ฒ์ ์๋ฒ์ ์๋ ค์ค๋๋ค. ์ด์ ์๋ฒ๋ ์ด๋ฌํ ์ํฉ์์ ์์ฒญ์ ์๋ฝํ ์ง ๊ฒฐ์ ํ ์ ์๋ค.
preflight request๊ฐ ์๋ฃ๋๋ฉด ์ค์ ์์ฒญ์ ์ ์กํ๋ค.
๋ฐฉ๋ฒ 3(์ธ์ฆ์ ๋ณด๋ฅผ ํฌํจํ ์์ฒญ)
credentialed requests๋ HTTP cookies ์ HTTP Authentication ์ ๋ณด๋ฅผ ์ธ์ํ๋ค.
์์ฒญ์๋ http://bar.other์ ์ปจํ ์ธ ๋ฅผ ๋์์ผ๋ก ํ๋ ์ฟ ํค๊ฐ ํฌํจ๋์ด ์๋ค. ํ์ง๋ง Access-Control-Allow-Credentials: true ๋ก ์๋ตํ์ง ์์ผ๋ฉด, ์๋ต์ ๋ฌด์๋๊ณ ์น ์ปจํ ์ธ ๋ ์ ๊ณต๋์ง ์๋๋ค.
credentialed request ์ ์๋ตํ ๋ ์๋ฒ๋ Access-Control-Allow-Origin ํค๋ "*" ์์ผ๋์นด๋๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ ๋ฐ๋์ ์ ๊ฐ์ ์ง์ ํด์ผ ํ๋ค.
์ ์์ฒญ์ Access-Control-Allow-Origin ํค๋๊ฐ "*" ์์ผ๋ ์นด๋๊ฐ ์๋๋ผ "http://foo.example" ๋ณธ๋ ์ฃผ์์ด๊ธฐ ๋๋ฌธ์ ์๊ฒฉ์ฆ๋ช ์ธ์ ์ปจํ ์ธ ๋ ์น ํธ์ถ ์ปจํ ์ธ ๋ก ๋ฆฌํด๋๋ค.
์ฐธ๊ณ
- developer.mozilla.org/ko/docs/Web/HTTP/CORS
- developer.mozilla.org/ko/docs/Web/Security/Same-origin_policy
'๐CS > Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
XSS(Cross-site Scripting) ๊ณต๊ฒฉ (0) | 2021.04.25 |
---|---|
[Web] param vs query vs body (2) | 2021.04.18 |
[Web] HTTP, HTTPS, HTTP ๋ฒ์ (1) | 2021.04.08 |
[Web] ์ฟ ํค์ ์ธ์ (0) | 2021.04.04 |
[Web] REST & RESTful (0) | 2021.04.03 |
๋๊ธ