Node.js 03 HTTP 모듈로 서버 만들기

김민호·2021년 12월 26일
0

Node.js

목록 보기
3/5

1. HTTP 서버 만들기

1) 서버와 클라이언트

  • 클라이언트가 서버로 요청을 보냄
  • 서버는 요청을 처리
  • 처리 후 클라이언트로 응답을 보냄

2) 노드로 http 서버 만들기

http요청에 응답하는 노드 서버

  • createServer로 요청 이벤트 대기
  • req 객체는 요청에 관한 정보가, res 객체는 응답에 관한 정보가 담겨 있음
const http = require('http');

http.createServer((req,res) => {
  // 여기에 어떻게 응답할지 적는다.
});

res 메서드로 응답을 보냄

  • write로 응답 내용을 적고
  • end로 응답 마무리(내용을 넣어도 됨)

listen(포트) 메서드로 특정 포트에 연결

  • https가 적용되어 있는 도메인은 포트가 기본적으로 443이고 생략가능
  • https가 적용되어 있지 않은 http 사이트는 포트번호 80
  • listen 의 포트 범위는 보통 1024번 ~ 49151번 사이에서 등록, 실제 서비스는 0번 ~ 1023번
  • 다른 포트로 데이터베이스나 다른 서버 동시에 연결 가능
  • 서버 코드 수정하면 서버 껐다가 다시 켜야 적용됨

localhost는 컴퓨터 내부 주소

  • 외부에서 접근 불가능
  • 80 : http
  • 21 : ftp
  • 23 : Telnet
  • 3306 : mysql
  • 27017 : mongodb

2. fs로 HTML 읽어 제공하기

const http = require('http');
const fs = require('fs').promises;

const server = http.createServer(async (req, res) => {
  try {
    res.writeHead(200, { 'Content-Type' : 'text/html ; charset = utf-8'});
    const data = await fs.readFile('./server2.html');
    res.end(data);
  } catch (error) {
    console.error(err);
    res.writeHead(200, { 'Content-Type' : 'text/plain ; charset = utf-8'});
    res.end(err.message);
  }
})

  .listen(8080);
server.on('listening', () => {
  console.error('8080번 포트에서 서버 대기중입니다.');
});
server.on('error', (error) => {
  console.error(error);
})

3. REST API 서버 만들기

1) REST API

2) HTTP 프로토콜

클라이언트가 누구든 서버와 HTTP 프로토콜로 소통 가능

  • ios, 안드로이드, 웹이 모두 같은 주소로 요청을 보낼 수 있음
  • 서버와 클라이언트 분리

4. POST, PUT, DELETE 요청 보내기

5. 쿠키 이해하기

  • 요청은 IP주소와 브라우저 정보 정도만 알기 때문에 누가 요청을 보냈는지 모른다. 그렇기 때문에 로그인을 구현한다

1) 쿠키의 필요성

  • 쿠키 => 키 = 값의 쌍
  • 매 요청마다 서버에 동봉해서 보냄
  • 서버는 쿠키를 읽어 누구인지 파악한다

2) 쿠키 서버 만들기

  • 쿠키 넣는 것을 직접 구현
  • writeHead : 요청 헤더에 입력하는 메서드
  • Set-Cookie : 브라우저에게 쿠키를 설정하라고 명령

3) 헤더와 본문

http 요청과 응답은 헤더와 본문을 가짐

  • 헤더는 요청 또는 응답에 대한 정보를 가짐
  • 본문은 주고 받는 실제 데이터
  • 쿠키는 부가적인 정보이므로 헤더에 저장

4) 쿠키 옵션

  • 쿠키명=쿠키값 : 기본적인 쿠키의 값. mycookie=test 또는 name=max 같이 설정
  • Expires=날짜 : 만료 기한. 이 기한이 지나면 쿠키 제거됨. 기본값은 클라이언트가 종료될 때까지
  • Max-age=초 : Expires와 비슷하지만 날짜 대신 초를 입력할 수 있음. 해당 초가 지나면 쿠키 제거됨. Expires보다 우선
  • Domain=도메인명 : 쿠키가 전송될 도메인을 특정할 수 있음. 기본값은 현재 도메인
  • Path=URL : 쿠키가 전송될 URL을 특정할 수 있음. 기본값은 / 이고 이경우 모든 URL에서 쿠키 전송 가능
  • Secure : HTTPS 일 경우에만 쿠키가 전송됨
  • HttpOnly : 설정 시 자바스크립트에서 쿠키에 접근할 수 없음. 쿠키 조작을 방지하기 위해 설정

6. 세션 사용하기

쿠키의 정보는 노출되고 수정되는 위험이 있음

  • 중요한 정보는 서버에서 관리하고 클라이언트에는 세션 키만 제공
  • 서버에 세션 객체(session) 생성 후, uniqueInt(키)를 만들어 속성명으로 사용
  • 속성 값이 정보 저장하고 uniqueInt를 클라이언트에 보냄

7. HTTPS, HTTP2

HTTPS

웹 서버에 SSL 암호화를 추가하는 모듈

  • 오고 가는 데이터를 암호화해서 중간에 다른 사람이 요청을 가로채더라도 내용을 확인할 수 없음
  • 요즘에는 https 적용이 필수(개인정보가 있는 곳은 특히)
  • 요청 헤더에 보안상 민감한 부분이 많이 들어있기 때문에 https로 보내면 요청 자체를 암호화해서 보내면 해커로부터 안전할 수 있음

HTTP2

SSL 암호화와 더불어 최신 HTTP 프로토콜인 http/2를 사용하는 모듈

  • 요청 및 응답 방식이 기존 http/1.1보다 개선됨
  • 웹의 속도도 개선됨

8. cluster

기본적으로 싱글 스레드인 노드가 CPU 코어를 모두 사용할 수 있게 해주는 모듈

  • 포트를 공유하는 노드 프로세스를 여러 개 둘 수 있음
  • 요청이 많이 들어왔을 떄 병렬로 실행된 서버의 개수만큼 요청이 분산됨
  • 서버에 무리가 덜 감
  • 코어가 8개인 서버가 있을 떄 : 보통은 코어 하나만 활용
  • 클러스터로 코어 하나당 노드 프로세스 하나를 배정 가능
  • 성능이 8배가 되는 것은 아니지만 개선됨
  • 단점 : 컴퓨터 자원(메모리, 세션 등) 공유 못 함
  • Redis 등 별도 서버로 해결

서버 클러스터링

마스터 프로세스와 워커 프로세스

  • worker_threads가 스레드를 여러개 만드는 것이었다면 클러스터는 프로세스를 여러개 만드는 것
  • 프로그램들은 각각 프로세스를 하나씩 차지하고 그 프로세스들은 각각 포트 하나를 차지한다
  • 클러스터를 사용하면 모든 서버를 하나의 포트에서 실행시킬 수 있음
profile
개발자로서의 삶은 https://velog.io/@maxminos 에서 기록하고 있습니다 😀

0개의 댓글