4.1 요청과 응답 이해하기

클라이언트에서 서버로 요청을 보내고, 서버는 요청의 내용을 읽고 처리한 뒤 클라이언트에게 응답을 보냅니다.
따라서 서버에는 요청을 받는 부분과 응답을 보내는 부분이 있어야 합니다.

createServer.js

const http = require('http');

http.createServer((req, res) => {
    // 응답 내용
})

server1.js

const http = require('http');

http.createServer((req, res) => {
    res.write('<h1>Hello Node!</h1>');
    res.end('<p>Hello Server!</p>');
}).listen(8080, () => {
    console.log('8080번 포트에서 서버 대기 중입니다!');
});

server1-0.js

const http = require('http');

const server = http.createServer((req, res) => {
    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);
});
$ node server1
8080번 포트에서 서버 대기 중입니다!

localhost와 포트란?
localhost는 현재 컴퓨터의 내부 주소
localhost 대신 127.0.0.1 도 사용 가능
포트는 서버 내에서 프로세스를 구분하는 번호
보통의 사이트는 포트 번호를 따로 표시하지 않으나, 80번 포트를 사용하기 때문이고 80번 포트를 사용하면 생략 가능

리눅스와 macOS에서는 1024번 이하의 포트 사용시 관리자 권한이 필요하므로 1024번 이하의 포트를 사용한 노드 서버의 실행시에는 앞에 sudo를 추가해야됨

4.2 쿠키와 세션 이해하기

클라이언트에서 보내는 요청에는 한 가지 단점이 존재함.
누가 요청을 보내는지 모른다는 것.

http 상태 코드는 서버에서 보내주는 상태 코드를 보고 요청의 성공 유무를 판단함
http status code 모음

쿠키 설정 옵션

  • 쿠키명=쿠키값 : 기본적인 쿠키의 값
  • expires=날짜 : 만료 기한. 기본값은 클라이언트 종료시점까지
  • max-age : expires와 비슷 하지만 초 단위로 입력 가능 expires보다 우선시됨
  • domain=도메인명 : 쿠키가 전송시 도메인을 특정 할 수 있음. 기본값은 현재 도메인
  • path=url : 쿠키가 전송될 URL을 특정. 기본값은 '/' 모든 url에서 쿠키 전송 가능
  • secure : https일 경우에만 쿠키가 전송됨
  • httpOnly : 브라우저에서 자바스크립트 코드를 사용하여 쿠키 접근 불가

4.3 REST API와 라우팅

REST API : REpresentational State Transfer의 약어로 네트워크 구조의 방식중 하나. 서버의 자원을 정의하고, 자원에 대한 주소를 지정하는 방법을 가르킴.

  • GET : 서버의 자원을 가져오고자 할 때 사용함. 용청의 본문(body)에 데이터를 넣지 않음. 데이터는 쿼리스트링을 사용함.

  • POST : 서버에 자원을 새로 등록하고자 할 때 사용함. 요청의 본문에 새로 등록할 데이터를 넣어 보냄.

  • PUT : 서버의 자원을 요청에 들어 있는 자원으로 치환하고자 할 때 사용합니다. 요청의 본문에 치환할 데이터를 넣어 보냅니다.

  • PATCH : 서버 자원의 일부만 수정하고자 할 때 사용함. 요청의 본문에 일부 수정할 데이터를 넣어 보냄.

  • DELETE : 서버의 자원을 삭제하고자 할 때 사용.

put vs patch

유저 리스트에 특정 유저의 정보를 수정 하고자 할때 patch는 해당 유저의 값을 수정하지만 put 은 전체 리스트를 가져온후 수정하여 값을 반환한다.

4.4 https와 http2

https 모듈은 웹 서버에 SSL 암호화를 추가.
http 요청을 중간에 가로채더라도 내용을 확인 할 수 없음(요즘은 적용이 필수)

server1-1.js

const https = require('https');
const fs = require('fs');

https.createServer({
    cert: fs.readFileSync('도메인 인증서 경로');
    key: fs.readFileSync('도메인 비밀키 경로');
    ca: [
        fs.readFileSync('상위 인증서 경로'),
        fs.readFileSync('상위 인증서 경로'),
    ],
}, (req, res) => {
    res.write('<h1>Hello Node!</h1>');
    res.end('<p>Hello Server!</p>');
}).listen(443, () => {
    console.log('443번 포트에서 서버 대기 중입니다!');
})

http 모듈과 거의 흡사하나, 첫 번째 인자로 인증서에 관련된 옵션 객체를 받음.

노드의 http2 모듈은 SSl 암호화와 더불어 최신 HTTP 프로토콜인 http/2를 사용할 수 있게 해줌. 기존의 http/1.1보다 훨씬 효율적인 요청이 가능(웹의 속도 개선)

server1-2.js

const http2 = require('http2');
const fs = require('fs');

http2.createSecureServer({
    cert: fs.readFileSync('도메인 인증서 경로'),
    key: fs.readFileSync('도메인 비밀키 경로'),
    ca: [
        fs.readFileSync('상위 인증서 경로'),
        fs.readFileSync('상우 인증서 경로'),
    ],
}, (req, res) => {
    res.write('<h1>Hello Node!</h1>');
    res.end('<p>Hello Server!</p>');
}).listen(443, () => {
    console.log('443번 포트에서 서버 대기 중입니다!');
});

https 모듈과 거의 흡사함.

4.5 cluster

cluster 모듈은 싱글 스레드인 노드가 CPU 코어를 모두 사용 할 수 있게 해주는 모듈.
여러개의 CPU를 사용하여 서버의 부하를 분산 시키지만, 세션 공유가 불가하다는 단점 존재(Redis 등의 서버를 도입하여 해결 가능)

직접 cluster 모듈로 클러스터링을 구현할 수도 있지만, 실무에서는 pm2 등의 모듈로 cluster 기능을 사용.