*헤더와 본문*

  • 요청과 응답은 모두 헤더와 본문을 가지고 있습니다.

  • 헤더는 요청이나 응답에 대한 정보를 가지고 있습니다.

  • 본문은 서버와 클라이언트 간에 주고받을 실제 데이터를 담아두는 공간입니다. (쿠키는 부가적인 정보여서 헤더에 저장합니다.)

 

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 변수에서 사용자 정보를 가져와서 사용합니다.

  • 세션은 서버에 사용자 정보를 저장하고 클라이언트와는 세션 아이디로만 소통합니다.

  • 세션 아이디는 쿠키를 사용해서 주고 받지 않아도 됩니다.

  • 실제 배포용 서버에서는 세션을 보통 데이터베이스에 넣어둡니다.

  • 서비스를 만들 때마다 쿠키와 세션을 직접 구현할 수는 없습니다.

  • 그래서 다른사람들이 만든 검증된 코드를 모듈로 사용합니다.

+ Recent posts