ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠키와 세션
    Node.js 2021. 9. 24. 03:32

    클라이언트에서 요청을 보내게되면 한 가지 큰 단점이 존재한다.
    바로, 누가 보냈는지 모른다는 것이다. IP 주소나 브라우저의 정보를 받아올 수 있지만, 공통으로 IP 주소를 가지거나, 한 컴퓨터를 여러 사람이 사용할 수도 있다.

    이 문제에 대한 해답이 로그인이다.

    서버는 누구인지 기억하기 위해 요청에 대한 응답을 할 때 쿠키라는 것을 같이 보낸다.
    웹 브라우저는 서버로부터 쿠키가 오면 쿠키를 저장해두었다가 다음 요청할 때마다 쿠키를 동봉해서 보낸다.

    브라우저는 쿠키가 있다면 자동으로 보내주기 때문에, 우리는 서버에서 브라우저로 쿠키를 보내는 부분만 구현하면 된다.

     

     

    쿠키는 요청의 헤더에 담겨 전송된다.

    const http = require('http');
    
    http.createServer((req,res)=>{
        res.writeHead(200,{ 'Set-Cookie' : 'mycookie=test' });
        res.end('Hello Cookie');
    })
    .listen(8083,() => {
        console.log('8083번 포트에서 서버 대기 중입니다!');
    });

    쿠키는 문자열 형식으로 존재한다.

    • Set-Cookie 는 브라우저에게 다음과 같은 값의 쿠키를 저장하라는 의미이다.
      실제로 응답을 받은 브라우저는 mycookie=test라는 쿠키를 저장한다.

     

    const parseCookies = (cookie = '') =>
        cookie
        .split(';')
        .map(v => v.split('='))
        .reduce((acc,[k,v]) => {
        acc[k.trim()] = decodeURIComponent(v);
        return acc;
    },{});
    • 쿠키는 mycookie=test 같은 문자열이다.
    • 이를 쉽게 사용하기 위해 자바스크립트 객체 형식으로 바꾸는 함수이다.
    • 이 함수를 거치면 { mycookie : 'test' } 가 된다.
    • 즉 , parseCookies 함수가 문자열을 객체로 바꿔준다고만 알고 있으면 된다.

     

    http.createServer(async(req,res) => {
        const cookies = parseCookes(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);
            res.writeHead(302, {
                Location : '/',
                'Set-Cookie' : `name=${encodeURIComponent(name)}; Expires=${expires.toGMTString()}; HttpOnly; Path=/`,
            });
            res.end();
        }
    • 주소가 /login 으로 시작할 경우에는 url과 querystring 모듈로 각각 주소와 주소에 딸려오는 query를 분석합니다.
    • 302 응답 코드를 보내서 리다이렉트 주소와 쿠키를 헤더에 넣습니다.

     

    else if( cookies.name ){
            res.writeHead(200,{ 'Content-Type' : 'text/plain; charset=utf-8' });
            res.end(`${cookies.name}님 안녕하세요`);
        }else{
            try{
                const data = await fs.readFile('./cookie2.html');
                res.writeHead(200, { 'Content-Type' : 'text/html; charset=utf-8' });
                res.end(data);
            }catch(err){
                res.writeHead(500, { 'Content-Type' : 'text/plain; charset=utf-8'});
                res.end(err.message);
            }
        }
    })
    .listen(8084,() => {
        console.log('8084번 포트에서 서버 대기 중입니다.');
    });

     

    • 그 외 경우, 먼저 쿠키를 확인하여 페이지를 렌더링해줍니다.

     

    [ Set-Cookie 옵션 ]

    • 쿠키명=쿠키값 : 기본적인 쿠키의 값이다. 예를들어 mycookie=test 또는 name=youngjin
    • Expires=날짜 : 만료 기한이다. 이 기한이 지나면 쿠키가 제거된다.
    • Max-age=초 : Expires보다 우선되며 날짜 대신 초를 입력할 수 있다.
    • Domain=도메인명 : 쿠키가 전송될 도메인을 특정할 수 있다.
    • path=URL : 쿠키가 전송될 URL을 특정할 수 있다.
    • secure : HTTPS일 경우에만 쿠키가 전송 가능하다.
    • HttpOnly : 자바스크립트에서 쿠키에 접근할 수 없다. 즉, 쿠키 조작 방지

    Session은 쿠키에 이름 대신 uniqueInt라는 숫자 값을 보낸다. 사용자의 이름과 만료 시간은 uniqueInt 속성명 아래에 있는 session이라는 객체에 대신 저장한다.

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

    세션 아이디는 쿠키를 통해 전달하지 않아도 된다. 하지만, 쿠키를 사용하는 방법이 제일 간단하기 때문에 쿠키를 통해 전달하는데, 이러한 쿠키를 세션 쿠키라 한다.

     

     

    https://github.com/jin-Pro/Node_JS-/tree/master/HTTP/4-3

     

    GitHub - jin-Pro/Node_JS-

    Contribute to jin-Pro/Node_JS- development by creating an account on GitHub.

    github.com

     

    'Node.js' 카테고리의 다른 글

    cluster  (0) 2021.09.24
    HTTPs HTTP2  (0) 2021.09.24
    REST와 라우팅  (0) 2021.09.24
    Node.js - 요청과 응답  (0) 2021.09.24
    Node.js 교과서 - 이벤트 이해하기  (0) 2021.09.19

    댓글

Designed by Tistory.