섹션3 노드 기본
HTTP 서버 만들기
http 서버를 만드는 'http' 모듈 을 사용해서 서버를 만들어보자
// http 모듈 불러오기
const http = require('http');
// 서버생성
const server = http.createServer((req, res) => {
// http 응답 헤더를 구성
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
// 응답하는 본문에 데이터를 쓰는데 사용 ( 큰데이터를 여러번 나눠 전송할수있음 )
res.write('<h1>Hello Node!</h1>');
// 응답을 완료하고 클라이언트에 전송할 데이터
res.end('<p>Hello Server!</p>');
});
server.listen(8080);
server.on('listening', () => {
console.log('8080번 포트에서 서버 대기 중입니다!');
});
server.on('error', (error) => {
console.error(error);
});
이제 브라우저에 로컬호스트 http://localhost:8080 으로 접속해보면 접속될것이다.
그리고 HTTP의 80 HTTPS 는 443 기본 포트값을 가지고있다.
서버 실행후 코드를 수정하거나 추가했을경우는 서버를 재시작을해줘야 반영된다.
REST API
인터넷에서 데이터를 주고받기위한 프로토콜 규칙이다.
웹상에서 서로다른 시스템이 통신하는 방법을 정의하는데
HTTP URI 를 통해 자원 을 명시하고 HTTP Method ( Get, put , post , delete) 를 사용해
해당 자원에 대한 기능을 적용하는것이다
예를들어 /user 라고 하면 유저정보를 가져오기
/profile 하면 프로파일 정보를 가져오는 것처럼 rest api 규칙에 맞게 서버주소를 정하는것이다.
Create : 생성(POST)
Read : 조회(GET)
Update : 수정(PUT)
Delete : 삭제(DELETE)
HEAD: header 정보 조회(HEAD)
쿠키
웹사이트가 브라우저에 저장되는 작은 데이터 조각이다 .
쿠키는 사용자가 웹사이트를 방문하면 웹사이트는 사용자의 브라우저에 쿠키를 저장할수있다.
이 쿠키에 로그인정보 , 사이트선호도 , 장바구니 내용등 데이터를 담을수있고
이데이터는 사용자가 다시 방문했을때 브라우저는 서버에 쿠키를 전송해서
사용자를 식별하거나 로그인상태 맞춤형 컨텐츠 등을 보여줄수있다.
쿠키는 3가지정도 주요 용도가 있다
- 세션 관리 - 로그인 등 사용자의 세션정보를 저장
- 개인화 - 사용자의 선호도 와 설정을 저장
- 트래킹 - 사용자의 브라우징 행동과 패턴을 추적하여 맞춤형 광고에 활용
const http = require('http');
http.createServer((req, res) => {
console.log(req.url, req.headers.cookie);
const expires = new Date(Date.now() + oneDay).toUTCString();
// Set-Cookie 를 사용해 클라이언트에 쿠카를 설정할수있다.
// Expires 를 사용해 쿠키의 만료기한을 설정할수있다.
res.writeHead(200, { 'Set-Cookie': 'mycookie=test'; `Expires = ${expires}`});
res.end('Hello Cookie');
})
.listen(8083, () => {
console.log('8083번 포트에서 서버 대기 중입니다!');
});
세션
세션은 웹사이트 서버가 사용자의 브라우저와의 연결 상태를 추적하는 방법이다.
일반적으로 사용자가 시작할때 서버는 고유한 세션 ID 를 생성한다. 이는 사용자의 브라우저 저장되며 보통 쿠키를 통해 관리한다.
서버는 세션 ID 와 연관된 데이터를 서버 에 저장하고 사용자가 사이트를 탐색할동안 유지된다.
사용자가 브라우저에 요청을 보낼때마다 세션 ID 와 함께 전송된다. 서버는 ID 를 통해 사용자 세션 데이터에 접근한다.
그리고 사용자가 브라우저를 닫거나 로그아웃할때 종료된다. 이때 서버는 세션 데이터를 삭제하고 ID 는 유효하지않게된다.
const http = require("http");
const uuid = require("node-uuid");
const sessionStore = {}; // 세션 저장소
http.createServer((req, res) => {
let sessionId = req.headers.cookie;
if (!sessionId) {
// 새로운 세션 ID 생성
sessionId = uuid.v4();
res.setHeader("Set-Cookie", `sessionId=${sessionId}`);
sessionStore[sessionId] = {/* 세션 데이터 저장 */};
} else {
// 기존 세션 사용
let sessionData = sessionStore[sessionId];
if (sessionData) {
// 세션 데이터 사용
} else {
// 세션 ID가 유효하지 않은 경우
res.setHeader("Set-Cookie", `sessionId=${uuid.v4()}`);
sessionStore[sessionId] = {/* 새 세션 데이터 저장 */};
}
}
res.end("Hello World!");
}).listen(3000);
HTTPS
HTTPS 모듈을 통해서 사용하면 보안을 강화할수있다.
공식인증기관에서 받은 인증서를 통해서 서버로 보내는 데이터를 암호화하여 통신한다.
const https = require('https');
const fs = require('fs');
https.createServer({
cert: fs.readFileSync('도메인 인증서 경로'),
key: fs.readFileSync('도메인 비밀키 경로'),
ca: [
fs.readFileSync('상위 인증서 경로'),
fs.readFileSync('상위 인증서 경로'),
],
}, (req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.write('<h1>Hello Node!</h1>');
res.end('<p>Hello Server!</p>');
})
.listen(443, () => {
console.log('443번 포트에서 서버 대기 중입니다!');
});
HTTP2
SSL 암호화와 더불어 최신 프로토콜인 http/2 모듈을 사용한다.
요청 응답 방식이 멀티플렉싱 기술을 사용해 많이 개선되었다.
HTTPS 와 동일하게 인증서를 통해 암호화 방식 이기에 보안과 성능 도 챙길수있다.
cluster
싱글스레드의 노드가 CPU 코어를 사용할수있게 해주는 모듈
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`마스터 프로세스 아이디: ${process.pid}`);
// CPU 개수만큼 워커를 생산
for (let i = 0; i < numCPUs; i += 1) {
cluster.fork();
}
// 워커가 종료되었을 때
cluster.on('exit', (worker, code, signal) => {
console.log(`${worker.process.pid}번 워커가 종료되었습니다.`);
console.log('code', code, 'signal', signal);
cluster.fork();
});
} else {
// 워커들이 포트에서 대기
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.write('<h1>Hello Node!</h1>');
res.end('<p>Hello Cluster!</p>');
setTimeout(() => { // 워커 존재를 확인하기 위해 1초마다 강제 종료
process.exit(1);
}, 1000);
}).listen(8086);
console.log(`${process.pid}번 워커 실행`);
}