CORS(Cross-Origin Resource Sharing)๋ ์๋ก ๋ค๋ฅธ ๋๋ฉ์ธ ๊ฐ์ ์์ ํ ํต์ ๋ฐ ๋ฐ์ดํฐ ๊ตํ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ต์ ์น ๊ฐ๋ฐ์ ๊ธฐ๋ณธ ๋ณด์ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ด๋ ํนํ ๋ถ์ฐ ์์คํ ๋ฐ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ์ธํ๋ผ์ ๋งฅ๋ฝ์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋ ๋ฐ ํ์์ ์ธ ๊ตฌ์ฑ ์์์ ๋๋ค. CORS๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋์ ๋๋ฉ์ธ(์๋ณธ)์์ ์คํ๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์น ๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ๋ SOP(๋์ผ ์๋ณธ ์ ์ฑ )๋ฅผ ์๋ฐํ์ง ์๊ณ ๋ค๋ฅธ ๋๋ฉ์ธ์ ๊ธ๊ผด, ์ด๋ฏธ์ง, ์คํฌ๋ฆฝํธ ๋๋ API ๋ฐ์ดํฐ์ ๊ฐ์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ์ ์์ต๋๋ค. SOP๋ ์น ํ์ด์ง๊ฐ ๋ค๋ฅธ ์๋ณธ์ ๋ฆฌ์์ค์ ์ํธ ์์ฉํ๋ ๊ฒ์ ์ ํํ์ฌ XSRF(๊ต์ฐจ ์ฌ์ดํธ ์์ฒญ ์์กฐ) ๋ฐ XSS(๊ต์ฐจ ์ฌ์ดํธ ์คํฌ๋ฆฝํ ) ๊ณต๊ฒฉ๊ณผ ๊ฐ์ ์ ์ฌ์ ์ธ ๋ณด์ ์ทจ์ฝ์ฑ์ผ๋ก๋ถํฐ ์ฌ์ฉ์๋ฅผ ๋ณดํธํ๋ ๋ณด์ ๊ธฐ๋ฅ์ ๋๋ค.
CORS ์ง์ ํ๊ฒฝ์์๋ ํด๋ผ์ด์ธํธ(์น ๋ธ๋ผ์ฐ์ )์ ์๋ฒ(๋ฆฌ์์ค ๊ณต๊ธ์)๊ฐ ๋ชจ๋ ํ์ ํ๋ก์ธ์ค์ ์ฐธ์ฌํ์ฌ ์๋ณธ ๊ฐ ๋ฆฌ์์ค ๊ณต์ ๊ฐ ํ์ฉ๋๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. CORS ํ๋กํ ์ฝ๋ก ์๋ ค์ง ์ด ํ์ ํ๋ก์ธ์ค์๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ HTTP ํค๋ ๊ตํ์ด ํฌํจ๋ฉ๋๋ค. CORS ํ๋กํ ์ฝ์ ์คํ ์ ์์ฒญ๊ณผ ์ค์ ์์ฒญ์ด๋ผ๋ ๋ ๊ฐ์ง ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
์คํ ์ ์์ฒญ์ ์๋ฒ๊ฐ ์ค์ ์์ฒญ์ด ์ฑ๊ณตํ๋ ๋ฐ ํ์ํ CORS ์ค์ ์ ์ง์ํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ค์ ์์ฒญ ์ ์ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ HTTP OPTIONS ์์ฒญ์ ๋๋ค. ์๋ฒ๋ ํน์ CORS ๊ด๋ จ ํค๋๋ก ์๋ตํ์ฌ ์๋ณธ ๊ฐ ์์ฒญ๊ณผ ์ถ๊ฐ ์กฐ๊ฑด ๋๋ ์ ํ ์ฌํญ(์: ํ์ฉ๋ HTTP ๋ฉ์๋ ๋ฐ ํค๋)์ ์๋ฝํ ์์ฌ๊ฐ ์์์ ๋ํ๋ ๋๋ค. ์คํ ์ ์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ํด๋ผ์ด์ธํธ๋ HTTP GET, POST, PUT, DELETE ๋๋ ๊ธฐํ ์ง์๋๋ ๋ฐฉ๋ฒ์ด ๋ ์ ์๋ ์ค์ ์์ฒญ์ ์งํํฉ๋๋ค.
CORS๋ฅผ ์ง์ํ๋ ค๋ฉด ์น ์๋ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ต์ ์ ์ ํ CORS ๊ด๋ จ HTTP ํค๋๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค. ์ด๋ฌํ ํค๋์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค.
Access-Control-Allow-Origin: ๋ฆฌ์์ค์ ์ ๊ทผ์ด ํ์ฉ๋ ์๋ณธ(๋๋ฉ์ธ)์ ๋ํ๋ ๋๋ค. ํน์ ๋๋ฉ์ธ์ด๋ ์์ผ๋์นด๋(*)๋ก ์ค์ ํ์ฌ ๋ชจ๋ ๋๋ฉ์ธ์ ํ์ฉํ ์ ์์ต๋๋ค.Access-Control-Allow-Methods: GET, POST, PUT, DELETE ๋ฑ๊ณผ ๊ฐ์ ์๋ณธ ๊ฐ ์์ฒญ์ ํ์ฉ๋๋ HTTP ๋ฉ์๋๋ฅผ ๋์ดํฉ๋๋ค.Access-Control-Allow-Headers: Content-Type, Authorization ๋ฑ๊ณผ ๊ฐ์ ์๋ณธ ๊ฐ ์์ฒญ์ ํ์ฉ๋๋ HTTP ํค๋๋ฅผ ์ง์ ํฉ๋๋ค.Access-Control-Expose-Headers: ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์๋ต์์ ์ก์ธ์คํ ์ ์๋ ํค๋๋ฅผ ๋์ดํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์์ ์ฌ์ฉ์ ์ ์ ํค๋๋ฅผ ์ฝ์ ์ ์๋๋ก ํฉ๋๋ค.Access-Control-Allow-Credentials: ์ฟ ํค ๋๋ ๊ธฐํ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ ์๋ณธ ๊ฐ ์์ฒญ์ด ํ์ฉ๋๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค.Access-Control-Max-Age: ํด๋ผ์ด์ธํธ๊ฐ ์คํ ์ ์์ฒญ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ ์ ์๋ ์ต๋ ์๊ฐ(์ด)์ ์ง์ ํ์ฌ ์ฌ๋ฌ ์คํ ์ ์์ฒญ์ ํ์์ฑ์ ์ค์ ๋๋ค.
AppMaster ์์ ์์ฑ๋ ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ CORS ์ง์์ผ๋ก ๊ตฌ์ถ๋์ด ๋ค์ํ ๋๋ฉ์ธ์์ ํธ์คํ ๋ ์ ์๋ ์น ๋ฐ ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ์ ์ํํ ํตํฉ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๋ํ AppMaster ํ๋ซํผ์ CORS ์ค์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ํธ๋ฆฌํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ฏ๋ก ๊ฐ๋ฐ์๊ฐ ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๋ง๊ฒ ์ ์ ํ CORS ๊ด๋ จ ํค๋๋ฅผ ๋ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์์ฑ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์น ๋ณด์์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํ๋ ๋์์ ๋ฐฐํฌ์ ์ ์ฐ์ฑ๊ณผ ๋ค๋ฅธ ์๋น์ค์์ ํตํฉ์ด ๊ฐ๋ฅํด์ง๋๋ค.
AppMaster ์ CORS ๊ธฐ๋ณธ ์ง์ ์ธ์๋ ์น ๊ฐ๋ฐ์๋ ๋ค์ํ ์คํ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฏธ๋ค์จ์ด ์๋ฃจ์ ์ ํ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ CORS๋ฅผ ํ์ฑํํ ์๋ ์์ต๋๋ค. ์ผ๋ถ ์ธ๊ธฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Node.js ๋ฐ Express์ฉ
cors - Ruby ๋ฐ Rack ์ ํ๋ฆฌ์ผ์ด์
์ฉ
rack-cors - Django ์น ์ ํ๋ฆฌ์ผ์ด์
์ฉ
django-cors-headers - Flask ์น ์ ํ๋ฆฌ์ผ์ด์
์ฉ
flask-cors
๊ฒฐ๋ก ์ ์ผ๋ก CORS(Cross-Origin Resource Sharing)๋ ์๋ก ๋ค๋ฅธ ๋๋ฉ์ธ ๊ฐ์ ๋ฆฌ์์ค์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๊ณต์ ํ ์ ์๊ฒ ํด์ฃผ๋ ํ๋ ์น ๊ฐ๋ฐ์ ์ค์ํ ์ธก๋ฉด์ ๋๋ค. ์ด๋ ๋์ผ ์ถ์ฒ ์ ์ฑ ์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๋ ๋์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํธ ์ฐ๊ฒฐ๋ ์ธ๊ณ์ ํ์ํ ๋ณด์ ์์ค์ ์ ์งํ๊ธฐ ์ํ ํ์ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค. AppMaster ์ no-code ํ๋ซํผ์ CORS ๋ฉ์ปค๋์ฆ์ ์์ฉํ์ฌ ์น ๋ณด์์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํ๋ ๋ฐฑ์๋, ์น ๋ฐ ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํฉ๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ผ๋ก AppMaster ๊ฐ๋ฐ์์ ๊ธฐ์ ์ด ์ด์ ๋ณด๋ค ๋ ๋น ๋ฅด๊ณ ๋น์ฉ ํจ์จ์ ์ผ๋ก ํ์ฅ ๊ฐ๋ฅํ๊ณ ์์ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋๋ก ์ง์ํฉ๋๋ค.