본문 바로가기

WINK-(Web & App)/Express.js (Node.js) 스터디

[2024 여름방학 Node.js 스터디] 이종윤 #3주차

반응형

요청과 응답

서버와 클라이언트의 관계

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

노드를 이용하여 http서버 만들기

const http = require('http');

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

 

creatServer로 이벤트 요청을 대기한다.

req 객체는 요청에 관한 정보가, res 객체는 응답에 관한 정보가 담겨있다.

로컬호스트와 포트

로컬호스트(localhost): 컴퓨터 네트워크에서 사용하는 루프백 주소로, 자신의 컴퓨터를 의미한다. 즉, 컴퓨터의 네트워크 기능을 시험하기 위해 '가상으로 인터넷망에 연결되어 있는 것처럼 할당하는 인터넷 주소'이다. IPv4에서의 IP 주소는 127.0.0.1[1]이며, IPv6에서는 ::1(0:0:0:0:0:0:0:1의 약자)[2]로 변환된다. 로컬 컴퓨터를 원격 컴퓨터인 것처럼 통신할 수 있어 테스트 목적으로 주로 사용된다. - 위키백과

 

포트: 서버 내에서 프로세스를 구분하는 번호

- HTTP에는 80, HTTPS에는 443이 사용되고 생략가능하다. (주소뒤에 /443으로 사용된다.) ex) www.naver.com/443

const http = require('http');

http.createServer((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(8080, () => { // 서버 연결
    console.log('8080번 포트에서 서버 대기 중입니다!');
  });

 

위 createServer 내 res.~~는 html에서의 헤더 바디와 같은 것이다.

여기 res.writeHead에서도 html헤더에서처럼 정보를 담고있는데

일단 첫번째 인수인 200은 성공을 의미하는 것이다.

그리고 두번째 인수는 이 내용이 html임을 알리고 있다.

마지막 세번째 인수는 한글로 쓰여져있음을 말하고있다.

 

그러나 위에처럼 계속 쓰다 html이 많이 길어지면 상당히 곤란하다.

해결방안으로 fs를 이용하여 내 컴퓨터에 있는 html파일을 읽게할 수 있다.

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/plain; charset=utf-8' });
    // 에러 메시지는 일반 문자열이므로 text/plain을 사용
    res.end(err.message);
  }

이렇게

 

REST API

: 서버의 자원을 정의하고 자원에 대한 주소를 지정하는 방법이다.

- 항상 html을 요구할 필요는 없다, 서버가 이해하기 쉬운 주소가 좋다.

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

요청 메서드 설명
GET 서버 자원을 가져오고자 할 때 사용, 요청의 본문(body)에 데이터를 넣지 않고 데이터를 서버로 보내야 한다면 쿼리스트링을 사용
POST 서버에 자원을 새로 등록하고자 할 때 사용, 요청의 본문에 새로 등록할 데이터를 넣어 보낸다.
PUT 서버의 자원을 요청에 들어 있는 자원으로 치환하고자 할 때 사용, 요청의 본문에 치환할 데이터를 넣어 보낸다.
PATCH 서버 자원의 일부만 수정하고자 할 때 사용, 요청의 본문에 일부 수정할 데이터를 넣어 보낸다.
DELETE 서버의 자원을 삭제하고자 할 때 사용, 요청의 본문에 데이터를 넣지 않는다.
OPTIONS 요청을 하기 전에 통신 옵션을 설명하기 위해 사용.

쿠키🍪 (Cookie)

:  웹 서버에 의해 사용자의 컴퓨터에 저장되는, '이름을 가진 작은 크기의 데이터'이다. - 위키백과

>>> 요청에는 한가지 단점이 있다.

바로 누가 요청을 보냈는지 모른다는 것이다. 이러한 문제는 로그인 시스템을 구현하면 된다.

로그인 시스템을 구현하기 위해서는 쿠키와 세션이 필요하다.

쿠키는 ' 키 = 값 '의 쌍이다. ex) name = jongyun

매 요청마다 서버에 동봉해서 보내고 서버는 이를 읽어서 누구인지 파악한다.

res.writeHead(200, { 'Set-Cookie': 'mycookie=test' }); 

쿠키는 이처럼 위에서 썼었던 코드에 이렇게 Set-Cookie를 추가하여 사용하면 된다.

쿠키 속성설명

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

 

아이디나 비번같이 중요한 정보를 쿠키로 그냥 사용하면 해킹의 위험이 높다.

그래서 사용하는 방법이 세션이다.

세션

: 중요한 정보는 서버에서 관리하고 클라이언트에는 세션키만 제공하는 방법

- 서버에서 객체(session) 생성 후, uniquelnt(키)를 만들어 속성명으로 사용한다.

https

: 웹 서버에 ssl 암호화를 추가하는 모듈이다.

+ ssl암호화란 오고 가는 데이터를 암호화해서 중간에 다른 사람이 내용을 가로채더라도 내용을 확인할 수 없게 함

like 세션

+ http2는 ssl암호화에 더불어 최신 http 프로토콜인 http/2를 사용하는 모듈이다.

cluster

: cluster 모듈은 기본적으로 싱글 프로세스로 동작하는 노드가 CPU 코어를 모두 사용할 수 있게 해주는 모듈이다.

- 포트를 공유하는 노드 프로세스를 여러 개 둘 수도 있어, 요청이 많이 들어왔을 때 병렬로 실행된 서버의 개수만큼 요청이 분산되게 할 수 있다. 서버에 무리가 덜 가게 되는 셈이다.

- 단점: 컴퓨터자원(메모리, 세션 등) 공유 못함

 

 

반응형