Node.js 4장 http 모듈로 서버 만들기

김동현·2022년 9월 13일
0
post-thumbnail

4.1 요청과 응답 이해하기

  • 서버는 클라이언트가 있기에 동작합니다
  • 클라이언트에서 서버로 요청을 보내고, 서버에서는 요청의 내용을 읽고 처리한 뒤 클라이언트에 응답을 보냅니다.

const http = require('http');
const fs = require('fs').promises;
http.createServer(async (req, res) => {
try {
const data = await fs.readFile('./server2.html');
res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
res.end(data);
} catch (err){
console.error(err);
res.writeHead(500, {'Content-Type': 'text/html; charset=utf-8'});
res.end(err.message);
}
})
.listen(8081, () => {
console.log('8081번 포트에서 서버 대기 중입니다.');
})

  • req : 요청이 관한 정보
  • res : 응답에 관한 정보

위 코드에서 서버에 접속하려면

  • res.writeHead : 응답에 대한 정보를 기록하는 메서드 / 헤더(Header) 라고 부릅니다.
  • res.write : 이 메서드의 첫 번째 인수는 클라이언트로 보낼 데이터 / 본문(Body)라고 부릅니다
  • res.end : 응답을 종료하는 메서드

localhost와 포트

localhost는 현재 컴퓨터의 내부 주소를 가리킵니다.
외부에서는 접근할 수 없고 자신의 컴퓨터에서만 접근할 수 있으므로, 서버 개발 시 테스트용으로 많이 사용됩니다.
localhost 대신 127.0.0.1 을 주소로 사용해도 같습니다. 이러한 주소를 IP주소 (Internet Protocol) 라고도 부릅니다.

  • 유명한 포트 번호
    • 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 : 서비스를 사용할 수 없음

4.2 REST와 라우팅 사용하기

  • REST란?
    • 서버의 자원을 정의하고 자원에 대한 주소를 지정하는 방법을 가리킴
  • 주소는 의미를 명확히 전달하기 위해 명사로 구성 됨
    • GET : 서버 자원을 가져오고자 할 때 사용한다.
      • 요청의 본문에 데이터를 넣지 않음, 데이터를 서버로 보내야 한다면 쿼리스트링을 사용
    • POST : 서버에 자원을 새로 등록하고자 할 때 사용
      • 요청의 본문에 새로 등록할 데이터를 넣어 보냄
    • PUT : 서버의 자원을 요청에 들어 있는 자원으로 치환하고자 할 때 사용함
      • 요청의 본문에 치환할 데이터를 넣어 보냄
    • PATCH : 서버 자원의 일부만 수정하고자 할 때 사용
      • 요청의 본문에 일부 수정할 데이터를 넣어 보냄
    • DELETE : 서버의 자원을 삭제하고자 할 때 사용
      • 요청의 본문에 일부 수정할 데이터를 넣어 보냄
    • OPTIONS : 요청을 하기 전에 통신 옵션을 설명하기 위해 사용

주소와 메서드만 보고 요청의 내용을 알아볼 수 있다는 것이 장점

HTTP통신을 사용하면 클라이언트가 누구든 상관없이 같은 방식으로 서버와 소통할 수 있다.

4.3 쿠키와 세션 이해하기

클라이언트에서 보내는 요청에는 한 가지 큰 단점이 있습니다 => 누가 요청을 보내는지 모른다는 것

웹 사이트에 방문해서 로그인을 할 때 내부적으로 쿠키와 세션을 사용하고 있다.

서버는 요청에 대한 응답을 할 때 쿠키라는 것을 같이 보낸다.
쿠키는 유효기간이 있으며 name=zerocho와 같이 단순한 '키-값'의 쌍입니다.

서버로부터 쿠키가 오면 웹 브라우저는 쿠키를 저장해두었다가 다음에 요청할 때마다 쿠키를 동봉해서 보냅니다.

서버는 요청에 들어 있는 쿠키를 읽어서 사용자가 누구인지 파악합니다.

즉, 서버는 미리 클라이언트에 요청자를 추정할 만한 정보를 쿠키로 만들어 보내고, 그 다음부터는 클라이언트로부터 쿠키를 받아 요청자를 파악합니다.

쿠키는 요청의 헤어(Cookie)에 담겨 전송됩니다.
브라우저는 응답의 헤더 (Set-Cookie)에 따라 쿠키를 저장합니다.

const myCookie = 'name=KIM;year=1995;age=28;LostArk=GODGame;IWantToMakeTheLightThatSavesTheWorld30=Today I take the light that saves the world 2 card';

const parseCookies = (cookie = '') =>
cookie
    .split(';')
    .map(v => v.split('='))
    .reduce((acc, [k, v]) => {
    acc[k.trim()] = decodeURIComponent(v);
    return acc;
    }, {});

    const returnCookie = parseCookies(myCookie);

    console.log('쿠키 : ', returnCookie);

  • 쿠키는 name=KIM;year=1995 처럼 문자열 형식으로 존재합니다.
  • 쿠키 간에는 세미콜론으로 구분됩니다.
  • 쿠키명=쿠키값 : 기본적인 쿠키의 값
    • mycookie=test 또는 name=zerocho와 같이 설정
  • Expires=날짜 : 만료 기한
    • 이 기한이 지나면 쿠키가 제거됨 / 기본값은 클라이언트가 종료될 때까지
  • Max-age=초 : Expires와 비슷하지만 날짜 대신 초를 입력할 수 있다.
    • 해당 초가 지나면 쿠기가 제거됨 / Expires보다 우선시됨
  • Domain=도메인명 : 쿠키가 전송될 도메인을 특정할 수 있다.
    • 기본값은 현재 도메인
  • Path=URL : 쿠키가 전송될 URL을 특정할 수 있다.
    • 기본값은 '/'이고, 이 경우 모든 URL에서 쿠키를 전송할 수 있다
  • Secure : HTTPS일 경우에만 쿠키가 전송됨
  • HttpOnly : 설정 시 자바스크립트에서 쿠키에 접근할 수 없다
    • 쿠키 조작 방지를 위해 설정하는것이 좋음

4.4 https와 http2

https 모듈은 웹 서버에 SSL 암호화를 추가한 것

profile
해보자요

0개의 댓글