๐ฅ Origin(์ถ์ฒ) ๋?
๐ฅ ๋์ผ ์ถ์ฒ ์ ์ฑ (SOP)
๐ฅ ๊ต์ฐจ ์ถ์ฒ ์์ ๊ณต์ (CORS)
๐ฅ CORS ์๋๋ฆฌ์ค
โ๏ธ ๊ฐ์ ์ถ์ฒ(same origin)์ ํ๋กํ ์ฝ, ํธ์คํธ, ํฌํธ๊ฐ ์ผ์นํ ๋๋ ์๋ฏธํ๊ณ ์ด ํ๋จ์ ํด๋ผ์ด์ธํธ๋ ์๋ฒ๊ฐ ์๋, ๋ธ๋ผ์ฐ์ ์์ ํ๋จํ๋ค.
โ๏ธ RFC ํ์ค์์ HTTPS๋ HTTP ํ๋กํ ์ฝ์์๋ ํฌํธ ์๋ต์ด ๊ฐ๋ฅํ์ง๋ง, ์ด ๋ํ ๋ถ์ผ์นํ๋ฉด ๊ฐ์ ์ถ์ฒ๋ก ์ธ์ ๋์ง ์๋๋ค.
โ๏ธ ์๋ฅผ ๋ค์ด, ์๋ 1๋ฒ์ ๊ฐ์ origin์ด์ง๋ง, 2๋ฒ์ ๋ค๋ฅธ origin์ด๋ค. ํ๋กํ ์ฝ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
1. "https://jaewon.com/products" == "https://jaewon.com/rooms/1"
2. "https://jaewon.com/products" != "http://jaewon.com/products"
โ๏ธ ํด๋น ํ์ด์ง์ ๋ํ origin์ ๋ธ๋ผ์ฐ์ console์ฐฝ์ ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด ํ์ธ ๊ฐ๋ฅํ๋ค.
$ console.log(location.origin)
โ๏ธ ํด๋ผ์ด์ธํธ์์ request๋ฅผ ๋ณด๋ด๋ฉด, header์ origin์ ์ถ์ฒ๋ฅผ ๋ด์ ๋ณด๋ด๊ณ , ์๋ฒ์์ response๋ฅผ ์ค ๋, Access-Control-Allow-Origin๋ผ๋ header์ ํ๋๊ฐ์ origin์ ๋ด์ ๋ณด๋ธ๋ค.
โ๏ธ ์ด ๋, request์ origin ๊ฐ๊ณผ response์ Access-Control-Allow-Origin์ ๊ฐ์ด ์ผ์นํ๋ฉด ๊ฐ์ ์ถ์ฒ๋ผ๊ณ ๋ธ๋ผ์ฐ์ ๊ฐ ์ธ์ํ ์ ์๋ค.
โ๏ธ SOP๋ ์ด๋ค ์ถ์ฒ(origin)์์ ๋ถ๋ฌ์จ ๋ฌธ์๋ ์คํฌ๋ฆฝํธ๊ฐ ๋ค๋ฅธ ์ถ์ฒ์์ ๊ฐ์ ธ์จ ๋ฆฌ์์ค์ ์ํธ์์ฉ ํ๋ ๊ฒ์ ์ ํํ๋ ์ค์ํ ๋ณด์ ๋ฐฉ์์ด๋ค.
โ๏ธ ์ฆ, SOP๋ ๋์ผํ ์ถ์ฒ์ origin๋ง ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ ์ ์๋๋กํ๋ ๋ณด์ ์ ์ฑ ์ผ๋ก ์ด ์ ์ฑ ์ ์งํค๋ฉด XSS๋ XSRF ๋ฑ์ ๋ณด์ ์ทจ์ฝ์ ์ ๋ฐฉ์ดํ ์ ์๋ค.
- XSS(Cross Site Scription, ์ฌ์ดํธ ๊ฐ ์คํฌ๋ฆฝํ ) : ๊ด๋ฆฌ์๊ฐ ์๋ ๊ถํ์ด ์๋ ์ฌ์ฉ์๊ฐ ์น ์ฌ์ดํธ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํ๋ ๊ณต๊ฒฉ ํ์
- XSRF(Cross Site Request Forgery, ์ฌ์ดํธ ๊ฐ ์์ฒญ ์์กฐ) : ์ฌ์ฉ์๊ฐ ์์ ์ ์์ง์๋ ๋ฌด๊ดํ๊ฒ ๊ณต๊ฒฉ์๊ฐ ์ด๋ํ ํ์(์์ , ์ญ์ , ๋ฑ๋ก ๋ฑ)๋ฅผ ์น์ฌ์ดํธ์ ์์ฒญํ๊ฒํ๋ ๊ณต๊ฒฉ ํ์
โ๏ธ ๋จ, SOP ๋๋ฌธ์ ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ค์ง ๋ชปํ๋ ๋ถํธ์ด ๋ฐ์ํ๋ค. ์ด์ ๋ง์ ๊ฐ๋ฐ์๋ค์ด JONP, Reverse Proxy, Flash Socker ๋ฑ ์ฐํํ๋ ๋ฐฉ๋ฒ์ ๋ง๋ค์์ง๋ง Cross Domain ์ด์๋ฅผ ํด๊ฒฐํ๋ ํ์ค์ ํ์์ฑ์ด ์ปค์ง๊ฒ ๋์๋ค.
โ๏ธ ์ด์ W3C์ ๊ถ์ฅ์ฌํญ์ผ๋ก CORS ์ ์ฑ ์ ๋ฐํํ๊ฒ ๋๋ค.
โ๏ธ CORS๋ ์น ๋ธ๋ผ์ฐ์ ์์ ์ธ๋ถ ๋๋ฉ์ธ ์๋ฒ์ ํต์ ํ๊ธฐ ์ํ ๋ฐฉ์์ ํ์คํํ ์ ์ฑ ์ด๋ค.
โ๏ธ ์ด ์ ์ฑ ์ ์๊ฑฐํด์ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์ ํด์ง ํค๋๋ฅผ ํตํด ์๋ก ์์ฒญ์ด๋ ์๋ต์ ๋ฐ์ํ ์ง, ์น๋ธ๋ผ์ฐ์ ์ ์ํด ํ๊ฐ๋๊ณ ๊ฒฐ์ ๋๋ค.
โ๏ธ ์ฆ, ๊ฐ์ ์ถ์ฒ๊ฐ ์๋๋๋ผ๋, CORS ์ ์ฑ ์ ์ํด ํต์ ํ ์ ์๊ฒ ๋์๋ค.
โ๏ธ Preflight Request๋ ๋ณธ ์์ฒญ ์ด์ ์ ์ด๋ค์ง๋ ์๋น ์์ฒญ ๊ฐ๋ ์ด๋ค. ์ด ์ฌ์ ์์ฒญ์ OPTIONS๋ผ๋ ๋งค์๋๋ฅผ ํตํด ์ด๋ค์ง๋ค.
โ๏ธ ์ด ์๋น ์์ฒญ์์ request์ origin๊ฐ๊ณผ response์ Access-Control-Allow-Origin์ด ์ผ์นํ๋ฉด, ๋ธ๋ผ์ฐ์ ์์๋ ๊ฐ์ ์ถ์ฒ๋ผ ์ธ์ํด์ ๋ณธ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ค.
โ๏ธ ์ด์ ๋ธ๋ผ์ฐ์ ๋ ๊ฐ์ ์ถ์ฒ๋ผ ์ธ์ํ๊ฒ ๋๋ฉด CORS ์ ์ฑ ์ ์๋ฐ๋์ง ์์๋ค ํ๋จํ๊ณ , ๋ณธ ์์ฒญ์ ์ ๋๋ก๋ ์๋ต์ ๋ฐ์ ์ ์๊ฒ ๋๋ค.
โ๏ธ ๋ง์ผ ์๋น ์์ฒญ์์ origin๊ฐ๊ณผ Access-Control-Allow-Origin๊ฐ์ด ๋ถ์ผ์นํ๋ค๋ฉด ๋ณธ ์์ฒญ์ ์ด๋ค์ง์ง ์๋๋ค.
โ๏ธ Simple Request๋ Preflight Request ์์ฒญ์ด ๋ณ๋๋ก ์กด์ฌํ์ง ์๊ณ , Simple Request ๋ ๋ชจ๋ ํฌํจ๋์ด์๋ ๊ฐ๋ ์ด๋ค.
โ๏ธ ์ด ๋ํ origin๊ณผ Access-Control-Allow-Origin์ ๋น๊ตํด์ ๋์ผ ์ถ์ฒ์ธ์ง ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ํ๋จ๋๊ณ ๋์ผํ ๊ฒฝ์ฐ, ์์ฒญ์ ๋ํ ์๋ต์ ์ฒ๋ฆฌํ๋ค.
โ๏ธ ๋จ, Simple Request๋ HEAD, GET, POST ์ค ํ๋์ ๋ฉ์๋ ์ผ ๋๋ง ์ฌ์ฉ๊ฐ๋ฅํ๊ณ , ์ฌ์ฉํ ์ ์๋ header์ ์ข ๋ฅ๊ฐ ์ ํ์ ์ด๋ค. ํนํ, Content-Type์ผ๋ก application/json์ ์ฌ์ฉํ ์ ์๋ค.
โ๏ธ Credentialed Request๋ ๋ณด๋ค ๋ณด์์ ๊ฐํ์ํจ ๋ฐฉ์์ผ๋ก ์ฟ ๊ธฐ๋ฅผ ๋ด๊ธฐ ์ํด ์ต์ ์ด๋ค. ์ด ์ต์ ์ผ๋ก same-origin(๊ธฐ๋ณธ๊ฐ), include, omit์ ์ค ์ ์๋ค.
โ๏ธ same-origin์ ๊ฐ์ ์ถ์ฒ ๊ฐ ์์ฒญ์๋ง ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด๊ฒ ๋ค๋ ์ต์ ๊ฐ์ด๊ณ , include๋ ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ๋ ์ฌ์ฉํ๋ค. omit์ ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ง ์์ ๋ ์ฌ์ฉํ๋ค.
โ๏ธ ์ฐธ๊ณ ๋ก ์ ์ต์ ๊ฐ๋ค์ fetch๋ฅผ ์ค ๋, ์ฌ์ฉํ๋ ์ต์ ์ด๋ค.
fetch('https://jaewon.com/products/1', { credentials: 'include'})
โ๏ธ ๋จ, Access-Control-Allow-Origin์ *์ ์ฌ์ฉํ ์ ์๊ณ , ๋ช ์์ ์ธ URL์ ์ง์ ํด์ผ ํ๋ค. ๋ํ ์๋ต header์ Access-Control-Allow-Credentails:true๊ฐ ์กด์ฌํด์ผ ํ๋ค.