์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- ๊ณ ์ฐจํจ์
- JavaScript
- ์ ์ด์ฝฅ ๋์จ
- prototype
- jsx
- fetch api
- ๋ฒ์ง ๋ชจํ
- ํผํฐ ๋ชจ๋น
- React
- ํผํฐ ๋ชจ๋น์ ๋ฒ์ง ๋ชจํ
- ํ ์คํธ ์์
- html
- ํ๋ก๊ทธ๋๋จธ์ค
- css
- Lifting state
- ์๋งจํฑ์์
- wai-aria
- State
- ์ปดํจํฐ ๊ณตํ
- Cmarket
- props drilling
- css animation
- ์คํ ์ด์ธ ์ฝ๋
- BFS์ DFS
- Study
- ๋ฒ๋ค๋ง
- Effect Hook
- ์คํ ์ด์ธ ์ฝ๋42๊ธฐ
- WEB
- git
- Today
- Total
roqkf
[Web Server] CORS ๋ณธ๋ฌธ

SOP
Same-Origin Policy์ ์ฝ์๋ก, ๋์ผ ์ถ์ฒ ์ ์ฑ ์ ์๋ฏธํ๋ค. ์ฆ, ๊ฐ์ ์ถ์ฒ์ ๋ฆฌ์์ค๋ง์ด ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๋ค๋ ์ ์ฑ ์ด๋ค. ์ฌ๊ธฐ์์ ์ถ์ฒ๋ ํ๋กํ ์ฝ/ ํธ์คํธ/ ํฌํธ์ ์กฐํฉ์ผ๋ก ์ด ์กฐํฉ ์ค ํ๋๋ผ๋ ๋ค๋ฅด๋ค๋ฉด ๋์ผํ ์ถ์ฒ๋ก ๋ณด์ง ์๋๋ค.
https://www.naver.com vs http://www.naver.com
[https / http] ๋ URI๋ ํ๋กํ ์ฝ์ด ๋ค๋ฅด๋ฏ๋ก ๋์ผํ ์ถ์ฒ๊ฐ ์๋
๐ค SOP ์๊ฒจ๋ ์ด์
- ๋์ผ ์ถ์ฒ ์ ์ฑ ์ ์ ์ฌ์ ์ผ๋ก ํด๋ก์ธ ์ ์๋ ๋ฌธ์๋ฅผ ๋ถ๋ฆฌํ๋ฏ๋ก์จ ๊ณต๊ฒฉ๋ฐ์ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ค์ฌ ์ค๋ค. ์ฆ, SOP์ ํตํด ํดํน์ ์ํ์์ ์์ ํด์ง ์ ์๋ค๋ ๊ฒ์ด๋ค. ๋ง์ฝ ๋์ผ ์ถ์ฒ ์ ์ฑ ์ด ์๋ ์ํฉ์ด๋ผ๋ฉด ๋ค์ด๋ฒ ๊ฐ์ ์น ํ์ด์ง์ ๋ก๊ทธ์ธํด์ ์๋น์ค๋ฅผ ์ด์ฉํ๊ณ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด, ์๋น์ค ์ด์ฉ ์ค์ด ์๋๋๋ผ๋ ๋ก๊ทธ์์์ ๊น๋นกํ๊ฑฐ๋ ์๋ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ผ๋ก ์ธํด์ ๋ธ๋ผ์ฐ์ ์ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ๋จ์์์ ์ ์๋ค. ์ด๋ฌํ ์ํ์์ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๋ ธ๋ฆฌ๋ ์ฝ๋๊ฐ ์๋ ๋ค๋ฅธ ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ค๋ฉด ๋์ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์ด์ฉํด์ ํด์ปค๊ฐ ์ด์ ๊ด๋ จ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์์ ๊ฒ์ด๋ค. SOP์ด ์๋ค๋ฉด ์ ์ด์ ๋ค๋ฅธ ์ฌ์ดํธ์์ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ์ ํํ๊ธฐ ๋๋ฌธ์ ๋ก๊ทธ์ธ์ ์ ๋ณด๊ฐ ๋ค๋ฅธ ์ฌ์ดํธ๋ก ์์ด๋๊ฐ๋ ๊ฒ์ ๋ฐฉ์ง ํ ์ ์๋ค. ํ์ง๋ง ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ์ผ์ด ๋ฌด์ํ ๋ง์๋ฐ ์ด ๋ฆฌ์์ค๋ค์ ์ด๋ป๊ฒ ๋ฐ์ ์ฌ ์ ์์๊น?
CORS
Cross-Origin Resource Sharing์ ์ฝ์๋ก, ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ์๋ฏธํ๋ค. ์ถ๊ฐ HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ถ์ฒ์์ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ฃผ๋ ์ฒด์ ์ด๋ค. CORS๊ฐ ์๋ค๋ฉด ๋ค์ด๋ฒ์์ ๋ค๋ฅธ ์ถ์ฒ์ ์ฌ์ดํธ๋ก ์ด๋ํ๊ฒ ๋ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก SOP์ ์ํด์ ๋ฆฌ์์ค ๊ณต์ ๊ฐ ๋งํ์ง๋ง CORS๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผ ๊ถํ์ ์ป๊ฒ ๋๋ค๋ ๊ฒ์ด๋ค.

- ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ํ์ง๋ง SOP ๋๋ฌธ์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
CORS ์ค์ ์ ํตํด ์๋ฒ์ ์๋ต ํค๋์ ‘Access-Control-Allow-Origin’์ ์์ฑํ๋ฉด ์ ๊ทผ ๊ถํ์ ์ป์ ์ ์์ต๋๋ค.
CORS ๋์ ๋ฐฉ์
- ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ (Preflight Request)
- ์ ๊ทผ ๊ถํ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ , OPTIONS ๋ฉ์๋๋ก ์ฌ์ ์์ฒญ์ ๋ณด๋ด ํด๋น ์ถ์ฒ ๋ฆฌ์์ค์ ์ ๊ทผ ๊ถํ์ด ์๋์ง๋ถํฐ ํ์ธํ๋ ๊ฒ

์ ์ด๋ฏธ์ง์ ํ๋ฆ๊ณผ ๊ฐ์ด, ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์ ์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ต ํค๋์ Access-Control-Allow-Origin์ผ๋ก ์์ฒญ์ ๋ณด๋ธ ์ถ์ฒ๊ฐ ๋์์ค๋ฉด ์ค์ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ค.

๋ง์ฝ์ ์์ฒญ์ ๋ณด๋ธ ์ถ์ฒ๊ฐ ์ ๊ทผ ๊ถํ์ด ์๋ค๋ฉด ๋ธ๋ผ์ฐ์ ์์ CORS ์๋ฌ๋ฅผ ๋์ฐ๊ฒ ๋๊ณ , ์ค์ ์์ฒญ์ ์ ๋ฌ๋์ง ์๋๋ค.
๐ค ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ ์ ํ์ํ ๊ฑธ๊น?
- ์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ๊ถํ ํ์ธ์ ํ ์ ์๊ธฐ ๋๋ฌธ์, ์ค์ ์์ฒญ์ ์ฒ์๋ถํฐ ํต์งธ๋ก ๋ณด๋ด๋ ๊ฒ๋ณด๋ค ๋ฆฌ์์ค ์ธก๋ฉด์์ ํจ์จ์
- CORS์ ๋๋น๊ฐ ๋์ด์์ง ์์ ์๋ฒ๋ฅผ ๋ณดํธํ ์ ์๋ค. CORS ์ด์ ์ ๋ง๋ค์ด์ง ์๋ฒ๋ค์ SOP ์์ฒญ๋ง ๋ค์ด์ค๋ ์ํฉ์ ๊ณ ๋ คํ๊ณ ๋ง๋ค์ด์ก๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ์ถ์ฒ์์ ๋ค์ด์ค๋ ์์ฒญ์ ๋ํ ๋๋น๊ฐ ๋์ด์์ง ์๋ค.
- ๋จ์ ์์ฒญ (Simple Request)
- ํน์ ์กฐ๊ฑด์ด ๋ง์กฑ๋๋ฉด ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ ์๋ตํ๊ณ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ

๐ ์กฐ๊ฑด
๐น GET, HEAD, POST ์์ฒญ ์ค ํ๋
๐น ์๋์ผ๋ก ์ค์ ๋๋ ํค๋ ์ธ์, Accept, Accept-Language, Content-Language, Content-Type ํค๋์ ๊ฐ๋ง ์๋์ผ๋ก ์ค์ ํ ์ ์๋ค. / Content-Type ํค๋์๋ application/x-www-form-urlencoded, multipart/form-data, text/plain ๊ฐ๋ง ํ์ฉ
- ์ธ์ฆ์ ๋ณด๋ฅผ ํฌํจํ ์์ฒญ (Credentialed Request)
- ์์ฒญ ํค๋์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ๋ณด๋ด๋ ์์ฒญ, ๋ณ๋์ ์ค์ ์ ํ์ง ์์ผ๋ฉด ์ฟ ํค๋ฅผ ๋ณด๋ผ ์ ์๋ค. ๋ฏผ๊ฐํ ์ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์ด ๊ฒฝ์ฐ ํ๋ก ํธ, ์๋ฒ ์์ธก ๋ชจ๋ CORS ์ค์ ์ด ํ์
๐น ํ๋ก ํธ ์ธก ์์ฒญ ํค๋์ withCredentials : true ๋ฅผ ๋ฃ์ด์ค์ผ ํจ
๐น ์๋ฒ ์ธก ์๋ต ํค๋์ Access-Control-Allow-Credentials : true ๋ฅผ ๋ฃ์ด์ค์ผ ํจ
๐น ์๋ฒ ์ธก์์ Access-Control-Allow-Origin ์ ์ค์ ํ ๋, ๋ชจ๋ ์ถ์ฒ๋ฅผ ํ์ฉํ๋ค๋ ๋ป์ ์์ผ๋์นด๋(*)๋ก ์ค์ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ค๋ฃจ๋ ๋งํผ ์ถ์ฒ๋ฅผ ์ ํํ๊ฒ ์ค์ ํด์ผ ํ๋ค.
CORS ์ค์ ๋ฐฉ๋ฒ
- 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://codestates.com");
// ์ธ์ฆ ์ ๋ณด๋ฅผ ํฌํจํ ์์ฒญ์ ๋ฐ์ ๊ฒฝ์ฐ
response.setHeader("Access-Control-Allow-Credentials", "true");
})
- Express ์๋ฒ
[Express ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด์ ์๋ฒ๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ] cors ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํด์ ๋ณด๋ค ๋ ๊ฐ๋จํ๊ฒ CORS ์ค์ ํ ์ ์๋ค.
const cors = require("cors");
const app = express(); // 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" });
});
'๐ป Development > Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JSON (0) | 2022.12.16 |
---|---|
[Web Server] Refactor Express (0) | 2022.12.16 |
REST API (0) | 2022.12.11 |
[Web] HTTP (0) | 2022.12.11 |
[Web] ๋ธ๋ผ์ฐ์ ์๋ ์๋ฆฌ (0) | 2022.12.11 |