티스토리 뷰

http 모듈로 서버 만들기
- node는 서버가 아니다 -> js 실행기일 뿐, 서버 실행 코드를 작동시켜줄 뿐.
- 서버와 클라이언트는 요청과 응답을 http 프로토콜(규약)에 맞게 주고받음
- 코드가 바뀌면 서버는 재시작 되어야 함 (지켜보고 있다가 특정 조건에 재시작하게끔 실행코드를 짜둘 수는 있다)
1. http 요청에 응답하는 노드 서버
createServer로 요청 이벤트에 대기- 콜백함수로 객체로 정보를 받음 ->
req: 요청에 관한 정보,res: 응답에 관한 정보 - res 객체의 메서드
res.writeHead: (Network Response Headers)응답에 대한 정보를 기록-> (첫번째 인수)http 상태코드, (두번째 인수)응답에 대한 정보로 이루어짐res.write: 클라이언트로 보낼 데이터, 문자열/버퍼 등을 보낼 수 있음res.end: 응답을 종료하는 메서드, 인수가 있다면 클라이언트로 보내고 응답을 종료함 ->return을 붙여야 함수가 종료됨
2. fs로 HTML 읽어 제공하기
fs.readFile로 파일 읽기async이용해서try-catch문으로 에러 처리하기
3. REST API 서버 만들기
- 서버에 요청을 보낼 때는 주소를 통해 요청의 내용을 표현.
- REST에서는 주소 외에도 HTTP 요청 메서드라는 것을 사용 (GET, POST, PATCH...)
- REST: REpresentational State Transfer -> 서버의 자원을 정의하고 자원에 대한 주소를 지정하는 방법
- 주소 하나가 요청 메서드를 여러 개 가질 수 있음
- require로 http 모듈을 불러옴
- http 모듈의
createServer함수로 서버 생성 .listen함수는 서버를 시작하게 하고, 클라이언트의 요청에 대기함 (8082 포트에서 대기중)- createServer 함수에 비동기 함수 넘김. try-catch 문 사용
GET(가져옴)- 웹 브라우저 주소창에 URL을 입력하는 경우
- 링크를 클릭하는 경우
- 입력폼의 메소드 속성값이 get인 경우
POST(게시),PUT(집어넣음): 코드의 흐름을 기억할 것body를 만든 후, 요청을 stream 형식으로 받음(코드 확인하기)req.on('data'),req.on('end')사용 -> 데이터를 꺼내기 위한 작업
- URL에 데이터가 포함되지 않아 외부에 노출되지 않음
- 바이너리, 대용량 데이터 전송 가능
PATCH(부분 수정)DELETE(삭제)
-> 요청과 응답은 모두 헤더와 본문을 가짐. 헤더는 요청/응답에 대한 정보를 가지고, 본문은 서버와 클라이언트 간에 주고받을 실제 데이터를 담아둠
-> 개발자 도구 Network 탭에서 확인 가능
General: 공통된 헤더Request Headers: 요청의 헤더Response Headers: 응답의 헤더Request Payload: 요청의 본문Preview나Response탭: 응답의 본문
4. 쿠키: 키-값의 쌍
- 매 요청마다 서버에 동봉해서 보냄, 서버는 쿠키를 읽어 누가 요청을 보냈는지 파악
- 쿠키 넣는 것을 구현
writeHead: 요청 헤더에 입력하는 메서드Set-Cookie: 브라우저에게 쿠키를 설정(저장)하라고 명령키=값쌍으로 설정
- 쿠키는 요청의 헤더(Cookie)에 담겨 전송됨, 브라우저는 응답의 헤더(Set-Cookie)에 따라 쿠키를 저장
- 쿠키는 문자열 형식으로 존재, 쿠키 간에는 세미콜론으로 구분
- 쿠키 만료 기한 저장 가능(Expires=날짜)
- 쿠키가 전송될 도메인, URL 특정할 수 있음
- 쿠키 조작을 방지하기 위해
HttpOnly를 설정해 js 에서 쿠키에 접근할 수 없게 함
http.createServer((req,res)=>{
res.writeHead(200,{'Set-Cookie': 'cookie=test'});
res.end('Hello Cookie');
})
.listen(8083,()=>{
//서버 대기중
})
5. 세션
쿠키의 정보는 노출되고 수정되는 위험이 있어서,
이를 해결하는 방법이, 서버에 세션 객체를 생성한 후, 중요한 정보에 접속할 수 있는 세션 키만 브라우저에 보내는 방법이다.
서버에 사용자 정보를 저장하고 클라이언트와는 세션 아이디로만 소통하는데, 꼭 쿠키를 사용해서 주고 받지 않아도 되지만,
많은 웹사이트들이 쿠키를 사용한다.
-> 세션을 위해 사용하는 쿠키를 세션 쿠키라고 함
- 실제 서버에서는 세션을 변수에 저장하지 않고,
Redis나Memcached와 같은 데이터베이스에 넣어둠 - 서비스를 새로만들 때마다 쿠키와 세션을 직접 구현할 수도 없고, 보안을 위해 검증된 코드를 사용하는 것이 좋음
(다음장에서 express-session을 사용해보자)
6. https, http2
https: 웹 서버에 SSL 암호화를 추가하는 모듈
-> GET이나 POST 요청을 할 때 오가는 데이터를 암호화해서 중간에서 탈취한 내용을 확인할 수 없게 함
- https 인증서는 인증 기관에서 구입해야하고, Let's Encrypt 같은 기관에서 무료로 발급 가능
- createServer 메서드가 인수를 두개 받음. (
인증서에 관련된 옵션 객체,서버 로직) - 인증서를 구입하면 pem, crt, key 확장자를 가진 파일들이 제공되는데, 이 파일을
fs.readFileSync메서드로 읽어서 cert,key,ca 옵션에 알맞게 넣음. - 실제 서버에서는
443 포트를 사용
http2: SSL 암호화와 더불어 최신 HTTP 프로토콜은 http/2를 사용하는 모듈
- 요청 및 응답 방식이 기존 http 보다 개선됨
- https 보안도 적용하기 때문에, 속도와 보안 면에서 좋음
- 실무에서 배포시 기존 https 코드에서, https 모듈을
http2로, createServer 메서드를createSecureServer로 변경
7. cluster
cluster: 기본적으로 싱글 프로세스로 동작하는 노드가 CPU 코어를 모두 사용할 수 있게 해주는 모듈
-> 실행 요청이 많이 들어왔을 때, 병렬로 프로세스를 실행해 요청을 분산시킬 수 있음(서버에 부하가 덜 가게 한다)
-> cluster 로 코어 하나당 노드 프로세스 하나를 배정 가능하다 : 성능이 이 갯수에 비례하게 좋아지는 건 아니지만, 개선된다
-> 메모리를 공유하지 못한다는 단점이 있어(세션을 메모리에 저장할 때 문제가 생김), 이를 해결하기 위해 Redis와 같은 서버를 도입함으로 해결할 수 있다
- cluster 에는
마스터 프로세스와워커 프로세스가 있음 - 마스터 프로세스는 CPU 개수만큼 워커 프로세스를 만들고, 포트(코드에서 8086)에서 대기함
- 요청이 들어오면 만들어진 워커 프로세스에 요청을 분배함.
-> 직접 cluster를 구현하기 보다, 실무에서는 pm2 모듈을 이용해 cluster 기능을 사용함
포트
- localhost : 현재 사용하는 컴퓨터의 내부 주소
- 포트 : 서버 내 프로세스를 구분하는 번호 -> 서버는 프로세스에 포트를 다르게 할당해 들어오는 요청을 구분함
- 유명한 포트 번호: 21(FTP), 80(HTTP), 443(HTTPS), 3306(MYSQL)
- 80번 포트를 사용하면 주소에서 포트를 생략할 수 있음 -> 배포시 사용
- 이론상으로 한번에 여러개의 포트를 열어, 여러개의 서버를 실행할 수 있음
'Study > Node.js' 카테고리의 다른 글
| 노드에서 파일 시스템 접근하기 (0) | 2021.10.25 |
|---|