ํ์๊ฐ ๊ฐ๋ฐ์ ๊ณต๋ถํ ๋ DevOps ๋ถ๋ถ์ด๋ Front๋ Back์์ ๊ณตํต์ ์ผ๋ก ๋ง์ฃผํ๋ ๋ฌธ์ ๋ช ๊ฐ์ง๊ฐ ์์๋๋ฐ, CORS๋ ๊ทธ ๋ฌธ์ ๋ค์ ํฌํจ๋๋ค.
์ด ๋ง์ ๋ค์๊ณผ ๊ฐ๋ค.
๋๋ Front ๊ฐ๋ฐ์์ธ๋ฐ CORS์ ๋ํด์ ๋ชฐ๋ผ๋ ๋๊ฒ ์ฃ ? ํน์ ๋ ๊ด๋ฆฌ ์ ์ง๋ณด์์ธ DevOps๋๊น ๋ชฐ๋ผ๋๋ ๊ฑฐ์ผ ๋ผ๋ ์๊ฐ์ ๋ฒ๋ ค์ผํ๋ค.
์ด๋์์๋ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ค ํ๋๋ก ์ต์ ๋ธ๋ผ์ฐ์ ์ ๋๋ถ๋ถ์ ํค๋์ CORS ์ ์ฑ ์ ์ ์ฉํ๊ธฐ ๋๋ฌธ์, CORS ํ์ค์ ๋ง์ถ๊ธฐ ์ํด์๋ ๋ชจ๋ ๊ฐ๋ฐ์ ํน์ ๊ด๋ฆฌ์๊ฐ ์์์ผ ํ๋ค.
์ค๋์ ๊ทธ๊ฒ ์ ๋ฐ์ํ๊ณ ์ด๋ค ์์ฒญ์ด CORS๋ฅผ ์ฌ์ฉํ๋์ง ๋ฑ๋ฑ์ ๊ดํด ๋ฐฐ์๋ณด์.
CORS
CORS๋ ํ์ฌ Ip๊ฐ ์๋ ๋ค๋ฅธ Ip๋ก ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ ๊ตฌ์กฐ๋ผ๊ณ ์ผ๋จ์ ์๊ฐํ๋ฉด ๋๋ค.
ํ์๊ฐ CORS์ ๋ํด์ ์ ์ดํด๊ฐ ๊ฐ์ง ์์์ ์ฌ๋ฌ ์ค๋ช ์ ์ฐพ์๋ณด๊ณ ๋น๊ตํด๋ดค์ง๋ง ํญ์ ์ฒ์์ ๋ณด๋ ๋ฌธ๊ตฌ๋ ์์์ ๋ง ํ๋ ๊ฒ์ด์๋ค.
์ดํด๊ฐ ์ ๊ฐ์ง ์์ง๋ง ์ดํด๋ฅผ ํ๊ณ ๋ณด๋ ์ ์ค๋ช ์ด ๊ฐ์ฅ ์ค๋ช ํ๊ธฐ ์ข์ ๋ฌธ๊ตฌ์ธ๊ฒ ๊ฐ๋ค.
์ฐ๋ฆฌ๋ ์ด CORS์ ๋ํด์ ์์๊ฐ๊ธฐ ์ํด์ ์ค๋ 3๊ฐ์ง๋ฅผ ๋ฐฐ์ธ ๊ฒ์ด๋ค.
- Origin (Cross Origin VS Same Origin
- SOP
- Access-Control-Allow-Origin
์ ์ธ๊ฐ์ง๋ฅผ ๋ชจ๋๊ฐ CORS์ ๊ด๋ จ๋ ๊ฒ๋ค์ด๋ค.
์ด์ ํ๋ ํ๋ ์์๊ฐ ๋ณด์.
1. Origin
Origin์ ์์ฒญ์ด ์์๋ ์๋ฒ์ ์์น๋ฅผ ๋ํ๋ด๋๋ฌธ๊ตฌ์ด๋ค.
๋ง์ฝ ๋ด๊ฐ Naver ๋ก๊ทธ์ธ ์๋ฒ๋ก ๋ก๊ทธ์ธ ์์ฒญ์ ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด, ์๋ง ๊ณผ์ ์ ๊ทธ๋ ค๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ์๋ฒ Ip๋ 2๊ฐ๊ฐ ์กด์ฌํ๋ค.
- Client ์๋ฒ
- ๋ก๊ทธ์ธ API ์๋ฒ
์ด 2๊ฐ์ IP๋ ์๋ก ๋ค๋ฅธ IP์ ๋ฒํธ๋ฅผ ๊ฐ๊ณ ์๊ฒ ๋๋ค.
์๋ฅผ ๋ค์ด Client ์๋ฒ๋ http://client:80
์ด๋ผ๊ณ ํ๊ณ ๋ก๊ทธ์ธ ์๋ฒ๋ http://login:3000/
์ด๋ผ๊ณ ํด๋ณด์.
๊ทธ๋ผ ์ฌ๊ธฐ์ ํด๋ผ์ด์ธํธ ์๋ฒ(http://client:80
)๊ฐ ๋ก๊ทธ์ธ ์๋ฒ(http://login:3000/
)์๊ฒ HTTP ์์ฒญ์ ๋ณด๋ผ ๋ Origin ์ด ๋ค๋ฅด๋ค๋ผ๊ณ ํ๋ ๊ฒ์ด๋ค.
์ด๋ฅผ Cross Origin์ด๋ผ๊ณ ํ๊ณ , ๋ง์ฝ ๋ก๊ทธ์ธ ์๋ฒ๊ฐ ๋ด๋ถ ํต์ ์(๊ทธ๋ด ์ผ์ ๋๋ฌผ๊ฒ ์ง๋ง) ํด์ ์๋ฒ ๋ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค๋ฉด ๊ทธ ๊ฒ์ Same Origin์ด๋ผ๊ณ ํ๋ค.
๊ทธ๋ผ ์ฌ๊ธฐ์ ์ด๋ป๊ฒ Origin์ ๊ตฌ๋ถํ ๊น?
Origin์ ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ
Origin์ ๊ตฌ๋ถํ ๋๋ 3๊ฐ์ง๋ฅผ ์ด์ฉํ๋ค.
- ์คํค๋ง
- HOST
- Port
์๋ฅผ ๋ค๋ฉด https://wonit.tistory:80
์ด๋ผ๋ ๊ฒฝ๋ก๊ฐ ์๋ค๋ฉด ์ฌ๊ธฐ์ ์คํค๋ง, Host, Port๋ชจ๋๊ฐ ํฌํจ๋์ด ์๋ค.
- https://wonit.tistory:80/post
- https://wonit.tistory:80/post/id?page=10
- https://wonit.tistory:80/main/post/comment
์ด๋ฐ ์ฃผ์๋ผ๋ฉด ์๋ก ๋ชจ๋ Origin์ด ๋์ผํ ์ํ์ธ ๊ฒ์ด๋ค.
2. SOP
SOP๋ Same Origin Policy๋ฅผ ๋ปํ๋ค.
Same Origin Policy๋? 2011๋ RFC 6454์์ ๋ฑ์ฅํ ๋ณด์ ์ ์ฑ ์ผ๋ก ๋์ผํ ์ถ์ฒ์ Origin๋ง ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ ์ ์๋ค. ๋ฅผ ์๋ฏธํ๋ค.
์ฐ๋ฆฌ๊ฐ ์ด SOP ๋๋ฌธ์ ์ฌ์ค์ CORS ๋ฌธ์ ์ ํ๋์ธ๋ค๊ณ ํด๋ ๊ณผ์ธ์ด ์๋๋ค.
์ด SOP ํ์ค์ ๋ฐ๋ผ์ผ์ง XSS๋ผ๋์ง CSRF๋ผ๋ ๋ณด์์์ Issue๋ฅผ ๋ง์ ์ ์๊ฒ ๋๋ค.
3. Access-Control-Allow-Origin
์ด Access-Control-Allow-Origin์ ๋ฐ๋ก CORS๋ฅผ ํด๊ฒฐํ ์ ์๋ ๊ณ ๋ง์ด ๋ ์์ด๋ค.
์ฐ๋ฆฌ๊ฐ SOP ์ ์ฑ ์ ๋ฐ๋ผ์ ๊ฐ์ Origin์ ์์๋ง ๊ณต์ ๊ฐ๋ฅํ๋ค๊ณ ํ๋๋ฐ, ๊ทธ๋ผ ๋ค๋ฅธ Origin์์ ์์์ด์ฉ์ ๋ชปํ๋ ๊ฒ์ผ๊น?
์น์ด๋ผ๋ ์ํ๊ณ๋ ๋ค๋ฅธ ๋ฆฌ์์ค์ ๊ณต์ ๋ฅผ ์๋ ์์ด ๋ง์ด ํ๊ธฐ ๋๋ฌธ์ ์์ ๋ง๋๋ก ์์ ์ด์ฉ์ ๋ชปํ๋ค๋ฉด SOP๊ฐ ์ฌ๋ผ์ก๊ฑฐ๋ ์น์ด ์ฌ๋ผ์ก๊ฑฐ๋ ๋ ์ค ํ๋๊ฒ ์ง๋ง ์ด Access-Control-Allow-Origin ๋๋ถ์ ์๋ก ๋ค๋ฅธ Origin ์์ ์์ ๊ณต์ ๊ฐ ๊ฐ๋ฅํด์ก๋ค.
๊ฒฐ๋ก ์ธ CORS๋ ์ด๋ป๊ฒ ๋์์ํฌ๊น?
์ด์ ๊ฒฐ๋ก ์ผ๋ก ๋ค๋ค๋๋ค.
Cross Origin์์ ์์์ ์์ฒญํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
- HTTP ํต์ ํค๋์ธ
Origin
ํค๋์ ์์ฒญ์ ๋ณด๋ด๋ ๊ณณ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ธ๋ค. - ์ดํ ์๋ฒ๋
Access-Control-Allow-Origin
ํค๋์ ํ์ฉ๋ Origin์ด๋ผ๋ ์ ๋ณด๋ฅผ ๋ด์ ๋ณด๋ธ๋ค - ํด๋ผ์ด์ธํธ๋ ํค๋์ ๊ฐ๊ณผ ๋น๊ตํด ์ ์ ์๋ต์์ ํ์ธํ๊ณ ์ง์ ๋ ์์ฒญ์ ๋ณด๋ธ๋ค.
- ์๋ฒ๋ ์์ฒญ์ ์ํํ๊ณ 200OK ์ฝ๋๋ฅผ ์๋ตํ๋ค.
๋๊ธ