Jieunny์ ๋ธ๋ก๊ทธ
S2) Unit 10. [Web Server] CORS ๋ณธ๋ฌธ
๐ฃ SOP
โ๏ธ Same-Origin Policy
โ๏ธ '๊ฐ์ ์ถ์ฒ์ ๋ฆฌ์์ค๋ง ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๋ค' ๋ผ๋ ์ ์ฑ
โ ์ถ์ฒ
โ๏ธ ํ๋กํ ์ฝ + ํธ์คํธ + ํฌํธ์ ์กฐํฉ์ผ๋ก ๋์ด์๋ค.
โฐ ์ด ์ค ํ๋๋ผ๋ ๋ค๋ฅด๋ฉด ๋์ผํ ์ถ์ฒ๋ก ๋ณด์ง ์๋๋ค.
โฐ ์ ์ฌ์ ์ผ๋ก ํด๋ก์ธ ์ ์๋ ๋ฌธ์๋ฅผ ๋ถ๋ฆฌํจ์ผ๋ก์จ ๊ณต๊ฒฉ๋ฐ์ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ค์ฌ์ค๋ค. -> ํดํน ๋ฑ์ ์ํ์์ ์ข ๋ ์์
โฐ ๋ค๋ฅธ ์ฌ์ดํธ์์ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ์ ํํ๊ธฐ ๋๋ฌธ์ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ํ ์ฌ์ดํธ์ ์ฝ๋์ ์ํด์ ์์ด๋๊ฐ๋ ๊ฒ์ ๋ฐฉ์ง ํ ์ ์๋ค.
โฐ ํ์ง๋ง ๋ค์ด๋ฒ ์ง๋ api๋ฅผ ์ด์ฉํ๋ค๊ฑฐ๋, gtihub์ ์ ๋ณด๋ฅผ ๋ฐ์์์ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
๐ฃ CORS
โ๏ธ Cross-origin Resource Sharing
โ๏ธ '๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ '
โฐ ์ถ๊ฐ HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ, ํ ์ถ์ฒ์์ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ฃผ๋ ์ฒด์
โฐ ์ด ์๋ฌ๋ SOP ๋๋ฌธ์ด๊ณ , CORS๋ฅผ ์ฌ์ฉํ๋ฉด ํด๊ฒฐํ ์ ์๋ค.
๐ฃ CORS ๋์ ๋ฐฉ์
1๏ธโฃ ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ(Preflight Request)
โ๏ธ ์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ , OPTIONS ๋ฉ์๋๋ก ์ฌ์ ์์ฒญ์ ๋ณด๋ด ํด๋น ์ถ์ฒ ๋ฆฌ์์ค์ ์ ๊ทผ ๊ถํ์ด ์๋์ง๋ถํฐ ํ์ธํ๋ ๊ฒ
โฐ ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์ ์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ Preflight ์์ฒญ์ ๋ณด๋ด์ ์๋ต ํค๋์ Access-Control-Allow-Origin์ผ๋ก ์์ฒญ์ ๋ณด๋ธ ์ถ์ฒ๊ฐ ๋์์ค๋ฉด ์ค์ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ค.
โฐ ์์ฒญ์ ๋ณด๋ธ ์ถ์ฒ๊ฐ ์ ๊ทผ ๊ถํ์ด ์๋ค๋ฉด ๋ธ๋ผ์ฐ์ ์์ CORS ์๋ฌ๋ฅผ ๋์ฐ๊ฒ ๋๊ณ ์ค์ ์์ฒญ์ ์ ๋ฌ๋์ง ์๋๋ค.
โ ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ ์ ์ฌ์ฉํ ๊น?
โฐ ์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ๊ถํ์ ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ ์์ฒญ์ ์ฒ์๋ถํฐ ํต์งธ๋ก ๋ณด๋ด๋ ๊ฒ ๋ณด๋ค ๋ฆฌ์์ค ์ธก๋ฉด์์ ํจ์จ์ ์ด๋ค.
โฐ CORS์ ๋๋น๊ฐ ๋์ด ์์ง ์์ ์๋ฒ๋ฅผ ๋ณดํธํ ์ ์๋ค -> DELETE๋ PUT ๊ฐ์ ๋ฉ์๋๋ ๊ถํ์ด ์๋ ์์ฒญ์ด ๋ค์ด์์ ๋ ์คํ์ํค๋ฉด ์๋๋๋ฐ, ์ค์ ์์ฒญ์ ๋จผ์ ๋ณด๋ด๋ฉด 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๋ฅผ ๋ฃ์ด์ค์ผ ํ๋ค.
โฐ ์๋ฒ ์ธก์์ Acces-Control-Allow-Origin์ ์ค์ ํ ๋, ๋ชจ๋ ์ถ์ฒ๋ฅผ ํ์ฉํ๋ค๋ ๋ป์ ์์ผ๋์นด๋(*)๋ก ์ค์ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค -> ์ถ์ฒ๋ฅผ ์ ํํ๊ฒ ์ค์ ํด์ค์ผ ํ๋ค.
๐ฃ CORS ์ค์ ๋ฐฉ๋ฒ
1๏ธโฃ 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");
})
โฐ Node.js๋ก ๊ฐ๋จํ HTTP ์๋ฒ๋ฅผ ๋ง๋ค ๊ฒฝ์ฐ
2๏ธโฃ Express ์๋ฒ
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" });
});
โฐ Express ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด์ ์๋ฒ๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ, cors ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํด์ ๋ณด๋ค ๋ ๊ฐ๋จํ๊ฒ CORS ์ค์ ์ ํด์ค ์ ์๋ค.
'CodeStates > learning contents' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Section 2. [๊ธฐ์ ๋ฉด์ ] (0) | 2023.02.10 |
---|---|
S2) Unit 10. [Web Server] Refactor Express (0) | 2023.02.07 |
S2) Unit 9. [React] Effect Hook (0) | 2023.02.02 |
S2) Unit 9. [React] React ๋ฐ์ดํฐ ํ๋ฆ (0) | 2023.02.02 |
S2) Unit 8. [HTTP/๋คํธ์ํฌ] Postman (0) | 2023.02.01 |