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가 스레드를 여러개 만드는 것이었다면 클러스터는 프로세스를 여러개 만드는 것
- 프로그램들은 각각 프로세스를 하나씩 차지하고 그 프로세스들은 각각 포트 하나를 차지한다
- 클러스터를 사용하면 모든 서버를 하나의 포트에서 실행시킬 수 있음