SOP
SOP๋ Same-Origin Policy์ ์ค์๋ง๋ก, ๋์ผ ์ถ์ฒ ์ ์ฑ ์ ๋ปํ๋ค. ํ ๋ง๋๋ก โ๊ฐ์ ์ถ์ฒ์ ๋ฆฌ์์ค๋ง ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๋คโ๋ ์ ์ฑ ์ผ๋ก ์ฌ๊ธฐ์ ์ถ์ฒ๋ ํ๋กํ ์ฝ, ํธ์คํธ, ํฌํธ์ ์กฐํฉ์ผ๋ก ๋์ด ์๋ค. ์ด ์ค ํ๋๋ผ๋ ๋ค๋ฅด๋ค๋ฉด ๋์ผํ ์ถ์ฒ๋ก ๋ณด์ง ์๋๋ค.
ex.https://ninefloor.com
:ehttp://ninefloor.com
โ ํ๋กํ ์ฝ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋์ผ ์ถ์ฒ๊ฐ ์๋https://portfolio.ninefloor.com
โhttps://ninefloor.com
โ ํธ์คํธ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋์ผ ์ถ์ฒ๊ฐ ์๋http://ninefloor.com:81
โhttp://ninefloor.com
โ http์ ๊ธฐ๋ณธ ํฌํธ๋ 80์ด๊ธฐ ๋๋ฌธ์ ํฌํธ๊ฐ ๋ฌ๋ผ์ ๋์ผ ์ถ์ฒ๊ฐ ์๋https://ninefloor.com
=https://ninefloor.com:443
โ https์ ๊ธฐ๋ณธ ํฌํธ๋ 443์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋ค ๊ฐ์ ๋์ผ ์ถ์ฒ์
SOP๊ฐ ์๊ธด ์ด์
๋์ผ ์ถ์ฒ ์ ์ฑ ์ ์ ์ฌ์ ์ผ๋ก ํด๋ก์ธ ์ ์๋ ๋ฌธ์๋ฅผ ๋ถ๋ฆฌํจ์ผ๋ก์จ ๊ณต๊ฒฉ๋ฐ์ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ค์ฌ์ค๋ค. ๋ณด์์์ ์ํ์ผ๋ก๋ถํฐ ์์ ํด์ง ์ ์๋ค๋ ๋ป์ด๊ธฐ๋ ํ๋ค. ๋ง์ฝ SOP๊ฐ ์๋ค๋ฉด ๋ธ๋ผ์ฐ์ ๋ด์ ๋จ์์๋ ๋ค๋ฅธ ์๋น์ค์ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๊ณต๊ฒฉ ์๋๋ฅผ ๊ฐ์ง ๋ค๋ฅธ ์ฌ์ดํธ์์ ์ฝ๊ฒ ํ์ทจํ ์ ์๋ค.
ํ์ง๋ง SOP๋ ์ ์ด์ ๋์ผ ์ถ์ฒ๊ฐ ์๋ ๋ค๋ฅธ ์ฌ์ดํธ์์ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ์ ํํ๊ธฐ ๋๋ฌธ์ ํ ์ฌ์ดํธ์ ์ ๋ณด๊ฐ ์์ด๋๊ฐ๋ ๊ฒ์ ๋ฏธ์ฐ์ ๋ฐฉ์งํ ์ ์๋ ๊ฒ์ด๋ค.
SOP๋ ๋ณด์์ ์ํ ์ ์ฑ . ํ์ง๋งโฆ
ํ์ง๋ง, ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ์ผ์ ์ ๋ง ๋ง๋ค. ๋ก์ปฌ ํ๊ฒฝ์์๋ถํฐ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋ถ๋ฆฌ๋์ด ์๋ค๋ฉด ๋์ ์ถ์ฒ๊ฐ ๋ฌ๋ผ์ง๊ฒ ๋๊ณ , ๊ฐ๋ฐ์ค์ธ ์น ์ฌ์ดํธ์์ ์ธ๋ถ API๋ฅผ ์ด์ฉํด ๋ค๋ฅธ ๋ฆฌ์์ค๋ฅผ ๋ฐ์์ค๊ณ ์ถ๋ค๋ฉด ๋ชจ๋ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก SOP ์ ์ฑ ์ ์ฌ์ฉํ๊ณ ์๋๋ฐ, ์ด๋ป๊ฒ ํ๋ฉด ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ๋ฐ์์ฌ ์ ์์๊น?
CORS
CORS๋ Cross-Origin Resource Sharing์ ์ค์๋ง๋ก ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ๋ปํ๋ค. MDN์์๋ โ์ถ๊ฐย HTTPย ํค๋๋ฅผ ์ฌ์ฉํ์ฌ, ํย ์ถ์ฒ์์ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ฃผ๋ ์ฒด์ โ๋ก ์ค๋ช ํ๊ณ ์๋ค. ์ฆ, ๋ธ๋ผ์ฐ์ ๋ SOP์ ์ํด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ๋ง์ง๋ง CORS๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๊ทผ ๊ถํ์ ์ป์ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
CORS์ ๋์ ๋ฐฉ์
1. ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ (Preflight Request)
์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ , OPTIONS ๋ฉ์๋๋ก ์ฌ์ ์์ฒญ์ ๋ณด๋ด ํด๋น ์ถ์ฒ ๋ฆฌ์์ค์ ์ ๊ทผ ๊ถํ์ด ์๋์ง ๋จผ์ ํ์ธํ๋ ๊ฒ์ด๋ค. ์์ ํ๋ฆ๊ณผ ๊ฐ์ด ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์ ์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ OPTIONS ๋ฉ์๋๋ก ๋ณด๋ด๊ณ , ์๋ต ํค๋์ Access-Contral-Allow-Origin
์ผ๋ก ์์ฒญ์ ๋ณด๋ธ ์ถ์ฒ๊ฐ ๋์์ค๋ฉด ์ค์ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ค.
๋ง์ฝ ์์ฒญ์ ๋ณด๋ธ ์ถ์ฒ๊ฐ ์ ๊ทผ ๊ถํ์ด ์๋ค๋ฉด ๋ธ๋ผ์ฐ์ ์์ CORS ์๋ฌ๋ฅผ ๋์ฐ๊ณ ์ค์ ์์ฒญ์ ์ ๋ฌํ์ง ์๋๋ค.
2. ๋จ์ ์์ฒญ (Simple Request)
๋จ์ ์์ฒญ์ ํน์ ์กฐ๊ฑด ๋ง์กฑ ์ ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ ์๋ตํ๊ณ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ๋งํ๋ค. ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ์ง๋ง, ์ด ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑ์ํค๋ ๊ฒ์ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ฐธ๊ณ ์ ๋ ํ๋ฉด ๋๋ค.
GET
,HEAD
,POST
์์ฒญ ์ค ํ๋์ฌ์ผ ํ๋ค.
- ์๋์ผ๋ก ์ค์ ๋๋ ํค๋ ์ธ์
Accept
,Accept-Language
,Content-Language
,Content-Type
ํค๋์ ๊ฐ๋ง ์๋์ผ๋ก ์ค์ ํ ์ ์๋ค. ์ด ๋,Content-Type
ํค๋์๋application/x-www-form-urlencoded
,multipart/form-data
,text/plain
๊ฐ๋ง ํ์ฉ๋๋ค.
3. ์ธ์ฆ์ ๋ณด๋ฅผ ํฌํจํ ์์ฒญ (Credentialed Request)
์์ฒญ ํค๋์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ๋ณด๋ด๋ ์์ฒญ์ด๋ค. ์ถ์ฒ๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ ๋ณ๋์ ์ค์ ์ ํ์ง ์์ผ๋ฉด ๋ฏผ๊ฐํ ์ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์ฟ ํค๋ฅผ ๋ณด๋ผ ์ ์๋ค. ์ด ๊ฒฝ์ฐ ํ๋ก ํธ, ์๋ฒ ์์ธก ๋ชจ๋ CORS ์ค์ ์ด ํ์ํ๋ค.
- ํ๋ก ํธ : ์์ฒญ ํค๋์
withCredentials : true
๋ฅผ ๋ฃ์ด์ผ ํ๋ค.
- ์๋ฒ : ์๋ต ํค๋์
Access-Control-Allow-Credentials : true
๋ฅผ ๋ฃ์ด์ค์ผ ํ๋ค. โ ์ด ๋, ์๋ฒ์ธก์์Access-Control-Allow-Origin
๋ฅผ ์ค์ ํ ๋ ๋ชจ๋ ์ถ์ฒ๋ฅผ ํ์ฉํ๋ค๋ ์์ผ๋์นด๋(*
)๋ก ์ค์ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
CORS ์ค์ ๋ฐฉ๋ฒ
Node.js ์๋ฒ
const http = require('http');
const server = http.createServer((request, response) => {
// ๋ชจ๋ ๋๋ฉ์ธ
response.setHeader("Access-Control-Allow-Origin", "*");
// ํน์ ๋๋ฉ์ธ
response.setHeader("Access-Control-Allow-Origin", "https://codestates.com");
// ์ธ์ฆ ์ ๋ณด๋ฅผ ํฌํจํ ์์ฒญ์ ๋ฐ์ ๊ฒฝ์ฐ
response.setHeader("Access-Control-Allow-Credentials", "true");
})
Express ์๋ฒ
Express ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด ์๋ฒ๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ, cors ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํด ๋ณด๋ค ๋ ๊ฐ๋จํ๊ฒ CORS๋ฅผ ์ค์ ํ ์ ์๋ค.
const cors = require("cors");
const app = express();
//๋ชจ๋ ๋๋ฉ์ธ
app.use(cors());
//ํน์ ๋๋ฉ์ธ
const options = {
origin: "https://codestates.com", // ์ ๊ทผ ๊ถํ์ ๋ถ์ฌํ๋ ๋๋ฉ์ธ
credentials: true, // ์๋ต ํค๋์ Access-Control-Allow-Credentials ์ถ๊ฐ
optionsSuccessStatus: 200, // ์๋ต ์ํ 200์ผ๋ก ์ค์
};
app.use(cors(options));
//ํน์ ์์ฒญ
app.get("/example/:id", cors(), function (req, res, next) {
res.json({ msg: "example" });
});
Uploaded by N2T