SOP๋?
SOP์ Same-Origin Policy์ ์ค์๋ง๋ก, ๋์ผ ์ถ์ฒ ์ ์ฑ ์ ๋งํ๋ค.
https://shinystarforever.tistory.com:443
https:// => ํ๋กํ ์ฝ
shinystarforever.tistory.com => ํธ์คํธ
443 => ํฌํธ
์ถ์ฒ(origin)๋ ํ๋กํ ์ฝ, ํธ์คํธ, ํฌํธ์ ์กฐํฉ์ผ๋ก ๋์ด์๊ณ , ์ด ์ค ํ๋๋ผ๋ ๋ค๋ฅด๋ฉด ๋์ผํ ์ถ์ฒ๋ก ๋ณด์ง ์๋๋ค.
**์์๋๊ธฐ**
http ํ๋กํ ์ฝ์ ๊ธฐ๋ณธ ํฌํธ๋ 80
https ํ๋กํ ์ฝ์ ๊ธฐ๋ณธ ํฌํธ๋ 443
SOP์ ์ ์ด์ ๋ค๋ฅธ ์ฌ์ดํธ์์ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ์ ํํ๊ธฐ ๋๋ฌธ์ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ํ ์ฌ์ดํธ์ ์ฝ๋์ ์ํด์ ์์ด๋๊ฐ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค. => ์ด๋ฌํ ๋ณด์์ ์ด์ ๋๋ฌธ์ SOP์ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ ์ ์ฑ ์ด๋ค.
ํ์ง๋ง ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค ์ฌ์ฉํ๊ฒ ๋ ์ผ์ด ๋ง๋ค. ์๋ฅผ๋ค๋ฉด, ์นด์นด์ค ์ง๋ api, github ์ ๋ณด ๋ฐ์์ ์ฐ๊ธฐ ๋ฑ๋ฑ
์ด๋ป๊ฒํ๋ฉด ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ๋ฐ์์ฌ ์ ์์๊น?
๐
CORS (Cross-Origin Resource Sharing) / ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์
์ถ๊ฐ HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ, ํ ์ถ์ฒ์์ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌ
ํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ฃผ๋ ์ฒด์ ์ด๋ค.
์ฆ, ๋ธ๋ผ์ฐ์ ๋ SOP์ ์ํด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ๋ง์ง๋ง, CORS๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๊ทผ ๊ถํ์ ์ป์ ์ ์๊ฒ ๋๋ค.
โฅ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ํ์ง๋ง SOP ๋๋ฌธ์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
CORS ์ค์ ์ ํตํด ์๋ฒ์ ์๋ต ํค๋์ ‘Access-Control-Allow-Origin’์ ์์ฑํ๋ฉด ์ ๊ทผ ๊ถํ์ ์ป์ ์ ์์ต๋๋ค.
์ฆ, ์ด ์๋ฌ๋ CORS ๋๋ฌธ์ด ์๋๋ผ, SOP ๋๋ฌธ์ด๋ค. CORS๋ ์คํ๋ ค ์ด ์๋ฌ๋ฅผ ํด๊ฒฐํด์ค ์ ์๋ ๋ฐฉ์์ด์๋ ๊ฒ์ด๋ค!
CORS ๋์ ๋ฐฉ์
1. ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ (Preflight Request)
๐ ์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ , OPTIONS ๋ฉ์๋๋ก ์ฌ์ ์์ฒญ์ ๋ณด๋ด ํด๋น ์ถ์ฒ ๋ฆฌ์์ค์ ์ ๊ทผ ๊ถํ์ด ์๋์ง๋ถํฐ ํ์ธํ๋ ๊ฒ
โฅ ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์ ์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ต ํค๋์ Access-Control-Allow-Origin์ผ๋ก ์์ฒญ์ ๋ณด๋ธ ์ถ์ฒ๊ฐ ๋์์ค๋ฉด ์ค์ ์์ฒญ์ ๋ณด๋ธ๋ค.
๋ง์ฝ์ ์์ฒญ์ ๋ณด๋ธ ์ถ์ฒ๊ฐ ์ ๊ทผ ๊ถํ์ด ์๋ค๋ฉด ๋ธ๋ผ์ฐ์ ์์ CORS ์๋ฌ๋ฅผ ๋์ฐ๊ฒ ๋๊ณ , ์ค์ ์์ฒญ์ ์ ๋ฌ๋์ง ์๋๋ค.
ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ (Preflight Request)์ ์ ์ธ๊น?
1. ์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ๊ถํ ํ์ธ์ ํ ์ ์๊ธฐ ๋๋ฌธ์, ์ค์ ์์ฒญ์ ์ฒ์๋ถํฐ ํต์งธ๋ก ๋ณด๋ด๋ ๊ฒ๋ณด๋ค ๋ฆฌ์์ค ์ธก๋ฉด์์ ํจ์จ์ ์ด๋ค.
2. CORS์ ๋๋น๊ฐ ๋์ด์์ง ์์ ์๋ฒ๋ฅผ ๋ณดํธํ ์ ์๋ค. ์ด๋ฐ ์๋ฒ์ ๋ฐ๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด ์๋ต์ ๋ณด๋ด๊ธฐ ์ ์ ์ฐ์ ์์ฒญ์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค!!
CORS์ ๋๋น๊ฐ ๋์ด์์ง ์์ ์๋ฒ๋ผ๋ ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ ๋จผ์ ๋ณด๋ด๊ฒ ๋๋ฉด, ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์์ CORS ์๋ฌ๋ฅผ ๋์์ Cross-Origin ์์ฒญ์ด ์คํ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
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 ์ค์ ๋ฐฉ๋ฒ
1. Node.js ์๋ฒ
Node.js๋ก ๊ฐ๋จํ HTTP ์๋ฒ๋ฅผ ๋ง๋ค ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ด ์๋ต ํค๋๋ฅผ ์ค์ ํด์ค ์ ์๋ค.
const http = require('http');
const server = http.createServer((request, response) => {
// ๋ชจ๋ ๋๋ฉ์ธ
response.setHeader("Access-Control-Allow-Origin", "*");
// ํน์ ๋๋ฉ์ธ
response.setHeader("Access-Control-Allow-Origin", "https://shinystarforever.tistory.com");
// ์ธ์ฆ ์ ๋ณด๋ฅผ ํฌํจํ ์์ฒญ์ ๋ฐ์ ๊ฒฝ์ฐ
response.setHeader("Access-Control-Allow-Credentials", "true");
})
2. Express ์๋ฒ
Express ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด์ ์๋ฒ๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์๋, cors ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํด์ ๋ณด๋ค ๋ ๊ฐ๋จํ๊ฒ CORS ์ค์ ์ ํด์ค ์ ์๋ค.
const cors = require("cors");
const app = express();
//๋ชจ๋ ๋๋ฉ์ธ
app.use(cors());
//ํน์ ๋๋ฉ์ธ
const options = {
origin: "https://shinystarforever.tistory.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" });
});
๐ ์๋ชป๋ ๊ฐ๋ ์ ๋ฌ์ด ์๋ค๋ฉด ๋๊ธ ๋ถํ๋๋ฆฝ๋๋ค. ์ ์ ์ฑ์ฅ์ ํฐ ๋์์ด ๋ฉ๋๋ค๐ค
'๐ฌComputer Science > ๋คํธ์ํฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TIL) OSI 7๊ณ์ธต ๋ชจ๋ธ, TCP / IP 4๊ณ์ธต ๋ชจ๋ธ ์ ๋ฆฌ (0) | 2022.07.13 |
---|---|
TIL) ํ์ ๊ตํ ๋ฐฉ์๊ณผ ํจํท ๊ตํ ๋ฐฉ์ ์ฐจ์ด, IP ํจํท์ ํ๊ณ, TCP์ UDP (0) | 2022.07.13 |
TIL) REST API, REST API๋ฅผ ๋์์ธํ๋ ๋ฐฉ๋ฒ (0) | 2022.06.10 |
TIL) SSR๊ณผ CSR ์ฐจ์ด์ , ์น ๊ฐ๋ฐ์์ ์ค์ํ ๊ฐ๋ (0) | 2022.06.09 |
TIL) AJAX, AJAX ์ฅ๋จ์ (0) | 2022.06.09 |