Cross-Origin Resource Sharing
์ถ๊ฐ HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ, ํ origin
์์ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ค๋ฅธ origin
์ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ฃผ๋ ์ฒด์
https://wonit.tistory:80/post
https://wonit.tistory:80/post/id?page=10
https://wonit.tistory:80/main/post/comment
Same Origin Policy
origin
์ด ๋ค๋ฅด๋๋ผ๋ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ํ์ฉํ๋ค.๊ฐ๋ฐ์ ์ ์ฅ์์๋
CORS
์SOP
์ ์ฑ ๋๋ฌธ์ ์ ๊ฒฝ์จ์ผ ํ๋ ๊ฒ๋ค์ด ๋์ด๋์ ๊ท์ฐฎ์ ์ ์๋ค. ํ์ง๋ง, ์ด๋ฌํ ์ ์ฑ ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์CSRF
๋XSS
์ ๊ฐ์ ๋ณด์์์ issue๋ฅผ ๋ง์ ์ ์๋ค.
Cross Origin
์์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๊ธฐ ์ํด์ ๋ค์ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
Origin
ํ๋์ ์์ฒญ์ ๋ณด๋ด๋ ์ถ์ฒ๋ฅผ ๋ด์ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ธ๋ค.Access-Control-Allow-Origin
ํค๋์ ํ์ฉ๋ Origin์ด๋ผ๋ ์ ๋ณด๋ฅผ ๋ด์ ๋ณด๋ธ๋ค.Origin
๊ณผ ์๋ฒ๊ฐ ๋ณด๋ธ ์๋ต์ Access-Control-Allow-Origin
๊ฐ์ ๋น๊ตํด ์ ํจํ ์๋ต์ธ์ง ์๋์ง๋ฅผ ๊ฒฐ์กํ๋ค.Access-Control-Allow-Origin
- ์๋ต ํค๋์ ์กด์ฌํ๋ค.
- ๋จ์ผ ์ถ์ฒ๋ฅผ ์ง์ ํ์ฌ, ํด๋น origin๋ง ๋ฆฌ์์ค์ ์ ๊ทผํ๋๋ก ํ์ฉํ ์ ์๋ค.
*
์์ผ๋ ์นด๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ origin์ ์๊ด์์ด ๋ชจ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ๋๋ก ํ์ฉํ ์ ์๋ค.
๊ธฐ๋ณธ์ ์ธ ํ๋ฆ์ ๊ฐ๋จํ์ง๋ง, CORS๊ฐ ๋์ํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ๊ฐ์ง ์๋๋ฆฌ์ค๊ฐ ์๋ค.
์์ฒญ์ ํ ๋ฒ์ ๋ณด๋ด์ง ์๊ณ ์๋น ์์ฒญ๊ณผ ๋ณธ ์์ฒญ์ผ๋ก ๋๋๋ ๋ฐฉ๋ฒ์ด๋ค.
OPTIONS
๋ฉ์๋๋ฅผ ์ด์ฉํด ์๋น ์์ฒญ์ ๋ณด๋ธ๋ค. ์ด๋ Origin
์ ๋ํ ์ ๋ณด๋ฟ๋ง ์๋๋ผ ๋ณธ ์์ฒญ์ ๋ํ ๋ค๋ฅธ ์ ๋ณด๋ค๋ ํจ๊ป ๋ด์ ๋ณด๋ธ๋ค. (Http Method, Content-Type ๋ฑ๋ฑ)Access-Control-Allow-Origin
ํค๋์ ํ์ฉ๋ Origin์ ๋ํ ์ ๋ณด๋ฅผ ๋ด์ ์๋ต์ ๋ณด๋ธ๋ค.Origin
๊ณผ ์๋ฒ๊ฐ ๋ณด๋ธ ์๋ต์ Access-Control-Allow-Origin
๊ฐ์ ๋น๊ตํด ์ ํจํ ์๋ต์ธ์ง ์๋์ง๋ฅผ ๊ฒฐ์กํ๋ค.CORS
์ ์ฑ
์๋ฐ์ด๋ค. ๐จPreflight Request
์์๋ ๋ณธ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ์๋น ์์ฒญ์ ๋ณด๋ด๊ณ ๊ทธ์ ๋ํ ์๋ต์ ํตํด CORS ์ ์ฑ
์๋ฐ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค๋ฉด, Simple Request
๋ ์๋น ์์ฒญ ์์ด ๋ณธ ์์ฒญ์ ๋ณด๋ด๊ณ ๊ทธ์ ๋ํ ์๋ต์ ํตํด CORS ์ ์ฑ
์๋ฐ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ค.
์ ๋ฐ์ ์ธ CORS ์ ์ฑ ์๋ฐ ์ฌ๋ถ ํ๋จ ๋ก์ง์ ๋น์ทํ๊ณ , ์๋น ์์ฒญ์ ์กด์ฌ ์ ๋ฌด๋ง ๋ค๋ฅด๋ค.
Simple Request
๊ฐ ์ด๋ฃจ์ด์ง๊ธฐ ์ํ ์กฐ๊ฑด์ด ์กด์ฌํ๋ค.
GET
, HEAD
, POST
์ค ํ๋์ฌ์ผ ํ๋ค.Accept
, Accept-Language
, Content-Language
, Content-Type
, DPR
, Downlink
, Save-Data
, Viewport-Width
, Width
๋ฅผ ์ ์ธํ ํค๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ค.Content-Type
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ application/x-www-form-urlencoded
, multipart/form-data
, text/plain
๋ง ํ์ฉ๋๋ค.์ด๋ฌํ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ
Simple Request
๊ฐ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํ๋ฆฌํ๋ผ์ดํธ ๋ฐฉ์์ ์ด์ฉํ์ฌ ์๋น ์์ฒญ์ ๋ณด๋ด CORS ์ ์ฑ ์๋ฐ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค.
XMLHttpRequest, fetch API, axios๋ฅผ ์ฌ์ฉํ ๋ ๋ณ๋์ ์ต์ ์์ด ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค ์ ๋ณด๋ ์ธ์ฆ ๊ด๋ จ ํค๋ (ex. Authorization ํค๋) ๋ฅผ ํจ๋ถ๋ก ์์ฒญ์ ๋ด์ง ์๋๋ค.
์ด๋ withCredentials
์ต์
์ true
๋ก ์ค์ ํ๋ฉด cross origin์ผ๋ก ์์ฒญ์ ๋ณด๋ผ ๋ credential
์ ๋ณด๋ฅผ ๋ด์์ ๋ณด๋ธ๋ค. (fetch API์์๋ credentials
์ต์
์ include
๋ก ์ค์ )
์๋ต ํค๋์ Access-Control-Allow-Credentials : true
๊ฐ ์กด์ฌํด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ์ด ์๋ต์ ๊ฑฐ๋ถํ๋ค. ๋ํ, Access-Control-Allow-Origin
์ *
๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ช
์์ ์ธ URL์ด์ด์ผ ํ๋ค.
์๋ฒ์์ Access-Control-Allow-Origin ์๋ง๊ฒ ์ค์ ํ๊ธฐ
*
๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ชจ๋ ์ถ์ฒ์์ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ๊ฒ์ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ณด์ ์ธก๋ฉด์์ issue๊ฐ ๋ฐ์ํ ์ ์๋ค.ํด๋ผ์ด์ธํธ ์ธก์์ Proxy ์๋ฒ ์ค์ ํ๊ธฐ
http://localhost:3000
์์ http://localhost:8080
๋ก ์์ฒญ์ ๋ณด๋ด๊ณ ์ถ๋ค๊ณ ํ์. (๋์ ํฌํธ ๋ฒํธ๊ฐ ๋ค๋ฅด๋ฏ๋ก cross origin์ด๋ค.) http://localhost:8080
์ proxy ์๋ฒ๋ก ์ค์ ํ๋ค. http://localhost:3000/api
๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด http://localhost:8080/api
๋ก ์ฐํํ์ฌ ์์ฒญ์ ๋ณด๋ธ๋ค.๋ง์น๋ฉฐ..
๋๋ถ๋ถ์ ๊ฐ๋ฐ ํ๊ฒฝ์์ ๋ฐฑ์๋์ ํ๋ก ํธ์๋์ origin์ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๋ผ๋ฉด CORS ์ ์ฑ ์ด ๋ฌด์์ธ์ง, ์ด๋ป๊ฒ ๋์ํ๋์ง ์ ์์์ผ ๋๋ค๊ณ ์๊ฐํ๋ค. ํนํ, CORS๋ ๋ธ๋ผ์ฐ์ ์ ๊ตฌํ ์คํ์ด๊ธฐ ๋๋ฌธ์ CORS ์ ์ฑ ์๋ฐ์ผ๋ก ๋ฌธ์ ๋ฅผ ๋ง์ด ๊ฒช๊ฒ ๋๋ ๊ฒ์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ด๋ค. ๊ทธ๋์ ๋ฐฑ์๋์ ์ ์๋ ผํ์ฌ ์ด๋ป๊ฒ CORS ์ ์ฑ ์ ์๋ฐํ์ง ์๊ณ ํต์ ํ ์ง ์ ํด์ผ ํ๋ค. ๐
์ฐธ๊ณ