섹션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가지정도 주요 용도가 있다

  1. 세션 관리 - 로그인 등 사용자의 세션정보를 저장
  2. 개인화 - 사용자의 선호도 와 설정을 저장
  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}번 워커 실행`);

}
반응형

'백엔드 > Nodejs' 카테고리의 다른 글

섹션4 npm  (0) 2023.12.15
섹션2 노드 기본기능  (1) 2023.12.09
섹션1 알아두어야할 자바스크립트  (0) 2023.12.09
Nodejs ?  (1) 2023.12.06