[Node.js] http 모듈로 서버 만들어 보기

hahaha·2021년 9월 6일
0

Node.js

목록 보기
4/10

노드 서버 만들기

1. 서버 만들기

// server1.js
const http = require('http');

http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8' });	// Header: 응답에 대한 정보 기록
  res.write('<h1>Hello Node!</h1>');					// Body: 클라이언트로 보낼 데이터
  res.end('<p>Hello Server!</p>');					// (인수 전달 후)응답 종료
})
  .listen(8080, () => {	// 포트 번호, 연결 완료 후 실행될 콜백 함수
    console.log('8080번 포트에서 서버 대기 중입니다!');
  });
  • fs 모듈을 이용하여 미리 작성된 HTML 파일을 읽어 데이터 전달 가능

2. 서버 실행하기

$ node server1

3. 서버 접속하기

http://localhost:8080 or http://127.0.0.1:8080

4. 서버 종료하기

Ctrl + C

포트

  • 서버 내에서 프로세스를 구분하는 번호
  • 일반적인 웹 사이트들은 포트 번호 따로 표시 X (80, 443을 사용하기에 생략)
  • 리눅스/맥 환경에서 1024번 이하의 포트에 연결할 때 관리자 권한 필요
    • sudo 명령어 추가
  • 유명한 포트 번호
    • 21(FTP)
    • 80(HTTP)
    • 443(HTTPS)
    • 3306(MYSQL)

HTTP 상태 코드

  • 2XX: 성공
    - 200(성공), 201(작성됨)
  • 3XX: 리다이렉션
    - 301(영구 이동), 302(임시 이동), 304(수정되지 않음 - 캐시 사용)
  • 4XX: 요청 오류
    - 400(잘못된 요청), 401(권한 없음), 403(금지됨), 404(찾을 수 없음)
  • 5XX: 서버 오류
    • 500(내부 서버 오류), 502(불량 게이트웨이), 503(서비스 사용 불가)
    • 발생하는 경우가 거의 없도록 해야함..
  • 에러 발생여부에 상관없이 무조건 클라이언트에게 응답을 보내야함

REST와 라우팅

REST(REpresentational State Transfer)

  • 서버의 자원을 정의하고 자원에 대한 주소를 지정하는 방법(약속)
  • RESTful 하다: REST를 따르는 서버

HTTP 요청 메서드

  • GET: 서버의 자원을 가져올 때
    - 브라우저에서 캐싱가능 -> 서버가 아닌 캐시에서 가져오기도 함
  • POST: 서버에 자원을 새로 등록
  • PUT: 서버의 자원을 요청의 자원으로 치환
  • PATCH: 서버 자원의 일부만 수정
  • DELETE: 서버의 자원 삭제
  • OPTIONS: 요청하기 전에 통신 옵션 설명하기 위해
  • 서버와 클라이언트 분리

  • 브라우저의 Network 탭에서 네트워크 요청 내용을 실시간으로 볼 수 있음
    - Name, Method, Status, Protocol, Type(요청 종류, xhr: AJAX)

쿠키와 세션

쿠키

  • 유효 기간 존재

  • 단순한 '키 - 값'의 쌍 (문자열 형식, 세미콜론으로 구분)

  • 요청의 헤더에 담겨 전송 -> 사용자가 누구인지 파악

  • 한글, 줄바꿈 포함 금지
    - 한글은 ${endoeURIComponent('한글')} 감싸서 넣기

const http = require('http');

http.createServer((req, res) => {
  // req.url: 주소의 path와 search 부분
  console.log(req.url, req.headers.cookie);
  res.writeHead(200, { 'Set-Cookie': 'mycookie=test' });
  res.end('Hello Cookie');
})
  .listen(8080, () => {	// 포트 번호, 연결 완료 후 실행될 콜백 함수
    console.log('8080번 포트에서 서버 대기 중입니다!');
  }); 

// undefined
// favicon.ico {mycookie: 'test'}

쿠키 설정 옵션

  • 쿠키명-쿠키값
  • Expires=날짜
  • Max-age=ch
  • Domain=도메인명
  • Path=URL
  • ...

세션

  • 서버에 사용자 정보 저장
  • 클라이언트는 세션 아이디로만 소통 (주로 쿠키 사용)
  • 세션 쿠키: 세션을 위해 사용하는 쿠키
// 실제 배포용 서버에는 세션을 변수에 저장 X -> DB에 저장
const session = {}

// 생략
res.writeHead(302, {
  Location: '/',
  'Set-Cookie': `session=${Date.now()}; Expires=${new Date.toGMTString()}; HttpOnly; Path=/`,
});

https와 http2

https 모듈

  • 웹 서버에 SSL 암호화 추가
  • 로그인, 결제 등의 창에서 필수 / 브라우저 창에 자물쇠 표시

인증서 발급

  • 인증 기관에서 구입
  • 도메인 필요
  • 무료로 인증서를 발급해주는 기관도 존재...

http2 모듈

  • SSL 암호화와 더불어 최신 HTTP 프로토콜인 http/2 사용 가능
  • 요청 방식 효율적, 웹 속도 개선

cluster 모듈

  • 싱글 프로세스로 동작하는 노드가 CPU 코어를 모두 사용할 수 있게 해주는 모듈
  • 코어 하나당 노드 프로세스 하나가 돌아가게 할 수 있음
  • 메모리 공유 불가

마스터 프로세스

워커 프로세스

  • 실질적인 일을 하는 프로세스
const cluster = require('cluster');

if(cluster.isMaster) {
  cluster.fork();	// 워커 프로세스 생산
}
  • 직접 cluster 모듈로 클러스터링 구현하는 것 보단, pm2 등의 모듈 활용
profile
junior backend-developer 👶💻

0개의 댓글