[Node.js] http 모듈로 웹 서버 만들기 (1)
http 모듈로 웹 서버 만들기
http 모듈이 서버의 역할을 하고, 노드는 http 모듈을 실행해주기만 한다.
- http 기본 포트 : 80
- https 기본 포트 : 443
- 기본 포트는 생략 가능하다.
- 포트가 다르면 호스트가 같더라도 다른 사이트처럼 동작할 수 있다.
const http = require("http");
const server = http
.createServer((req, res) => {
// 요청(req)이 왔을 때 꼭 수락해야 하는 것은 아니고, 거절할 수도 있다.
console.log("서버 실행");
res.write("<h1>Hello Node!</h1>");
res.write("<h2>Hello JS!</h2>");
res.write("<h2>Hello JS!</h2>");
res.write("<h2>Hello JS!</h2>");
res.write("<h2>Hello JS!</h2>");
res.end("<p>Hello Server!</p>");
})
.listen(8080); // listen이 서버 프로그램을 죽지 않고 계속 유지시켜준다.
server.on("listening", () => {
console.log("8080번 포트에서 서버 대기중입니다.");
});
server.on("error", err => {
console.error(err);
});
응답으로 파일 읽어 보내기
노드 서버의 역할은 버퍼에 데이터를 담아서 보내는 것 까지이다.
const http = require("http");
const fs = require("fs");
const server = http
.createServer((req, res) => {
// 요청(req)이 왔을 때 꼭 수락해야 하는 것은 아니고, 거절할 수도 있다.
console.log("서버 실행");
fs.readFile("./server02.html", (err, data) => {
if (err) {
throw err;
}
// html 파일의 버퍼가 담긴 data를 end 응답으로 보내준다.
res.end(data);
});
})
.listen(8080); // listen이 서버 프로그램을 죽지 않고 계속 유지시켜준다.
server.on("listening", () => {
console.log("8080번 포트에서 서버 대기중입니다.");
});
server.on("error", err => {
console.error(err);
});
쿠키 설정하기, req.url
클라이언트와 서버 간에 데이터를 주고받는 방법에는 쿠키, 세션 등이 있다.
const http = require("http");
// 문자열 형태의 쿠키를 객체 형태로 바꿔주는 함수
const parseCookies = (cookie = "") => {
return cookie
.split(";")
.map(v => v.split("="))
.map(([k, ...vs]) => [k, vs.join("=")])
.reduce((acc, [k, v]) => {
acc[k.trim()] = decodeURIComponent(v);
return acc;
}, {});
};
const server = http
.createServer((req, res) => {
/* 쿠키를 보낼 때 */
// Set-Cookie는 쿠키를 설정하는 응답 헤더를 말한다.
// mycookie는 쿠키의 key
// test는 쿠키의 value
res.writeHead(200, { "Set-Cookie": "mycookie=test" }); // 요청 헤더에 mycookie=test라는 내용을 담아서 보낸다.
/* 쿠키를 받을 때 */
console.log(parseCookies(req.headers.cookie));
// req.url을 통해 사용자가 어떤 url을 통해 요청을 보냈는지 알 수 있다.
// 또한 다른 페이지로의 routing도 할 수 있다.
console.log(req.url);
res.end("<h1>Hello Cookie!</h1>");
})
.listen(8080); // listen이 서버 프로그램을 죽지 않고 계속 유지시켜준다.
server.on("listening", () => {
console.log("8080번 포트에서 서버 대기중입니다.");
});
server.on("error", err => {
console.error(err);
});
라우터 분기 처리와 쿠키
// http 서버의 역할을 하는 모듈
const http = require("http");
// 파일을 주고받는 모듈
const fs = require("fs");
// url 주소를 처리하는 모듈들
const url = require("url");
const qs = require("querystring");
// 문자열 형태의 쿠키를 객체 형태로 바꿔주는 함수
const parseCookies = (cookie = "") => {
return cookie
.split(";")
.map(v => v.split("="))
.map(([k, ...vs]) => [k, vs.join("=")])
.reduce((acc, [k, v]) => {
acc[k.trim()] = decodeURIComponent(v);
return acc;
}, {});
};
const server = http
.createServer((req, res) => {
// 브라우저에 저장된 쿠키정보를 받아온다.
const cookies = parseCookies(req.headers.cookie);
if (req.url.startsWith("/login")) {
const { query } = url.parse(req.url);
const { name } = qs.parse(query);
// 쿠키 만료시간 설정
const expires = new Date();
expires.setMinutes(expires.getMinutes() + 5);
res.writeHead(302, {
// 302 상태코드는 임시이동으로, 브라우저에게 Location에 적힌 페이지로 이동하라는 뜻이다.
Location: "/", // 루트 페이지로 이동한다. (리다이렉트)
// 쿠키에 로그인 사용자의 이름을 담아서 저장한다.
"Set-Cookie": `name=${encodeURIComponent(
name
)}; Expires=${expires.toGMTString()}; HttpOnly; Path=/`
});
res.end();
} else if (cookies.name) {
// 만약 파싱한 쿠키에 name이 있다면
res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
res.end(`${cookies.name}님 안녕하세요`);
} else {
fs.readFile("./server04.html", (err, data) => {
res.end(data);
});
}
})
.listen(8080); // listen이 서버 프로그램을 죽지 않고 계속 유지시켜준다.
server.on("listening", () => {
console.log("8080번 포트에서 서버 대기중입니다.");
});
server.on("error", err => {
console.error(err);
});
댓글남기기