๐์ด๋ฒ ํฌ์คํ ์ CORS๋ฅผ ์์๋ณด๊ณ ์ ํ๋ค. CORS๋ฅผ ์์๋ณด๊ธฐ ์ํด์ ์ฌ์ ์ง์์ผ๋ก SOP๋ฅผ ์์์ผํ๋ค.
Same-Origin Policy์ ์ฝ์๋ก ์น ๋ณด์ ์ ์ฑ ์ค ํ๋์ด๋ค. ๋ค๋ฅธ ์ถ์ฒ(Origin)์์ ๋ก๋๋ ๋ฌธ์๋ ์คํฌ๋ฆฝํธ ๋ฑ์ด ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์ ์ํธ์์ฉํ๋ ๊ฒ์ ์ ํํ๋ ๋ณด์ ๋ฉ์ปค๋์ฆ์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ ์ถ์ฒ์ ํด๋นํ๋ ๋ฆฌ์์ค๋ผ๋ฆฌ๋ ์๋ก ์์ ๋กญ๊ฒ ์ ๊ทผํ ์ ์๊ณ , ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค์ ๋ํด์๋ ์ผ๋ถ ์ ์ฝ์ ๋๋ฉฐ, ๋ธ๋ผ์ฐ์ ๋ ์๋ก ๋ค๋ฅธ ์ถ์ฒ์์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ ค๊ณ ํ๋ฉด, ํด๋น ์์ฒญ์ด ์ฐจ๋จ๋๋๋ก ํ๋ค.
๋ง์ฝ SOP๊ฐ ์๋ค๋ฉด ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์์ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ ๋กญ๊ฒ ์ฝ๊ฑฐ๋ ์กฐ์ํ ์ ์๊ฒ ๋๋ค.
๐โOrigin์ด๋?
Origin(์ถ์ฒ)์ด๋ URL์ ํ๋กํ ์ฝ, ํธ์คํธ๋ช
, ํฌํธ ๋ฒํธ๋ฅผ ํฉ์น ๊ฒ์ ์๋ฏธํ๋ค.
URL์ ๊ตฌ์ฑ์ด ๊ถ๊ธํ๋ฉด URL + URN = URI ? ํฌ์คํ
์ ์ฐธ๊ณ ํด๋ณด์
URL | ๋์ผ ์ถ์ฒ ? | ์ด์ |
---|---|---|
https://www.domain.com:3000/about | ใใโญ | ํ๋กํ ์ฝ, ํธ์คํธ, ํฌํธ ๋ฒํธ ๋์ผ |
https://www.domain.com:3000/about?name=KTH | ใใโญ | ํ๋กํ ์ฝ, ํธ์คํธ, ํฌํธ ๋ฒํธ ๋์ผ |
http://www.domain.com:3000 | ใใโ | ํ๋กํ ์ฝ ๋ค๋ฆ (http โ https) |
https://www.another.co.kr:3000 | ใใโ | ํธ์คํธ ๋ค๋ฆ |
https://www.domain.com:8888 | ใใโ | ํฌํธ ๋ฒํธ ๋ค๋ฆ |
https://www.domain.com | ใใโ | ํฌํธ ๋ฒํธ ๋ค๋ฆ (443 โ 3000) |
CORS๋ (Cross-origin resource sharing)์ ์ฝ์๋ก ์ง์ญํ๋ฉด '๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ '๋ผ ํด์ํ๊ณ ๋ง๊ทธ๋๋ก ์ถ์ฒ๊ฐ ๋ค๋ฅธ ์์๋ค์ ๊ณต์ ํ๋ค๋ ๋ป์ ๊ฐ์ง๋ค.
CORS(Cross-Origin Resource Sharing)๋ ์น ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์์, ์๋ก ๋ค๋ฅธ ๋๋ฉ์ธ์ผ๋ก๋ถํฐ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋ ๋ฐ์ํ๋ ๋ณด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฉ์ปค๋์ฆ์ด๋ค.
CROS๋ ๋ธ๋ผ์ฐ์ ์์ ์์ฒญ์ ๋ณด๋ผ ๋, ์์ฒญ ํค๋์ Origin ๊ฐ์ ์ถ๊ฐํ์ฌ, ํน์ ์ถ์ฒ์์ ์คํ์ค์ธ ์น์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ฃผ๋ ์ฒด์ ์ด๋ค. Origin๊ฐ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋๋ฉ์ธ์ ๋ํ๋ด๋ฉฐ, ์๋ฒ์์๋ ์ด Origin๊ฐ์ ํ์ธํ์ฌ ํด๋น ์์ฒญ์ด ํ์ฉ๋๋ ๋๋ฉ์ธ ์ธ์ง ํ์ธํ๊ณ , ํ์ฉ๋๋ ์์ฒญ์ ๋ํด์ ์ฐจ๋จํ์ง ์๋๋ค.
์ฆ ๋ธ๋ผ์ฐ์ ๋ SOP์ ์ํด ๊ธฐ๋ณธ์ ์ธ ๋ค๋ฅธ ์ถ์ฒ์ ์์ ๊ณต์ ๋ฅผ ๋ง์ง๋ง CORS๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ ๊ทผ ๊ถํ์ ์ป์ ์ ์๊ฒ ๋๋ค.
๐์๋ฌด๋ฆฌ ๋ณด์์ด ์ค์ํ์ง๋ง, ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ๊ธฐ๋ฅ์ ์ด์ฉ ์ ์์ด ๋ค๋ฅธ ์ถ์ฒ ๊ฐ์ ์ํธ์์ฉ์ ํด์ผ ํ๋ ์ผ์ด์ค๋ ์์ผ๋ฉฐ, ๋ํ ์ค๋ฌด์ ์ผ๋ก ๋ค๋ฅธ ํ์ฌ์ ์๋ฒ API๋ฅผ ์ด์ฉํด์ผ ํ๋ ์ํฉ๋ ์กด์ฌํ๋ค. ๋ฐ๋ผ์ ์ด์ ๊ฐ์ ์์ธ ์ฌํญ์ ๋๊ธฐ ์ํด CORS ์ ์ฑ ์ ํ์ฉํ๋ ๋ฆฌ์์ค์ ํํด ๋ค๋ฅธ ์ถ์ฒ๋ผ๋ ๋ฐ์๋ค์ธ๋ค๋ ๊ฒ์ด๋ค.
์ดํ ์๋ต์ ๋ฐ์ ๋ธ๋ผ์ฐ์ ๋ ์์ ์ด ๋ณด๋๋ ์์ฒญ์ Origin๊ณผ ์๋ฒ๊ฐ ๋ณด๋ด์ค ์๋ต์ Access-Control-Allow-Origin์ ๋น๊ตํด๋ณธ ํ ์ฐจ๋จํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๋ค.
์์ ๊ฒฝ์ฐ์๋ ๋๋ค http://localhost:3000
์ด๊ธฐ ๋๋ฌธ์ ์ ํจํ๋ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ๋ฌธ์ ์์ด ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
๋ง์ฝ ์ ํจํ์ง ์๋ค๋ฉด ๊ทธ ์๋ต์ ์ฌ์ฉํ์ง ์๊ณ ๋ฒ๋ฆฐ๋ค. (CORS ์๋ฌ !!)
๐ ํ์๋ Node.js๋ก ํ๋ก์ ํธ๋ฅผ ์งํํ๊ณ Express ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์์ ๋ npm์ผ๋ก cors๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋จํ๊ฒ ์ค์นํ์ฌ ๋ฏธ๋ค์จ์ด๋ก ์ฝ๊ฒ ์ฌ์ฉํ์๋ค.
๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
const express = require('express')
const cors = require("cors"); // cors ์ค์ ์ ํธ์ํ๊ฒ ํ๋ ํจํค์ง
const app = express();
// ...
app.use(cors({
origin: "https://naver.com", // ์ ๊ทผ ๊ถํ์ ๋ถ์ฌํ๋ ๋๋ฉ์ธ
credentials: true, // ์๋ต ํค๋์ Access-Control-Allow-Credentials ์ถ๊ฐ
optionsSuccessStatus: 200, // ์๋ต ์ํ 200์ผ๋ก ์ค์
}));
๋ง์ฝ ๋ชจ๋ ์ถ์ฒ์ ๋ํด์ ํ์ฉํ๋ ค๋ฉด origin์ *
๋ก ์ค๋ช
ํ๋ฉด ๋๋ค.
์ฐธ๊ณ ์๋ฃ(์ถ์ฒ)
ํฐ์คํ ๋ฆฌ Richet์ ํ
ํฌ ๋ธ๋ก๊ทธ ํฌ์คํ
[์น ๊ฐ๋ฐ] CORS๋ ๋ฌด์์ธ๊ฐ? (what is Cross Origin Request Sharing?) (CORS ํ๋ฒ์ ๋ฟ์๊ธฐ) (nginx CORS์๋ฌ)
Velog sangbin2 ๋ธ๋ก๊ทธ ํฌ์คํ
CORS ์ค์ ๋ฐฉ๋ฒ
ํฐ์คํ ๋ฆฌ ์ธํ ๋ธ๋ก๊ทธ ํฌ์คํ