์ค๋์ cors๊ฐ ๋ฌด์์ธ์ง ์์๋ณด๊ณ node.js๋ฅผ ์ด์ฉํ์ฌ ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ค.
๋ํ ๊ณผ์ mini-node server๋ฅผ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ง์ ๋ง๋ค์ด๋ณผ ์์ ์ด๋ค.
๊ฐ์ JavaScript๋ฅผ ์ฌ์ฉํ์ง๋ง node.js ํ๊ฒฝ์์ ์ฌ์ฉํ๋ ์ฝ๋์๋,
CommonJS๋ ๋ชจ๋ ๋ฑ ๋ธ๋ผ์ฐ์ ์์ ์ฐพ์๋ณผ ์ ์๋ ๋ค์ ์์ํ ๊ฐ๋
์ด ํฌํจ๋์ด ์๋ค.
node.js์์ ์ฌ์ฉํ๋ ์ด ๊ฐ๋
๋ค์ ๋ฐฑ์๋๋ฟ๋ง ์๋๋ผ,
ํ๋ก ํธ์๋์์๋ ์ ๊ทน ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, API ์๋ฒ ๋ํ ๊ตฌํํ ์ค ์์์ผ ํ๋ค.
์๋ก์ด ์๋น์ค๋ฅผ ๋ง๋ค๋ ค๊ณ ํด๋, ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ๋ถ๋ฌ์ค๋ ๊ธฐ๋ณธ์ ์ธ API ์๋ฒ๋ฅผ
๊ตฌํํ ์ ์๋ค๋ฉด ์๋ฌด๋ฐ ๋์ ํ๋์ ํ ์ ์๋ ํด๋ผ์ด์ธํธ๋ง ๊ตฌํํ๊ฒ ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ์ฌ์ง์ ์น ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด, ์ด ์๋ฌ๋ฅผ ์ ์ด๋ ํ ๋ฒ์ฏค์ ๊ฒช๊ฒ ๋๊ณ , ๊ณจ๋จธ๋ฆฌ๋ฅผ ์๊ฒ ๋๋ CORS ์๋ฌ์ด๋ค.
CORS๊ฐ ๋์ฒด ๋ญ๊ธธ๋.. ์์๋ณด๊ธฐ ์ ์, CORS๊ฐ ํ์ํ๊ฒ ๋ ๋ฐฐ๊ฒฝ์ธ SOP์ ๋ํด์ ๋จผ์ ์์๋ณด๋๋ก ํ์.
SOP
SOP์ Same-Origin Policy์ ์ค์๋ง๋ก, ๋์ผ ์ถ์ฒ ์ ์ฑ ์ ๋ปํ๋ค.
ํ ๋ง๋๋ก โ๊ฐ์ ์ถ์ฒ์ ๋ฆฌ์์ค๋ง ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๋คโ๋ผ๋ ์ ์ฑ ์ด๋ค. ์ฌ๊ธฐ์ ๋งํ๋ โ์ถ์ฒ(Origin)โ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ถ์ฒ๋ ํ๋กํ ์ฝ, ํธ์คํธ, ํฌํธ์ ์กฐํฉ์ผ๋ก ๋์ด์๋ค. ์ด ์ค ํ๋๋ผ๋ ๋ค๋ฅด๋ฉด ๋์ผํ ์ถ์ฒ๋ก ๋ณด์ง ์๋๋ค.
๊ทธ๋ ๋ค๋ฉด SOP์ ์ ์๊ฒจ๋ฌ์๊น?
๋์ผ ์ถ์ฒ ์ ์ฑ ์ ์ ์ฌ์ ์ผ๋ก ํด๋ก์ธ ์ ์๋ ๋ฌธ์๋ฅผ ๋ถ๋ฆฌํจ์ผ๋ก์จ ๊ณต๊ฒฉ๋ฐ์ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ค์ฌ์ค๋ค.
๋ค์ด๋ฒ ๊ฐ์ ์น ํ์ด์ง์ ๋ก๊ทธ์ธํด์ ์๋น์ค๋ฅผ ์ด์ฉํ๊ณ ์๋ค๊ณ ํด๋ณด์.
๋ง์ฝ ๋ก๊ทธ์์์ ๊น๋นกํ๊ฑฐ๋ ์๋ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ผ๋ก ์ธํด ๋ธ๋ผ์ฐ์ ์ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ๋จ์์๋ ์ํฉ์ด๋ผ๋ฉด?
๊ทธ ์ํ์์ ๋์ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๋
ธ๋ฆฌ๋ ์ฝ๋๊ฐ ์๋ ๋ค๋ฅธ ์ฌ์ดํธ์ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ค๋ฉด?
ํด์ปค๋ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์ด์ฉํด์ ๋ค์ด๋ฒ์์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์๊ฒ ๋๋ค.
SOP์ด ์์๋ค๋ฉด?
์ ์ด์ SOP๋ ๋ค๋ฅธ ์ฌ์ดํธ์์ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ์ ํํ๊ธฐ ๋๋ฌธ์ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ํ ์ฌ์ดํธ์ ์ฝ๋์ ์ํด์ ์์ด๋๊ฐ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์๋ค. ์ด๋ฌํ ๋ณด์์ ์ด์ ๋๋ฌธ์ SOP์ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ ์ ์ฑ ์ด๋ค.
๊ทธ๋ฐ๋ฐ, ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ์ผ์ ๋๋ฌด๋๋ ๋ง๋ค.
๋น์ฅ ๋ก์ปฌ ํ๊ฒฝ์์ ๊ฐ๋ฐํ ๋์๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ฅผ ๋ฐ๋ก ๊ฐ๋ฐํ๊ฒ ๋๋ค๋ฉด ๋์ ์ถ์ฒ๊ฐ ๋ฌ๋ผ์ง๋ค.
๊ฐ๋ฐ ์ค์ธ ์น ์ฌ์ดํธ์์ ๋ค์ด๋ฒ ์ง๋ api๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด? github ์ ๋ณด๋ฅผ ๋ฐ์์์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด?
๋ชจ๋ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ผ์ด๋ค.
ํ์ง๋ง, ๋งํ๋ฏ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก SOP ์ ์ฑ
์ ์ฌ์ฉํ๊ณ ์๋ค.
์ด๋ป๊ฒ ํ๋ฉด ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ๋ฐ์์ฌ ์ ์์๊น?
CORS
์ ๋ฌธ์ ์ํฉ์์ ํ์ํ ๊ฒ์ด ๋ฐ๋ก CORS์ด๋ค.
CORS๋ Cross-Origin Resource Sharing์ ์ค์๋ง๋ก ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ๋ปํ๋ค.
MDN์์๋ CORS๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ๊ณ ์๋ค.
CORS - ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (Cross-Origin Resource Sharing, CORS)๋ ์ถ๊ฐ HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ, ํ ์ถ์ฒ์์ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ฃผ๋ ์ฒด์
์ฆ, ๋ธ๋ผ์ฐ์ ๋ SOP์ ์ํด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ๋ง์ง๋ง, CORS๋ก ์ ๊ทผ ๊ถํ์ ์ป์ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ง๊ธ๊น์ง ๊ณต๋ถํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ด ์๋ฌ๋ฅผ ์ฝ๊ณ ์น์ ํ๊ฒ ํ์ด์ ์ฐ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด๋ค.
๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ํ์ง๋ง SOP ๋๋ฌธ์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค.
CORS ์ค์ ์ ํตํด ์๋ฒ์ ์๋ต ํค๋์ โAccess-Control-Allow-Originโ์ ์์ฑํ๋ฉด ์ ๊ทผ ๊ถํ์ ์ป์ ์ ์๋ค.
์ฆ, ์ด ์๋ฌ๋ CORS ๋๋ฌธ์ด ์๋๋ผ, SOP ๋๋ฌธ์ด๋ค.
CORS๋ ์คํ๋ ค ์ด ์๋ฌ๋ฅผ ํด๊ฒฐํด ์ค ์ ์๋ ๋ฐฉ์์ด์๋ ๊ฒ์ด๋ค!
CORS์ ๋์ ๋ฐฉ์์๋ ํฌ๊ฒ ์ธ ๊ฐ์ง๊ฐ ์๋ค.
1. ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ (Preflight Request)
์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ , 'OPTIONS' ๋ฉ์๋๋ก ์ฌ์ ์์ฒญ์ ๋ณด๋ด ํด๋น ์ถ์ฒ ๋ฆฌ์์ค์
์ ๊ทผ ๊ถํ์ด ์๋์ง๋ถํฐ ํ์ธํ๋ ๊ฒ์ ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ด๋ผ๊ณ ํ๋ค.
์ ์ด๋ฏธ์ง์ ํ๋ฆ๊ณผ ๊ฐ์ด, ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์ ์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ ๋ณด๋ด๊ณ ,
์๋ต ํค๋์ Access-Control-Allow-Origin์ผ๋ก ์์ฒญ์ ๋ณด๋ธ ์ถ์ฒ๊ฐ ๋์์ค๋ฉด ์ค์ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ค.
๋ง์ฝ์ ์์ฒญ์ ๋ณด๋ธ ์ถ์ฒ๊ฐ ์ ๊ทผ ๊ถํ์ด ์๋ค๋ฉด ๋ธ๋ผ์ฐ์ ์์ CORS ์๋ฌ๋ฅผ ๋์ฐ๊ฒ ๋๊ณ , ์ค์ ์์ฒญ์ ์ ๋ฌ๋์ง ์๋๋ค.
์ด๋ฌํ ๊ณผ์ ๋๋ถ์ ์ค์ ์์ฒญ์ ์ฒ์๋ถํฐ ํต์งธ๋ก ๋ณด๋ด๋ ๊ฒ๋ณด๋ค ๋ฆฌ์์ค ์ธก๋ฉด์์ ํจ์จ์ ์ด๋ฉฐ,
CORS์ ๋๋น๊ฐ ๋์ด์์ง ์์ ์๋ฒ๋ฅผ ๋ณดํธํ ์ ์๋ค.
CORS ์ด์ ์ ๋ง๋ค์ด์ง ์๋ฒ๋ค์ SOP ์์ฒญ๋ง ๋ค์ด์ค๋ ์ํฉ์ ๊ณ ๋ คํ๊ณ ๋ง๋ค์ด์ก๋ค.
๋ฐ๋ผ์ ๋ค๋ฅธ ์ถ์ฒ์์ ๋ค์ด์ค๋ ์์ฒญ์ ๋ํ ๋๋น๊ฐ ๋์ด์์ง ์์๋ค.
2. ๋จ์ ์์ฒญ (Simple Request)
๋จ์ ์์ฒญ์ ํน์ ์กฐ๊ฑด์ด ๋ง์กฑ๋๋ฉด, ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ ์๋ตํ๊ณ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ๋งํ๋ค.
๋ํ์ ์ผ๋ก ์๋ 3๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๋ง์กฑํ ๋๋ง ๊ฐ๋ฅํ๋ค.
์ด์ฒ๋ผ ๋ค์ ๊น๋ค๋ก์ด ์กฐ๊ฑด๋ค์ด ๋ง๊ธฐ ๋๋ฌธ์, ์ ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑ๋์ด ๋จ์ ์์ฒญ์ด ์ผ์ด๋๋ ์ํฉ์ ๋๋ฌผ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
๋๋ถ๋ถ HTTP API ์์ฒญ์ text / xml ์ด๋ application / json ์ผ๋ก ํต์ ํ๊ธฐ ๋๋ฌธ์ 3๋ฒ์งธ Content-Type์ด ์๋ฐ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ '๋๋ถ๋ถ์ API ์์ฒญ์ ์๋น ์์ฒญ(preflight)์ด๋ค' ๋ผ๊ณ ์ดํดํ๋ฉด ๋๋ค.
3. ์ธ์ฆ์ ๋ณด๋ฅผ ํฌํจํ ์์ฒญ (Credentialed Request)
์์ฒญ ํค๋์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ๋ณด๋ด๋ ์์ฒญ์ด๋ค.
์ถ์ฒ๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ์๋ ๋ณ๋์ ์ค์ ์ ํ์ง ์์ผ๋ฉด ์ฟ ํค๋ฅผ ๋ณด๋ผ ์ ์๋ค. ๋ฏผ๊ฐํ ์ ๋ณด์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ๊ฒฝ์ฐ์๋ ํด๋ผ์ด์ธํธ, ์๋ฒ ์์ธก ๋ชจ๋ 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 ์ค์ ์ ํด์ค ์ ์๋ค.
๋ธ๋ผ์ฐ์ ์๋ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ํด fetch ๊ฐ์ HTTP ์์ฒญ์ ๋ณด๋ด๋ ๋๊ตฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ๋์ด ์๋ค.
์๋ฒ๋ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์ HTTP ์์ฒญ์ ๋ง๊ฒ ์๋ต์ ๋ณด๋ผ ์ ์๋๋ก ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค.
Node.js๋ HTTP ์์ฒญ์ ๋ณด๋ด๊ฑฐ๋, ์๋ต์ ๋ฐ์ ์ ์๋ ๋๊ตฌ๋ค์ ์ ๊ณตํ๋ค
HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ๋ณด๋ด ์ฃผ๋ ํ๋ก๊ทธ๋จ์ ์น ์๋ฒ(Web Server)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ด๋ฒ ๊ณผ์ ์์๋ Node.js์ http ๋ชจ๋์ ์ด์ฉํด ์น ์๋ฒ๋ฅผ ๋ง๋ ๋ค. - ์ฐธ๊ณ ์๋ฃ โจ
Node.js์์ ํ์ผ์ ์ฝ๊ฑฐ๋ ์ฐ๊ธฐ ์ํด fs ๋ชจ๋์ ์ฌ์ฉํ๋ฏ์ด, HTTP ์์ฒญ๊ณผ ์๋ต์ ๋ค๋ฃจ๊ธฐ ์ํด HTTP ๋ชจ๋์ ์ฌ์ฉํ๋ค.
์๋ฒ ์คํ
ํด๋ผ์ด์ธํธ ์คํ
client/index.html๋ฅผ ์น ๋ธ๋ผ์ฐ์ ์์ ์คํํฉ๋๋ค.
ํน์ ํฌํธ๋ก ํด๋ผ์ด์ธํธ๋ฅผ ์คํํ๊ณ ์ถ๋ค๋ฉด, serve๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
npx serve -l ํฌํธ๋ฒํธ client/
์ด๋ฒ ๊ณผ์ ์์ ๊ตฌํํ๋ ์น ์๋ฒ์ ๊ธฐ๋ฅ์ ๋งค์ฐ ๋จ์ํ๋ค.
ํด๋ผ์ด์ธํธ์ ์ก์
(๋ฒํผ ํด๋ฆญ)์ ๋ฐ๋ผ ๊ฐ๊ธฐ ๋ค๋ฅธ HTTP ์์ฒญ์ ์๋ฒ๋ก ๋ณด๋ด๊ณ ,
HTTP ์์ฒญ์ ๋ด์ ๋ณด๋ธ ๋จ์ด๋ฅผ ์๋ฌธ์ ๋๋ ๋๋ฌธ์๋ก ์๋ต์ ๋ฐ์ ํ๋ฉด์ ๋ณด์ฌ ์ค๋ค.
โ๏ธ Code
// ๐ฌ ์ฃผ์ด์ง ์ฝ๋
const http = require("http");
const PORT = 4999;
const ip = "localhost";
const server = http.createServer((request, response) => {
console.log(
`http request method is ${request.method}, url is ${request.url}`
);
response.writeHead(200, defaultCorsHeader);
response.end("hello mini-server sprints");
});
server.listen(PORT, ip, () => {
console.log(`http server listen on ${ip}:${PORT}`);
});
const defaultCorsHeader = {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type, Accept",
"Access-Control-Max-Age": 10,
};
// โ
๊ตฌํํ ์ฝ๋
const http = require("http");
const PORT = 4999;
const ip = "localhost";
const server = http.createServer((request, response) => {
// GET / ์์ฒญ ์ฒ๋ฆฌ
if (request.method === "GET" && request.url === "/") {
response.writeHead(200, defaultCorsHeader); // 200 OK ์๋ต ์ฝ๋์ CORS ํค๋๋ฅผ ๋ฐํ
response.end("hello mini-server sprints"); // "hello mini-server sprints"๋ฅผ ์๋ต์ผ๋ก ๋ณด๋
}
// OPTIONS ๋ฉ์๋์ ๋ํ ์ฒ๋ฆฌ
else if (request.method === "OPTIONS") {
response.writeHead(204, defaultCorsHeader); // 204 No Content ์๋ต ์ฝ๋์ CORS ํค๋๋ฅผ ๋ฐํ
response.end();
return;
}
// POST /lower ์์ฒญ ์ฒ๋ฆฌ
else if (request.method === "POST" && request.url === "/lower") {
let requestBody = "";
request.on("data", (text) => {
requestBody += text.toString();
});
request.on("end", () => {
const convertedText = requestBody.toLowerCase(); // ๋ฐ์ ํ
์คํธ๋ฅผ ์๋ฌธ์๋ก ๋ณํ
response.writeHead(200, defaultCorsHeader); // 200 OK ์๋ต ์ฝ๋์ CORS ํค๋๋ฅผ ๋ฐํ
response.end(convertedText); // ๋ณํ๋ ํ
์คํธ๋ฅผ ์๋ต์ผ๋ก ๋ณด๋
});
}
// POST /upper ์์ฒญ ์ฒ๋ฆฌ
else if (request.method === "POST" && request.url === "/upper") {
let requestBody = "";
request.on("data", (text) => {
requestBody += text.toString();
});
request.on("end", () => {
const convertedText = requestBody.toUpperCase(); // ๋ฐ์ ํ
์คํธ๋ฅผ ๋๋ฌธ์๋ก ๋ณํ
response.writeHead(200, defaultCorsHeader); // 200 OK ์๋ต ์ฝ๋์ CORS ํค๋๋ฅผ ๋ฐํ
response.end(convertedText); // ๋ณํ๋ ํ
์คํธ๋ฅผ ์๋ต์ผ๋ก ๋ณด๋
});
}
// ๊ทธ ์ธ์ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ (404 Not Found)
else {
response.statusCode = 404; // 404 Not Found ์๋ต ์ฝ๋๋ฅผ ์ค์
response.end(); // ์๋ต ์ข
๋ฃ
}
// ์กฐ๊ธ ๋ ๋ณดํธ์ ์ธ ์๋ฌ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
// request.on("error", (err) => {
// console.error(err);
// response.statusCode = 400;
// response.end();
// });
// response.on("error", (err) => {
// console.error(err);
// });
console.log(
`http request method is ${request.method}, url is ${request.url}`
);
});
server.listen(PORT, ip, () => {
console.log(`http server listen on ${ip}:${PORT}`);
});
// ์๋ต ํค๋
const defaultCorsHeader = {
"Access-Control-Allow-Origin": "*", // ๋ชจ๋ ์ถ์ฒ์์์ ์์ฒญ์ ํ์ฉ
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS", // ์ํ๋ HTTP ๋ฉ์๋๋ฅผ ๋ช
์
"Access-Control-Allow-Headers": "Content-Type, Accept", // ํ์ฉํ๋ ์์ฒญ ํค๋๋ฅผ ๋ช
์
"Access-Control-Max-Age": 10, // Preflight ์์ฒญ์ ์บ์ฑ ์๊ฐ์ ์ค์
};
๊ตฌํํ ์๋ฒ
๊ตฌํํ ํด๋ผ์ด์ธํธ
์๋ ์์