일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- BOJ
- 알고리즘
- functinon
- 깃
- Python
- Listing Data on IOS
- SWIFT
- remote : Invalid username or password
- 잃어버린괄호
- commit
- APP
- 백준
- HTTP
- git
- 풀리퀘스트
- Push
- SourceTree
- 소스트리
- Mac
- IOS
- udemy
- REST
- 푸쉬오류
- Nodejs 교과서
- Github
- algorith
- mysql
- create UI
- 파이썬
- nodejs
- Today
- Total
YoonC
[Nodejs 교과서] Http 모듈 본문
1. 요청과 응답
클라이언트는 서버로 요청(request)을 보내고 서버는 요청을 읽고 처리한 뒤 클라이언트에게 응답(response)을 보냄
💁🏻 서버는 요청과 응답을 이벤트 방식으로 받아야 함
따라서 클라이언트로부터 요청이 왔을 때 어떤 작업을 수행할지 이벤트리스너를 미리 등록해둬야함
Http모듈 : Node.js에서 가장 기본적인 웹 모듈, HTTP 웹 서버를 생성하는 것과 관련된 모든 기능을 담당
이벤트 리스너를 가진 노드 서버를 만들기>>
const http = require('http');
http.createServer( (req,res) => {
res.write('<h1>Hello Node!</h1>');
res.end('<p>Hello Server!</p>');
}).listen(8080, () => { //서버 연결
console.log('8080번 포트에서 서버 대기 중입니다.');
});
//createServer의 콜백부분을 보면 매개변수로 req(요청에 관한 정보들)객체와 res(응답에 관한정보들)객체
- createServer 메서드: 인자로 요청에 대한 콜백 함수를 넣을 수 있으며 요청이 들어올 때마다 콜백 함수 실행 (http모듈안의 메서드)
- listen 메서드 : createServer메서드 뒤에 붙여 클라이언트에 공개할 포트번호와 포트 연결 완려 후 실행될 콜백함수 넣는 방식으로 수행
==> http.createServer으로 server객체를 생성
✏️ res객체
- res.writeHead 메서드 : 응답에 대한 정보를 기록하는 메서드 => 응답 헤더를 작성하는 것
첫번째 인자는 상태 코드를 지정하고 두번째인수에 헤더 정보를 연관 배열로 정리
- res.write 메서드 : 컨텐츠를 내보내기 하는 메서드로 인수로 지정한 값이 클라이언트로 보낼 데이터. (본문)
여러번 호출해서 사용O
- res.end 메서드 : 응답을 종료하는 메서드
인수가 있다면 그 데이터도 클라이언트로 보내고 응답 종료.
==> 브라우저는 응답 내용을 받아 렌더링하게 됨
💁🏻 이때 res.write과 res.end에 일일이 HTML을 적는것은 비효율적이므로 미리 파일을 만든 후 그것을 fs 모듈로 읽어 전송하면 효율적
//server.html 파일이 있다고 하면
const http = require('http');
const fs = require('fs');
http.createServer( async(req,res) => {
try{
const data = await fs.readFile('./server.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번 포트에서 서버 대기중!);
});
다음과 같이 data 변수에 저장되 버퍼를 그대로 클라이언트에 보내면 됨
2. REST와 라우팅 사용
서버의 요청을 보낼 때 주소를 통해 요청의 내용을 표현. 이때 서버가 이해하기 쉬운 주소를 사용하기 위해 다음 방법 사용
>> REST : REpresentational State Transfer (서버의 자원을 정의하고 자원에 대한 주소를 정의하는 방법. 일종의 약속)
주소는 의미를 명학히 전달하기 위해 명사로 구성되며 이 외에도 HTTP 요청 메서드라는 것을 사용함
✏️ HTTP 요청 메서드
- GET : 서버의 자원을 가져오고자 할때. 요청의 본문에 데이터 넣지 X
- POST : 서버에 자원을 새로 등록하고자 할때. 요청의 본문에 새로 등록할 데이터를 넣어 보냄
- PUT : 서버의 자원을 요청에 들어 있는 자원으로 치환하고자 할때. 요청의 본문에 치환할 데이터 넣어 보냄
- PATCH : 서버 자원의 일부만 수정하고자 할때. 요청의 본문에 일부 수정할 데이터 넣어 보냄.
- DELETE : 서버의 자원을 삭제하고자 할때. 요청의 본문에 데이터 넣지X
- OPTIONS : 요청 전 통신 옵션 설명하기 위해 사용
* 주소 하나가 요청 메서드 여러개 가질 수 있음. 위의 메서드로 표현하기 애매한 동작은 POST 사용
💁🏻 RESTful한 웹서버를 만들기 위해 코드 작성전에 서버주소구조를 먼저 만들어 보는것이 좋음 HTTP메서드, 주소, 역할등을 써볼것!
3. 쿠키와 세션
클라이언트에서 보내는 요청은 누가 요청을 보냈는지 모른다는 단점을 가지는데 이 단점을 극복하기 위해 사용하는 방법
로그인 구현을 하기 위해 알아야 하는 개념들임
🍪 쿠키
- 서버가 요청에 대한 응답을 할 때 쿠키를 같이 보냄
- 쿠키는 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 쌍을 이루는 작은 데이터 파일
- 브라우저는 쿠키가 있으면 자동으로 동봉해 보내줘서 따로 처리필요X. 서버에서 브라우저로 보낼때만 작성에서 처리해주면 됨
- 사용자 인증이 유효한 시간을 명시O, 유효 시간이 정해지면 브라우저가 종료되어도 인증이 유지된다는 특징
- 요청의 헤더(Cookie)에 담겨서 전송되며 브라우저는 응답의 해더(Set-Cookie)에 따라 쿠키 저장
- 쿠키가 사용하는 사람이 누구인지를 추적하는 것.
쿠키는 문자열 형식으로 존재하며 쿠키간엔 세미콜론으로 구분됨
createServer메서드의 콜백에서는 req 객체에 담겨있는 쿠키를 가져오며 쿠키는 req.headers.cookie(요청의 헤더)에 들어있음.
쿠키심기 >> 응답의 헤더에 쿠키를 기록해야 하므로 res.writeHead 메서드에 Set-Cookie로 쿠키값을 저장하게 함
쿠키설정 옵션 - 옵션간은 세미콜론 (;) 으로 구분
- 쿠키명=쿠키값 : 기본적인 쿠키의 값입니다. mycookie=test 또는 name=background 같이 설정
- expires=날짜 : 만료 기한으로 이 기한이 지나면 쿠키가 제거기본값은 클라이언트가 종료될 때까지
- Max-age=초 : Expires와 비슷하지만 날짜 대신 초를 입력 해당 초가 지나면 쿠키가 제거된다. Expires보다 우선
- Domain=도메인명 : 쿠키가 전송될 도메인을 특정할 수 있으며 기본값은 현재 도메인
- Path=URL : 쿠키가 전송될 URL을 특정 할 수 있음.
- Secure : HTTPS일 경우에만 쿠키가 전송.
- HttpOnly : 설정 시 자바스크립트에서 쿠키에 접근할 수 없습니다. 쿠키 조작을 방지하기 위해 설정 하는 것이 좋음.
🥠 세션
- 세션은 쿠키를 기반하고 있지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버 측에서 관리
- 쿠키에 이름을 담아 보내는 대신, uniqueInt라는 숫자값을 보내며 사용자 이름, 만료시간은 uniqueInt속성명 아래 session객체에 저장
- 서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증상태 유지
- 사용자에 대한 정보를 서버에 두기 때문에 쿠키보다 보안에 좋지만, 사용자가 많아질수록 서버 메모리를 많이 차지하게 되는 단점있음
- 클라이언트가 Request를 보내면, 해당 서버의 엔진이 클라이언트에게 유일한 ID를 부여하는 데 이것이 세션ID다.
'Develop > Node.js' 카테고리의 다른 글
REST? RESTful API?? (0) | 2021.03.26 |
---|---|
[Nodejs 교과서] 몽고디비 (3) | 2021.03.18 |
[Nodejs 교과서] 시퀄라이즈 (0) | 2021.03.18 |
[Nodejs 교과서] MySQL (0) | 2021.03.17 |
[Nodejs] MySQL 뚞딲🔨 (0) | 2021.03.17 |