*헤더와 본문*
-
요청과 응답은 모두 헤더와 본문을 가지고 있습니다.
-
헤더는 요청이나 응답에 대한 정보를 가지고 있습니다.
-
본문은 서버와 클라이언트 간에 주고받을 실제 데이터를 담아두는 공간입니다. (쿠키는 부가적인 정보여서 헤더에 저장합니다.)
4. 쿠키 식별하기
const http = require('http');
const fs = require('fs');
const url = require('url');
const qs = require('querystring');
const parseCookies = (cookie = '') =>
cookie
.split(';')
.map(v => v.split('='))
.map(([k, ...vs]) => [k, vs.join('=')])
.reduce((acc, [k, v]) => {
const cookies = parseCookies(req.headers.cookie);
if (req.url.startsWith('/login')) {
const { query } = url.parse(req.url);
const { name } = qs.parse(query);
const expires = new Date();
expires.setMinutes(expires.getMinutes() + 5);
resizeBy.writeHead(302, {
Location: '/',
'Set-Cookie': `name=${encodeURIComponent(name)};
Expires=${expires.toGMTString()}; HttpOnly; Path=/`,
});
res.end();
} else if (cookies.name) {
res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
res.end(`${cookies.name}님 안녕하세요`);
} else {
fs.readFile('./server4.html', (err, data) => {
if (err) {
throw err;
}
res.end(data);
});
}
})
.listen(8083, () => {
console.log('8083번 포트에서 서버 대기 중입니다!')
});
코드해석
-
주소가 /login과 /로 시작하는 것 두 개이기 때문에 주소별로 분기처리 했습니다.
-
if문에서 주소가 /login으로 시작할 경우입니다.
-
url과 querystring 모듈로 각각 주소와 주소에 딸려오는 query를 분석합니다.
-
expires.setMinutes(expires.getMinutes() + 5): 쿠키의 만료 시간을 지금으로부터 5분 뒤로 설정합니다.
-
res.writeHead: 302 응답 코드, 리다이렉트 주소와 함께 쿠키를 헤더에 넣습니다. 브라우저는 응답 코드를 보고 페이지를 해당 주소로 리다이렉트 합니다.
-
헤더에는 한글을 설정할 수 없어서 name변수를 encodeURIComponent 메서드로 인코딩했습니다.
-
그 외의 경우(/로 접속했을 때 등), 쿠키의 유무를 확인합니다.
-
else문을 통해 쿠키가 없다면 로그인 가능한 server4.html 페이지를 보냅니다.
-
쿠키가 있다면 로그인한 상태이므로 인사말을 보냅니다.
-
res.end 메서드에 한글이 들어가면 인코딩 문제가 생기므로 content-type을 utf-8로 설정 합니다.
*쿠키 옵션*
-
쿠키는 설정시 각종 옵션들을 넣을 수 있습니다.
-
쿠키명=쿠키값: 기본적인 쿠키값입니다.
-
Expires=날짜: 만료 기한입니다. 기한이 지나면 쿠키가 제거됩니다. 기본값은 클라이언트가 종료될 때까지입니다.
-
Max-age=초: Expires와 비슷하지만 날짜 대신 초를 입력 가능합니다. 해당 초가 지나면 쿠키가 제거되며, Expires보다 우선합니다.
-
Domain=도메인명: 쿠키가 전송될 도메인을 특정할 수 있습니다. 기본값은 현재 도메인입니다.
-
Path=URL: 쿠키가 전송될 URL을 특정합니다. 기본값은 ‘/’이며 모든 URL에서 쿠키를 전송할 수 있습니다.
-
Secure: HTTPS일 경우에만 쿠키가 전송됩니다.
-
HttpOnly: 설정 시 자바스크립트에서 쿠키에 접근할 수 없습니다. 쿠키 조작을 방지하기 위해 설정합니다.
5. 세션
-
이방식으로 진행시에는 쿠키가 노출되어 있으며 쿠키가 조작될 위험도 있습니다.
-
그래서 쿠키에 이름 대신 randomInt를 이용해 임의의 숫자를 보냅니다. 그래서 session 변수를 이용해 session 변수에서 사용자 정보를 가져와서 사용합니다.
-
세션은 서버에 사용자 정보를 저장하고 클라이언트와는 세션 아이디로만 소통합니다.
-
세션 아이디는 쿠키를 사용해서 주고 받지 않아도 됩니다.
-
실제 배포용 서버에서는 세션을 보통 데이터베이스에 넣어둡니다.
-
서비스를 만들 때마다 쿠키와 세션을 직접 구현할 수는 없습니다.
-
그래서 다른사람들이 만든 검증된 코드를 모듈로 사용합니다.
'웹개발(웹퍼블리셔) > 백엔드(Node.js)' 카테고리의 다른 글
Node.js 핵심 개념 논블로킹 I/O과 싱글 스레드 (0) | 2019.10.10 |
---|---|
Node.js 핵심 개념 이벤트 기반 (0) | 2019.10.09 |
(Node.js 교과서)쿠키와 세션 이해하기(1) (0) | 2019.08.29 |
(Node.js 교과서)http 모듈로 웹서버 만들기 (0) | 2019.08.22 |
(Node.js/노드)Console 과 Process (0) | 2019.08.11 |